【入門編】Content-Security-Policy(CSP)によるスクリプト実行制限の設計 – アプリケーションセキュリティ & 安全な開発防御ガイド

なぜWebサイトは「鍵」をかけても泥棒に入られるのか?

こんにちは。現場でセキュリティと格闘し続けているエンジニアです。

皆さんは、自分の家や部屋の「防犯」についてどう考えていますか?おそらく、玄関にしっかりした鍵をかけ、窓を閉め、必要なら防犯カメラを設置するでしょう。

Webアプリケーションの世界も同じです。しかし、驚くべきことに、多くの開発現場では「玄関の鍵」には必死なのに、「家の中に泥棒が紛れ込んだあとの対策」を忘れてしまっています。これが、世の中のWebサイトが次々とXSS(クロスサイト・スクリプティング)という攻撃で被害に遭う最大の理由です。

今日は、その「侵入されたあとの最強の防波堤」であるCSP(Content-Security-Policy)について、専門用語を抜きにして、身近な例えを交えながら一緒に紐解いていきましょう。

—

1. そもそも「XSS」って何?:泥棒の巧妙な手口

Web開発の現場でよく聞く「XSS(クロスサイト・スクリプティング)」という攻撃。これは、「悪意のある他人が、あなたのサイトの中に『偽のスクリプト(命令書)』をこっそり紛れ込ませる行為」です。

想像してみてください。あなたは信頼できる「掃除業者」を家に招き入れました。でも、実はその業者が偽物で、部屋のあちこちに「住人の財布を盗め」という指示書(スクリプト)をペタペタと貼り付けたとしたら? 住人は何も知らずにその指示に従い、財布(個人情報やログイン情報)を差し出してしまう。これがXSSのメカニズムです。

従来の対策(サニタイズなど)は、「偽の業者を入れない」ためのチェックでした。でも、今のWebサイトは複雑で、どこからどんなスクリプトが混入するか、完全に防ぎきるのは至難の業です。

そこで登場するのがCSP(コンテンツ・セキュリティ・ポリシー)です。

—

2. CSPは「許可された人以外、喋らせない」防犯システム

CSPを一言で言うと、「サイト内で『誰の書いたメモ(スクリプト)』なら実行していいかを、ブラウザに厳しく指示するヘッダー」のことです。

たとえ泥棒が侵入して「財布を盗め!」というメモを壁に貼ったとしても、ブラウザが「そのメモは私の信頼するリストにないから、絶対に見ないし実行もしない!」と拒否してくれたら、被害は発生しません。

これがCSPの最大の強みです。

—

3. 実践!CSPを設定してみよう

では、実際にどうやって設定するのでしょうか。サーバーの設定ファイルや、Webサーバーのレスポンスヘッダーに以下のような文字列を追加するだけです。

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;
  • 「特にスクリプトについては、自分のサーバーか、この信頼できるパートナー(cdn.com)が配信しているもの以外は絶対に実行しちゃダメ!」という強力な制限です。
  • object-src 'none';
  • 「Flashなどの古くて脆弱なプラグインは一切禁止!」という、現代の鉄則です。

⚠️ ここがポイント:なぜ「インラインスクリプト」を禁止するのか

よくある攻撃手法に、HTMLの中に直接 と書き込むものがあります。CSPではこれを防ぐために、unsafe-inline を許可しないのが基本戦略です。

「HTMLの壁に直接書き込まれたメモは、どんなに怪しくなくても実行しない!」と決めることで、泥棒が書き込める場所を物理的に奪うのです。

—

4. 導入の現場Tips:いきなり厳しくするとサイトが壊れる!

「じゃあ今すぐ最高に厳しい設定を入れよう!」と思うかもしれませんが、ちょっと待ってください。いきなり最強の鍵をかけると、今まで動いていた正常な機能まで「不審な動きだ!」とブラウザが誤解してブロックし、サイトが真っ白になることがあります。

現場では、まず「報告モード」から始めるのが鉄則です。

ブロックはせず、違反があったらサーバーに報告だけ送ってくれるモード
Content-Security-Policy-Report-Only: default-src ‘self’; report-uri /csp-violation-report-endpoint;

このように Report-Only を使うことで、今のサイトのどこがルールに違反しているかをログで確認しながら、少しずつ安全な設定に書き換えていくことができます。

—

最後に:一歩ずつ、「ゼロトラスト」な世界へ

セキュリティの現場では、「自分たちのサイトは完璧だ」という思い込みが一番の脆弱性になります。

CSPを設定することは、サイトに「絶対的なルール」という規律を与えることと同じです。最初は難しく感じるかもしれませんが、一度ルールを決めてしまえば、泥棒がどんなに巧妙な手口を使おうとも、あなたのサイトは「許可されたものしか動かない」という強固な城壁を守り抜くことができます。

まずは今日の帰り道、自分のサイトのHTTPヘッダーを確認してみてください。そこからあなたの「Webサイトの防犯」が始まります。一歩ずつ、一緒に強固なWebサービスを作っていきましょう!

コメント

タイトルとURLをコピーしました