<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Netlify on M1KE BL0G</title><link>https://www.m1ke.org/tags/netlify/</link><description>Recent content in Netlify on M1KE BL0G</description><generator>Hugo -- gohugo.io</generator><language>ja-jp</language><copyright>mike</copyright><lastBuildDate>Thu, 12 Nov 2026 18:46:00 +0900</lastBuildDate><atom:link href="https://www.m1ke.org/tags/netlify/index.xml" rel="self" type="application/rss+xml"/><item><title>セキュリティヘッダーを調べ直した</title><link>https://www.m1ke.org/p/%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%83%98%E3%83%83%E3%83%80%E3%83%BC%E3%82%92%E8%AA%BF%E3%81%B9%E7%9B%B4%E3%81%97%E3%81%9F/</link><pubDate>Thu, 12 Nov 2026 18:46:00 +0900</pubDate><guid>https://www.m1ke.org/p/%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%83%98%E3%83%83%E3%83%80%E3%83%BC%E3%82%92%E8%AA%BF%E3%81%B9%E7%9B%B4%E3%81%97%E3%81%9F/</guid><description>&lt;img src="https://www.m1ke.org/p/%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%83%98%E3%83%83%E3%83%80%E3%83%BC%E3%82%92%E8%AA%BF%E3%81%B9%E7%9B%B4%E3%81%97%E3%81%9F/sh.png" alt="Featured image of post セキュリティヘッダーを調べ直した" /&gt;&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;HTTPレスポンスに付けるセキュリティ系のヘッダーについて、断片的にしか理解していなかったので改めて調べ直した&lt;/li&gt;
&lt;li&gt;代表的な5つを中心に、それぞれ何を防いでいるのかを整理する&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="5つのセキュリティヘッダー"&gt;5つのセキュリティヘッダー&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ヘッダー&lt;/th&gt;
&lt;th&gt;役割&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CSP&lt;/td&gt;
&lt;td&gt;悪意のあるスクリプトを実行させない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HSTS&lt;/td&gt;
&lt;td&gt;HTTPS通信を強制して盗聴を防ぐ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;frame-ancestors&lt;/td&gt;
&lt;td&gt;偽サイトに画面を埋め込ませない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;X-Content-Type-Options: nosniff&lt;/td&gt;
&lt;td&gt;ファイルを勝手にプログラムとして解釈させない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Referrer-Policy&lt;/td&gt;
&lt;td&gt;閲覧していたURLなどの情報漏れを減らす&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="cspcontent-security-policy"&gt;CSP（Content-Security-Policy）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ページ内でスクリプト・スタイル・画像などを読み込んでよい取得元をホワイトリスト形式で指定するヘッダー&lt;/li&gt;
&lt;li&gt;主なディレクティブ&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ディレクティブ&lt;/th&gt;
&lt;th&gt;制限対象&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;script-src&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;実行してよいスクリプトの取得元&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;style-src&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;適用してよいスタイルの取得元&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;img-src&lt;/code&gt;・&lt;code&gt;connect-src&lt;/code&gt;・&lt;code&gt;font-src&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;画像・fetch通信・フォントの取得元&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;object-src 'none'&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Flash等のプラグインを無効化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;base-uri&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;base&amp;gt;&lt;/code&gt;タグで指定できるURLを制限&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;script-src&lt;/code&gt;にインラインスクリプトを許可しない設定にしておくと、攻撃者が入力フォームなどからscriptタグを注入できても実行されない、というのがXSS対策としての効果&lt;/li&gt;
&lt;li&gt;既存サイトに導入する場合、いきなり&lt;code&gt;Content-Security-Policy&lt;/code&gt;で強制するとレイアウト崩れを起こしやすいため、違反のみ記録する&lt;code&gt;Content-Security-Policy-Report-Only&lt;/code&gt;で様子を見てから本番適用するのが定石&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="hstshttp-strict-transport-security"&gt;HSTS（HTTP Strict Transport Security）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Strict-Transport-Security: max-age=31536000; includeSubDomains; preload&lt;/code&gt;のように指定&lt;/li&gt;
&lt;li&gt;一度このヘッダーを受け取ったブラウザは、指定期間（&lt;code&gt;max-age&lt;/code&gt;、秒単位）中は該当ドメインへの通信を常にHTTPSに置き換える&lt;/li&gt;
&lt;li&gt;効果があるのは「2回目以降のアクセス」で、初回アクセス時にHTTPで接続されてしまうと保護されない（この弱点を補うのがブラウザベンダー運営のpreloadリスト）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;includeSubDomains&lt;/code&gt;を付けるとサブドメインにも適用され、&lt;code&gt;preload&lt;/code&gt;はChromeなどに組み込まれているプリロードリストへの登録希望を示すフラグ&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="frame-ancestors"&gt;frame-ancestors&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;自分のページを&lt;code&gt;&amp;lt;iframe&amp;gt;&lt;/code&gt;や&lt;code&gt;&amp;lt;frame&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;object&amp;gt;&lt;/code&gt;で埋め込んでよい親ページの取得元を指定するCSPのディレクティブ&lt;/li&gt;
&lt;li&gt;古くは&lt;code&gt;X-Frame-Options&lt;/code&gt;（&lt;code&gt;DENY&lt;/code&gt;・&lt;code&gt;SAMEORIGIN&lt;/code&gt;・&lt;code&gt;ALLOW-FROM&lt;/code&gt;）という専用ヘッダーで同様のことをしていたが、複数オリジンを許可できないなど柔軟性に欠けるため、現在はCSPの&lt;code&gt;frame-ancestors&lt;/code&gt;に統合されている&lt;/li&gt;
&lt;li&gt;これを設定していないと、自サイトを透明なiframeで覆われて別サイトのボタンだと思わせてクリックさせる「クリックジャッキング」を防げない&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="x-content-type-options-nosniff"&gt;X-Content-Type-Options: nosniff&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ブラウザは&lt;code&gt;Content-Type&lt;/code&gt;が曖昧だったり省略されていたりすると、実際のバイト列を見て種類を推測する「MIMEスニッフィング」という挙動を持つ&lt;/li&gt;
&lt;li&gt;この挙動を悪用すると、&lt;code&gt;Content-Type: text/plain&lt;/code&gt;で配信しているはずのファイルが、中身次第でHTMLやJavaScriptとしてブラウザに解釈されてしまうことがある&lt;/li&gt;
&lt;li&gt;&lt;code&gt;X-Content-Type-Options: nosniff&lt;/code&gt;を付けると、このスニッフィングを無効化し、サーバーが宣言した&lt;code&gt;Content-Type&lt;/code&gt;どおりにのみ扱わせられる&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="referrer-policy"&gt;Referrer-Policy&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ページ遷移やサブリソース取得の際にブラウザが送る&lt;code&gt;Referer&lt;/code&gt;ヘッダー（直前にいたページのURL）の送り方を制御する&lt;/li&gt;
&lt;li&gt;主な値&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;値&lt;/th&gt;
&lt;th&gt;挙動&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;no-referrer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;一切送らない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;same-origin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;同一オリジンへの遷移時のみ送る&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;strict-origin-when-cross-origin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;クロスオリジンへはオリジンのみ送り、HTTPSからHTTPへのダウングレード時は送らない（多くのブラウザの現在のデフォルト）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Referer&lt;/code&gt;にトークン付きのURLやユーザー固有のパスが含まれていると、リンク先の第三者サイトにその情報がそのまま渡ってしまうため、指定しておく意味がある&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="自分のサイトでの設定状況"&gt;自分のサイトでの設定状況&lt;/h2&gt;
&lt;p&gt;実際にm1ke.orgへ&lt;code&gt;curl&lt;/code&gt;でアクセスして、レスポンスヘッダーを確認してみた。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -s -D - -o /dev/null https://www.m1ke.org/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;HTTP/2 200
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;strict-transport-security: max-age=31536000
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;server: Netlify
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;HSTSはNetlifyがデフォルトで付与しており、既に有効になっていた&lt;/li&gt;
&lt;li&gt;CSP・frame-ancestors・X-Content-Type-Options・Referrer-Policyはいずれも未設定&lt;/li&gt;
&lt;li&gt;Netlifyでは&lt;code&gt;netlify.toml&lt;/code&gt;に&lt;code&gt;[[headers]]&lt;/code&gt;セクションを追加するか、&lt;code&gt;static/_headers&lt;/code&gt;ファイルを置くことでレスポンスヘッダーをカスタマイズできるので、必要であれば次はそちらを設定する&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;CSP・HSTS・frame-ancestors・X-Content-Type-Options・Referrer-Policyの5つは、いずれも「ブラウザに対して追加の制約を指示する」という共通点を持つヘッダーで、XSS・盗聴・クリックジャッキング・MIMEスニッフィング・リファラ経由の情報漏れといった、それぞれ異なる攻撃経路に対応している&lt;/li&gt;
&lt;li&gt;自分のサイトではHSTS以外はまだ未設定だったので、静的サイトであることも踏まえて優先度の高いものから&lt;code&gt;netlify.toml&lt;/code&gt;で追加を検討したい。&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>