CSPとは?Content Security Policyの仕組みを解説

CSPとは「Content Security Policy」の略で、WebページがどのJavaScript・CSS・画像・iframeなどを読み込んでよいかをブラウザへ指示するセキュリティ機能です。

特にクロスサイトスクリプティング(XSS)などで悪意あるJavaScriptを埋め込まれた場合に、そのコードが実行される範囲を制限する追加防御として使われます。 ただし、設定を厳しくしすぎると正常なスクリプトや画像まで止まるため、いきなり本番で強制せず、Report-Onlyで確認しながら導入するのが基本です。

30秒でわかる結論

  • CSPは、Webページが読み込めるリソースや実行できるスクリプトを制限する仕組み
  • 主にHTTPレスポンスヘッダーContent-Security-Policyで設定する
  • XSSなどの被害を小さくする追加防御として有効
  • default-srcは多くのリソース種別の基本ルールを決める
  • script-srcはJavaScriptの読み込み・実行元を制御する
  • 強いCSPではnonceまたはhashを使って許可するスクリプトを限定する
  • 'unsafe-inline'を安易に許可するとCSPの効果が弱くなる
  • 導入前はContent-Security-Policy-Report-Onlyで違反を確認する
  • CSPだけで脆弱性そのものが消えるわけではない
  • WordPressではテーマ・プラグイン・広告・解析タグとの互換性確認が必要

CSPとは?

CSPは、ブラウザに「このページでは、どこから読み込んだスクリプト・画像・CSSなどを許可するか」を伝えるセキュリティポリシーです。

一言でいうと

CSP=Webページが読み込んでよい外部・内部リソースをブラウザ側で制限する仕組みです。

W3CのContent Security Policy Level 3では、ページが取得・実行できるリソースや、セキュリティ上重要な動作を開発者が制御する仕組みとして定義されています。

CSPは何を防ぐために使う?

CSPは特に、クロスサイトスクリプティング(XSS)の被害を抑える追加防御として重要です。

考え方

攻撃者がページ内へ不正なJavaScriptを挿入
↓
CSPが「許可されたスクリプトではない」と判断
↓
ブラウザが実行を拒否

ただし、CSPはXSS脆弱性そのものを修正する機能ではありません。 入力値のエスケープや安全な実装を行ったうえで、さらに被害を抑えるための防御層として使います。

CSPだけに頼らない

脆弱なコードを放置してCSPだけ設定するのではなく、アプリ側の脆弱性修正と組み合わせてください。

CSPはどこに設定する?

一般的には、Webサーバーが返すHTTPレスポンスヘッダーへ設定します。

最小例

Content-Security-Policy: default-src 'self'

この例では、多くのリソースについて「原則として自分自身のオリジンから読み込む」という基本ルールを指定します。

CSPはHTMLのmeta要素でも一部設定できますが、HTTPヘッダーでしか使えない機能もあります。 本格的な運用ではレスポンスヘッダーでの設定が分かりやすいです。

CSPの基本的な書き方

CSPは「ディレクティブ」と「許可する値」を組み合わせて記述します。

ディレクティブ 許可する値; ディレクティブ 許可する値;

例

Content-Security-Policy:
  default-src 'self';
  img-src 'self' https:;
  script-src 'self';

この例では、基本は自サイトのみを許可し、画像だけHTTPSの外部URLも許可しています。

default-srcとは?

default-srcは、多くのリソース種別に対する基本の読み込み元を指定するディレクティブです。

例

Content-Security-Policy: default-src 'self'

個別のscript-srcやimg-srcなどが指定されていない場合、対応するリソースではdefault-srcがフォールバックとして使われます。

最初の土台

CSPを考えるときは、まずdefault-srcで基本方針を作り、必要なリソースだけ個別ディレクティブで許可する考え方が分かりやすいです。

script-srcとは?

script-srcは、JavaScriptの読み込み・実行に関する制御を行う重要なディレクティブです。

自サイトのスクリプトだけ許可

Content-Security-Policy:
  script-src 'self';

外部の解析タグや広告、CDNなどを使うサイトでは、そのサービスに必要な読み込み元やnonce・hashなどを設計する必要があります。

外部ドメインを片っ端から追加しない

動かないたびに許可先を増やすと、CSPが広くなりすぎて防御効果が弱くなります。 本当に必要なスクリプトか確認してから許可してください。

‘self’とは?

'self'は、そのページと同じオリジンのリソースを許可するキーワードです。

例

ページ:https://example.com/
'self' → 基本的に同じオリジンのリソースを許可

「自分のサイトなら全部安全」という意味ではありません。 自サイト内へ不正ファイルをアップロードされた場合など、別の対策も必要です。

nonceとは?

nonceは、レスポンスごとにランダムな値を生成し、その値を持つスクリプトだけ実行を許可する方法です。

CSPヘッダー例

Content-Security-Policy:
  script-src 'nonce-ランダムな値';

HTML側

<script nonce="ランダムな値">
  // 許可する処理
</script>

ブラウザはCSP側とHTML側のnonceが一致したスクリプトだけを実行します。

nonceは毎レスポンス変える

MDNでは、nonceは予測不可能で、HTTPレスポンスごとに新しい値を生成する必要があると説明されています。 固定値を使い回してはいけません。

hashとは?

hash方式では、許可したいスクリプト内容のハッシュ値をCSPへ登録します。 ブラウザ側で実際のスクリプトをハッシュ化し、一致した場合だけ実行を許可します。

概念例

Content-Security-Policy:
  script-src 'sha256-...';

MDNでは、SHA-256・SHA-384・SHA-512などを利用する方法が案内されています。

nonceとhashの使い分け

動的にページを生成できるならnonce、内容が固定されたスクリプトならhashが使いやすい場合があります。

‘unsafe-inline’とは?

'unsafe-inline'は、インラインJavaScriptやインラインCSSを広く許可するために使われる値です。

安易に追加しない

インラインスクリプトを広く許可すると、CSPによるXSS対策効果が弱くなります。 「動かないからとりあえず追加する」という使い方は避けてください。

MDNの実装ガイドでも、可能であればnonceやhashを使ったstrict CSPが推奨されています。

object-src ‘none’とは?

object-srcは、objectやembedなどの埋め込みリソースを制御するディレクティブです。

例

object-src 'none'

現在使っていない埋め込み方式を明示的に禁止することで、攻撃面を減らせます。 MDNのstrict CSP例でもobject-src 'none'が使われています。

base-uri ‘none’とは?

base-uriは、HTMLのbase要素で指定できる基準URLを制御します。

例

base-uri 'none'

base要素を使わないサイトなら、'none'で禁止する考え方があります。 strict CSPの代表例でも利用されています。

img-src・style-src・font-srcとは?

ディレクティブ 主な対象
img-src 画像
style-src CSS
font-src Webフォント
connect-src fetch・XHR・WebSocket等
frame-src iframe内へ読み込むページ

Google Fonts、YouTube埋め込み、アクセス解析、地図、外部APIなどを使っているサイトでは、該当ディレクティブへ必要な接続先を設定します。

CSPを設定するとサイトが壊れることがある?

あります。

現在のサイトが外部JavaScript、インラインスクリプト、外部フォント、iframeなどを利用している場合、CSPを急に厳しくすると正常なリソースまでブロックされます。

止まりやすいもの

  • アクセス解析タグ
  • 広告タグ
  • チャットツール
  • YouTube埋め込み
  • Google Maps
  • 外部Webフォント
  • 決済サービス
  • WordPressテーマのインラインJavaScript

本番へ一発適用しない

特にWordPressではテーマ・プラグインが多くの外部リソースやインライン処理を使うことがあります。 先にReport-Onlyで影響を確認してください。

Content-Security-Policy-Report-Onlyとは?

Report-Onlyは、CSP違反を実際にはブロックせず、「この設定なら何が違反になるか」を確認するためのモードです。

例

Content-Security-Policy-Report-Only:
  default-src 'self';

この状態ならポリシー違反があってもリソースは原則としてそのまま動作し、ブラウザの開発者ツールやレポート先で違反を確認できます。

導入はReport-Onlyから

MDNでも、実際に強制するCSPを導入する前にReport-Onlyでテストする方法が推奨されています。

CSP違反はどう確認する?

CSPによってリソースがブロックされると、ブラウザの開発者ツールのConsoleにエラーや警告が表示されます。

確認の流れ

  • ブラウザの開発者ツールを開く
  • Consoleを確認する
  • CSP違反メッセージを探す
  • どのディレクティブでブロックされたか確認する
  • 本当に必要なリソースだけ許可する

エラーが出たからといって、最初から*や'unsafe-inline'で広く許可しないことが重要です。

CSPレポートを送信する仕組み

CSPでは、違反内容をサーバー側へ送信して収集する仕組みも利用できます。

MDNでは現在、Reporting APIとreport-toを使う方法が推奨されています。 一方、ブラウザ互換性の都合から従来のreport-uriも併用が必要になるケースがあります。

会社サイトでは違反監視にも使える

CSPレポートを収集すると、設定ミスだけでなく、想定外のスクリプトが実行されようとしている兆候を把握できる場合があります。

WordPressでCSPを使うときの注意点

WordPressは、テーマ・プラグイン・ブロック・外部サービスによって読み込むリソースが増えやすいため、CSP設計が複雑になりやすい環境です。

事前確認

  • テーマがインラインJavaScriptを使っていないか
  • SEO・解析プラグインが外部スクリプトを読み込んでいないか
  • 広告タグを使っていないか
  • Google Maps・YouTube等を埋め込んでいないか
  • 外部CDN・フォントを使っていないか
  • 問い合わせ・決済サービスの外部通信がないか

コピペCSPをそのまま使わない

別サイト用のCSPをそのまま貼ると、自サイトで必要なスクリプトやCSSが止まる可能性があります。 実際に利用しているリソースから設計してください。

共用レンタルサーバーでもCSPは設定できる?

多くの場合、Webサーバー設定、.htaccess、アプリ側のレスポンスヘッダー設定などでCSPを追加できます。 ただし、利用できる方法はサーバー環境によって異なります。

Apache系共用サーバー

.htaccess対応を確認

Headerディレクティブが利用できるかサーバー会社の仕様を確認します。

nginx VPS

サーバー設定

nginx設定でレスポンスヘッダーを追加できます。

CDN利用

CDN側設定も可能

CDNのレスポンスヘッダー機能で設定できる場合があります。

マネージド環境

仕様確認

自由なヘッダー変更ができない場合は事業者サポートを確認します。

CSPとセキュリティヘッダーの違い

CSPは、Webセキュリティに使われるHTTPレスポンスヘッダーの1つです。

ヘッダー 主な役割
Content-Security-Policy 読み込み・実行可能なリソースを制限
Strict-Transport-Security HTTPS接続を強制
X-Content-Type-Options MIMEタイプの推測を抑制
Referrer-Policy Referer情報の送信範囲を制御

セキュリティヘッダー全体との違い

セキュリティヘッダーには複数の種類がありますが、この記事ではその中でもCSPだけに絞って仕組みと設定時の考え方を解説します。

CSPを設定すればXSS対策は完璧?

完璧ではありません。

CSPは非常に有効な追加防御ですが、アプリ側の入力処理や出力エスケープが不要になるわけではありません。 また、許可したドメイン側が侵害された場合や、CSP自体が広すぎる場合は十分な防御にならないこともあります。

安全な実装 + 更新 + CSP = 多層防御

初心者向けCSP導入手順

1.現在読み込んでいるリソースを把握

JavaScript、CSS、画像、フォント、iframe、API通信などを確認します。

2.基本ポリシーを設計

default-srcやscript-srcなど必要なディレクティブを決めます。

3.Report-Onlyで導入

正常機能を止めずに違反を確認します。

4.不要な外部読み込みを減らす

許可先を増やす前に、本当に必要か確認します。

5.nonce/hashを検討

JavaScriptをより厳格に制御します。

6.十分にテストして本番強制

CSPでよくある失敗

  • 他サイトの設定をそのままコピーする
  • いきなり本番で厳しいCSPを強制する
  • 動かないたびに*で許可する
  • 'unsafe-inline'を安易に追加する
  • nonceを固定値で使い回す
  • 解析・広告・決済・フォームなどの外部通信を見落とす
  • Report-Onlyのまま本番強制へ移行しない
  • CSPだけでXSS対策が完了したと考える

「エラーが出ないCSP」より「必要最小限のCSP」

すべて許可すればエラーは消えますが、防御効果も弱くなります。 必要なリソースだけを許可することが重要です。

教科書判定

教科書判定

CSPは有効だが、初心者が一発で厳格設定するものではない

CSPはXSSなどへの追加防御として非常に有効ですが、Webサイトごとに読み込むJavaScript・CSS・外部サービスが異なるため、万能なコピペ設定はありません。

特にWordPressでは、テーマ・プラグイン・解析・広告・フォーム・埋め込みサービスなどが影響するため、まずReport-Onlyで確認してください。

そのうえで、不要な外部読み込みを減らし、必要に応じてnonceやhashを使った厳格なポリシーへ近づけます。

「CSPを入れること」ではなく、「必要なものだけ許可し、正常動作を確認したうえで強制すること」が重要です。

よくある質問

Q.CSPとは何ですか?

Content Security Policyの略で、Webページが読み込み・実行できるJavaScript、CSS、画像、iframeなどをブラウザ側で制限するセキュリティ機能です。

Q.CSPを設定するとSEO順位が上がりますか?

CSPは検索順位を直接上げるための設定ではありません。主な目的はWebサイトのセキュリティ強化です。

Q.CSPを入れたらJavaScriptが動かなくなりました。

script-srcなどで必要なスクリプトが許可されていない可能性があります。ブラウザのConsoleで違反内容を確認し、必要なリソースだけ許可してください。安易にunsafe-inlineやワイルドカードを追加しないことが重要です。

Q.Report-Onlyとは何ですか?

CSP違反を実際にはブロックせず、違反内容だけ確認するテスト用モードです。本番でCSPを強制する前の確認に向いています。

Q.WordPress初心者でもCSPを設定すべきですか?

必須とは限りません。まずWordPress・テーマ・プラグインの更新、強い認証、WAF、バックアップなど基本対策を行い、そのうえで企業サイトやセキュリティ要件の高いサイトではCSP導入を検討すると分かりやすいです。

まとめ

この記事の結論

  • CSPは読み込み・実行可能なリソースをブラウザで制限する仕組み
  • 主にContent-Security-Policyレスポンスヘッダーで設定する
  • XSS対策の追加防御として有効
  • default-src・script-srcなどのディレクティブで制御する
  • 強いCSPではnonce・hashを利用する
  • unsafe-inlineを安易に許可しない
  • 導入前はReport-Onlyで確認する
  • WordPressではテーマ・プラグイン・外部サービスとの互換性を確認する
  • CSPだけで脆弱性そのものが解消されるわけではない

CSPは、Webサイトへ「何を実行してよいか」というルールを追加する強力なセキュリティ機能です。 いきなり厳しく設定するのではなく、Report-Onlyで現状を把握し、必要最小限の許可へ段階的に絞ることが安全な導入方法です。

次に読む

「セキュリティヘッダーとは?Webサイトで設定する意味」もあわせて確認してください。