「ウェブサイトの鍵」を最強にする:CSPでXSSを封じ込める防犯術
こんにちは!セキュリティの世界へようこそ。
Web開発を始めると必ず耳にする「XSS(クロスサイトスクリプティング)」。これ、名前は難しそうですが、仕組みを理解すれば怖くありません。今日は、この泥棒を追い出すための最強の防犯ツール「CSP(Content-Security-Policy)」について、身近な例えを交えながら一緒に学んでいきましょう。
1. XSSって、結局どんな泥棒なの?
まずは敵を知りましょう。XSSとは、「あなたのWebサイトに、知らない間に変なスクリプト(命令文)を紛れ込ませる攻撃」のことです。
これを「家」で例えてみますね。
あなたのWebサイトという「家」には、訪問者が自由に書き込める「掲示板」という玄関先があります。そこに泥棒がやってきて、掲示板に「このボタンを押すと、家主の秘密の金庫を開ける鍵を盗む」という悪魔の書き込みをしたとします。
もし、そのページを訪れた人がそのボタンを押してしまったら……泥棒はあなたのサイトを利用して、訪問者の大事な情報を盗み出してしまうのです。これがXSSの正体です。
2. 「CSP」は、家の入口に置く最強のガードマン
この泥棒を物理的に防ぐにはどうすればいいでしょう?「怪しい書き込みを全部消す」のも大切ですが、それだけでは防ぎきれないこともあります。
そこで登場するのがCSP(Content-Security-Policy)です。これは、ブラウザ(閲覧者の家)に対して、「この家では、許可された道具以外は一切使わせない!」と宣言する「ガードマン」のような役割を果たします。
たとえ泥棒が掲示板に怪しいスクリプトを書いても、CSPが「お前、許可リストに載ってないな? 動かすんじゃない!」と、ブラウザ側で実行を拒否してくれるんです。
3. まずはこれだけ!CSPの基本ディレクティブ
CSPを設定するには、Webサーバーからブラウザへ送るレスポンスヘッダーに、特定のルールを記述します。初心者の方がまず押さえるべきは以下の2つです。
script-src:誰のプログラムなら動かしていい?
「信頼できるソース」以外からのスクリプトを一切禁止します。
object-src:怪しいプラグインを禁止する
Flashなどの古いプラグインを悪用した攻撃を防ぎます。基本は none(一切禁止)にするのが鉄則です。
—
4. 実践!安全なCSP設定例
では、具体的にどんな設定を書けばいいのか見てみましょう。以下の設定をWebサーバーのヘッダーに追加するだけで、セキュリティレベルが格段に上がります。
HTTPヘッダーの設定例
Content-Security-Policy: default-src ‘self’; script-src ‘self’ https://trusted.cdn.com; object-src ‘none’;
この設定の「意味」を翻訳してみますね。
default-src 'self': 基本的に、自分のサイト(同じドメイン)にあるものだけを読み込む。script-src 'self' https://trusted.cdn.com: プログラム(JS)は「自分のサイト」または「信頼しているCDN(例:Googleのライブラリなど)」のものだけ動かしていいよ。object-src 'none': プラグインは一切使わせない。これが一番安全!
—
5. 運用で失敗しないための「一歩ずつ」の進め方
いきなり厳格な設定を導入すると、今まで動いていた機能が突然止まってしまうことがあります。まずは以下のステップで進めてみてください。
1. Report-Onlyモードで試す:
Content-Security-Policy-Report-Only というヘッダーを使うと、「もしこのルールを適用したら、何が弾かれるか」をレポートとして収集できます。サイトを壊さずに安全性を確認できる便利な機能です。
2. インラインスクリプトを避ける:
HTMLの中に直接 と書くのは、泥棒にとって好都合です。なるべくJSファイルとして外部化し、CSPの許可リストで管理しましょう。
3. 少しずつ厳しくする:
まずは self(自分自身)だけを許可し、どうしても必要な外部サービスがある場合だけ、そのドメインを一つずつ追加していくのがコツです。
最後に:完璧なセキュリティはない、だからこそ「多層」で守る
CSPは非常に強力ですが、これだけで全てが解決するわけではありません。入力値のチェックやサニタイズ(無害化)といった「基本の防犯対策」を怠らないことが大前提です。
セキュリティは、家を守るのと同じです。
「鍵をかける」「窓を閉める」「ガードマンを置く」。これらを組み合わせることで、初めて泥棒は「この家には手を出さないほうがいいな」と諦めます。
まずは今日から、CSPという「最強のガードマン」をあなたのサイトに雇い入れてみませんか?一歩ずつ、安全なWebの世界を作っていきましょう!
—
執筆:現場を知り尽くしたセキュリティエンジニアより
コメント