最終更新
リンドくん
たなべ先生、Webサイトで「このスクリプトは実行できません」ってエラーが出たんですけど、これってなんですか?
たなべ
それはおそらくContent Security Policy(CSP)が働いているね。
CSPは悪意のあるスクリプトからWebサイトを守るための重要なセキュリティ機能なんだよ。今日はその仕組みをしっかり学んでいこう!
Webサイトを作成していると、セキュリティという言葉を頻繁に耳にするのではないでしょうか。
その中でも特に重要なのがXSS(クロスサイトスクリプティング)攻撃への対策です。
Content Security Policy(CSP)は、このXSS攻撃を効果的に防ぐための強力なセキュリティ機構です。
この記事では、セキュリティ学習を始めたばかりの方でも理解できるよう、CSPの基本概念からスクリプト制限の実装方法まで、段階的にわかりやすく解説していきます。
HackATAは、エンジニアを目指す方のためのプログラミング学習コーチングサービスです。 経験豊富な現役エンジニアがあなたの学習をサポートします。
✓ 質問し放題
✓ β版公開中(2025年内の特別割引)
リンドくん
Content Security Policyって、具体的にどんな仕組みなんですか?
たなべ
簡単に言うと、「どこから読み込まれたスクリプトなら実行していいか」をブラウザに指示する仕組みなんだ。
これによって、攻撃者が勝手に埋め込んだ悪意のあるスクリプトの実行を防げるんだよ。
Content Security Policy(CSP)は、Webページ上で実行可能なリソースの読み込み元を制限するセキュリティ機構です。
HTTPヘッダまたはHTMLのmetaタグを通じてブラウザに指示を送ります。
CSPが解決する主な問題は以下の通りです。
特筆すべきは、CSPがブラウザ側で動作する防御機構であるという点です。サーバー側だけでなく、クライアント側でも多層的な防御を実現できます。
Webアプリケーションにおいて、ユーザー入力を適切にサニタイズ(無害化)することは基本中の基本です。しかし、人間が作るコードに完璧はありません。
例えば、以下のようなケースでXSS攻撃が成立してしまう可能性があります。
攻撃者がnameパラメータに<script>alert('XSS')</script>を渡すと、そのスクリプトが実行されてしまいます。
CSPを導入すると、たとえこのようなコードの不備があったとしても、インラインスクリプトの実行自体をブラウザがブロックしてくれるのです。これは、セキュリティの「多層防御」の考え方に基づいた、非常に有効な対策と言えます。
CSPは、サーバーからブラウザへHTTPレスポンスヘッダとして送信されます。
この指示を受け取ったブラウザは、以下のルールに従ってスクリプトの実行を制御します。
この仕組みにより、開発者が意図しないスクリプトの実行を効果的に防ぐことができます。
リンドくん
実際にCSPを設定するには、どうすればいいんですか?
たなべ
設定方法は主に2つあるんだ。HTTPヘッダで設定する方法と、HTMLのmetaタグで設定する方法。
それぞれ見ていこうか。
最も推奨される方法は、HTTPレスポンスヘッダでCSPを設定することです。
Apacheの場合(.htaccessまたはhttpd.conf)Node.js(Express)の場合
PHPの場合
HTTPヘッダが設定できない環境では、HTMLのmetaタグでも設定可能です。
ただし、metaタグ方式には以下の制限があります。
可能な限り、HTTPヘッダでの設定を推奨します。
CSPの中でも、スクリプト制限に関わる最重要ディレクティブがscript-srcです。
基本的な指定方法
よく使うソース指定
実用的な設定例
この設定では、以下のスクリプトが許可されます。
逆に、以下のようなスクリプトはブロックされます。
リンドくん
'unsafe-inline'って使っちゃダメなんですか?便利そうなんですけど...
たなべ
確かに便利だけど、これを許可するとXSS攻撃のリスクが大幅に上がるんだ。
代わりに、より安全なnonceやハッシュ方式を使うことを強く推奨するよ。
nonce(ナンス)は、一度だけ使用されるランダムな値で、特定のインラインスクリプトを安全に実行する仕組みです。
サーバー側でnonceを生成
HTML側でnonceを使用
nonce方式の重要なポイントは以下の通りです。
ハッシュ方式は、スクリプトの内容のハッシュ値を事前に計算し、CSPに登録する方法です。
スクリプトのハッシュ値を計算
出力例:
CSPヘッダにハッシュを設定
HTMLでスクリプトを使用
このスクリプトは、内容が完全に一致するため実行が許可されます。
ハッシュ方式の特徴は以下の通りです。
'strict-dynamic'は、CSP Level 3で導入された強力な機能です。
この設定により、以下のような挙動になります。
実用例
理想的には、GTMをnonce方式で管理します。
すべてのCDNをホワイトリストに追加するのではなく、以下を検討してください。
nonce方式またはstrict-dynamicの活用を検討してください。
リンドくん
CSPって思ったより奥が深いですね!でも、これでWebサイトのセキュリティがグッと上がりそうです。
たなべ
その通り!CSPはXSS攻撃への強力な防御壁になるんだ。
最初は大変かもしれないけど、一度設定すれば長期的にサイトの安全性を高められるよ。ぜひ実践してみてね!
この記事では、Content Security Policy(CSP)によるスクリプト制限について、基本から実践的な導入方法まで解説してきました。
重要なポイントをおさらいしましょう。
CSPはWebセキュリティにおいて多層防御の一翼を担う重要な技術です。
サーバー側でのサニタイズと組み合わせることで、より堅牢なWebアプリケーションを構築できます。
ぜひ、自分のプロジェクトでCSPを導入してみてください。最初は緩めのポリシーから始めて、徐々に厳格化していくアプローチがおすすめです。