セキュリティヘッダーを1つだけ設定するなら、Content-Security-Policy(CSP)を選びます。理由は、他のヘッダーがそれぞれ特定の攻撃手口に対応するのに対して、CSPは埋め込まれたコードが実行される段階を広く押さえられるためです。
セキュリティヘッダーとは何か
セキュリティヘッダーとは、Webサーバーがブラウザに対して「このページはこういうルールで扱ってください」と伝える指示書のようなものです。HTMLの中身とは別に、通信の中で一緒に送られています。画面には表示されません。設定していなくてもページは普通に表示されるため、見た目では違いが分かりません。だからこそ、対応しているサイトとしていないサイトの差が表に出にくく、後回しにされがちです。
CSPが防ぐのは「勝手に埋め込まれたコード」
Webサイトが乗っ取られる典型的な流れの一つに、フォームの入力欄やコメント欄、あるいは管理画面の脆弱性を通じて、第三者のJavaScriptがページに埋め込まれるというものがあります。埋め込まれたコードは、訪問者が入力したクレジットカード情報やログイン情報をこっそり別のサーバーに送信したり、偽の広告やポップアップを表示したりします。サイトの持ち主が気づかないまま、訪問者だけが被害に遭うケースも珍しくありません。
CSPは、「このページで実行してよいJavaScriptはこれだけ」というルールをブラウザに伝えます。ルールで許可していないスクリプトは、たとえページの中に埋め込まれても、ブラウザが実行を拒否します。ただしこれは、ページに直接書き込まれたインラインスクリプトを無条件に許可しない設定(nonceやhashで実行を許可するコードを限定する運用)になっていることが前提です。この前提が整っていれば、攻撃者がコードを埋め込むこと自体は防げなくても、そのコードが実際に動いて被害を出す手前で止められる可能性が高まります。
CSPが効果を発揮しない条件もある
1つ目は、CSPの設定が緩いと意味をなさないことです。「どこからでも読み込んでよい」に近いルールにしてしまうと、防御としてはほぼ機能しません。逆に厳しくしすぎると、外部の解析ツールや埋め込み動画など、正規の機能まで止まってしまいます。サイトで実際に使っている外部サービスを洗い出した上で、必要な範囲だけを許可する調整が必要で、設置して終わりにはなりません。
2つ目は、CSPが対応できるのはあくまで「ブラウザ上で実行されるコード」に関する問題だという点です。サーバー側のプログラムの脆弱性を突かれてデータベースそのものを盗まれる、といった被害はCSPの守備範囲の外にあります。この種の被害の起きやすさは、サイトがどんな仕組みで動いているかによっても変わります。セキュリティのページでは、ホームページの乗っ取りがなぜ起きるのか、構成の違いによって安全性がどう変わるのかについて書いています。
他のヘッダーは何をしているのか
参考までに、よく名前が挙がる他のヘッダーの役割を短く挙げておきます。
- Strict-Transport-Security:通信を必ず暗号化された経路(https)で行わせる
- X-Content-Type-Options:ブラウザがファイルの種類を誤って解釈するのを防ぐ
- X-Frame-Options:自分のサイトが他のサイトの中に勝手に埋め込まれるのを防ぐ
- Referrer-Policy:どのページから来たかという情報の送りすぎを防ぐ
どれも特定の攻撃手口の成立自体を防ぐ、明確な役割を持っています。その中でCSPは、埋め込まれたコードの実行を広い範囲で押さえられる点で、守備範囲が広いと言えます。複数設定できるなら全部入れるのが望ましく、1つに絞る場面は、時間やコストの制約で優先順位をつけざるを得ないときに限られます。
まとめ
1つだけ選ぶならCSPですが、これは「設定すれば安心」という魔法の設定ではありません。サイトが使っている外部サービスを把握し、必要な範囲だけ許可するという地道な調整があって初めて機能します。逆に言えば、その調整にかける手間を惜しまないなら、数あるセキュリティヘッダーの中でも投資対効果の高い1つだと言えます。