あなたのWebサイト、知らない誰かに「合鍵」を渡していませんか?〜CSPとstrict-dynamicで守るXSS対策〜
こんにちは!日々セキュリティの最前線で戦っているエンジニアの皆さん、そしてこれからWebの世界を守る一歩を踏み出す皆さん。
今日は、Webセキュリティの永遠のテーマ「XSS(クロスサイトスクリプティング)」と、それを根本から封じ込めるための魔法の盾「CSP(コンテンツ・セキュリティ・ポリシー)」についてお話しします。特に、最近のモダンな開発現場で欠かせない「strict-dynamic」というキーワードを、身近な例えで紐解いていきましょう。
—
1. XSSって、結局どんな「泥棒」なの?
XSSを一番わかりやすく例えると、「あなたの家のセキュリティをすり抜けて、勝手に合鍵を作ってしまう泥棒」です。
Webサイトにおいて、ブラウザは「このサイトから読み込まれたスクリプトなら、何をやってもいいよ」と信頼しています。もし攻撃者が、掲示板のコメント欄やURLパラメータに悪意あるコードを仕込み、あなたのサイトがそれを「信頼できるスクリプト」として実行してしまったら……。
攻撃者は、あなたのサイトの裏側で、ユーザーのCookieを盗んだり、勝手にパスワード変更画面を表示させたりと、やりたい放題です。これがXSSの恐ろしさです。
—
2. CSP:最強の「身元確認ゲート」
この泥棒を防ぐために登場するのがCSP(Content Security Policy)です。
これまで、多くのサイトでは「どのスクリプトを読み込めるか」を一つずつホワイトリスト形式で指定していました。でも、これがめちゃくちゃ大変なんです。「Google AnalyticsはOK、広告タグはOK、あ、その広告が読み込む別のタグは……?」とやっているうちに、リストが長すぎてメンテナンス不能になるのがオチです。
そこで登場したのが、'strict-dynamic' です。
「strict-dynamic」の魔法
strict-dynamicを一言でいうと、「信頼できる人が連れてきた友達なら、その人も信頼するよ」という仕組みです。
例えば、最初に読み込んだ「メインの信頼済みスクリプト(A)」が、動的に「別のスクリプト(B)」を呼び出したとします。strict-dynamicがあれば、「Aが読み込んだんだから、Bも安全だよね」とブラウザが自動的に判断して実行を許可してくれます。これにより、複雑なホワイトリスト地獄から解放されるわけです。
—
3. 実践!CSPの設定を書いてみよう
では、実際にどのようにHTTPヘッダーを設定すればいいのか見てみましょう。
Content-Security-Policy: script-src ‘nonce-rAnd0m123’ ‘strict-dynamic’; object-src ‘none’; base-uri ‘none’;
設定のポイント
'nonce-rAnd0m123': これが「信頼のパスポート」です。サーバー側でリクエストのたびに生成したランダムな文字列を、のように埋め込みます。これがないスクリプトは、たとえサイト内にあっても実行されません。'strict-dynamic': これを書くことで、「このパスポート(nonce)を持ったスクリプトが生成した子スクリプト」も自動的に許可されます。object-src 'none': Flashのような古い技術を無効化します。泥棒の侵入口を物理的に塞ぐイメージです。
---
4. 「古いブラウザ」への配慮も忘れずに
「strict-dynamicって最新の機能でしょう?古いブラウザを使っているユーザーはどうなるの?」と心配になりますよね。ご安心ください。CSPは、後ろに書いた設定ほど無視される(前方互換性)という性質があります。
古いブラウザはstrict-dynamicという言葉の意味がわからず無視しますが、代わりにホワイトリストの設定を読んでくれます。
モダンブラウザはstrict-dynamicを使い、古いブラウザはホワイトリスト(https:など)を使う
Content-Security-Policy: script-src 'nonce-rAnd0m123' 'strict-dynamic' https: 'unsafe-inline';
このように書いておけば、
1. モダンブラウザ:「strict-dynamicがある!よし、これで運用しよう」
2. 古いブラウザ:「strict-dynamic?何それ知らない。あ、その後のhttps:なら知ってるから、httpsから始まるスクリプトだけ許可しよう」
というように、安全性を維持しながら幅広い環境で動かすことができるのです。
---
最後に:完璧を目指さず、強固な層を作ろう
セキュリティに「これで絶対安心」というゴールはありません。しかし、strict-dynamicを活用したCSPは、現代のWeb開発において最もコストパフォーマンスの高い「防犯対策」の一つです。
最初は難しく感じるかもしれませんが、まずは「自分のサイトのスクリプトを把握する」ことから始めてみてください。一歩ずつ、泥棒が侵入できない強固なWebサイトを一緒に作っていきましょう!
何か分からないことがあれば、いつでも質問してくださいね。応援しています!
コメント