CSP

CSPとは

CSP(Content Security Policy、コンテンツセキュリティポリシー)は、ページが読み込んでよいスクリプト、画像、スタイルシートなどの取得元を、サーバーがブラウザに指示する仕組みです。Content-Security-Policy ヘッダーで指定します。

CSPが必要な理由

入力値の処理に不備があり、攻撃者のスクリプトがページに混入すると、XSSが成立します。CSPで許可した取得元以外のスクリプトを止めておけば、混入しても実行されず、外部への送信先も絞れます。

CSPは、根本対策の代わりにはなりません。出力時のエスケープなどの修正を行ったうえで、被害を小さくするための二重の備えとして使います。

CSPの仕組み

ヘッダーの値は、「ディレクティブ(制御する対象)と許可する取得元」を、セミコロンで区切って並べます。

ディレクティブ制御する対象
default-src個別の指定がない読み込み全般の既定値
script-srcJavaScript
style-srcCSS
img-src画像
connect-srcfetchやXMLHttpRequestの通信先
object-src、base-uriプラグインの埋め込み、baseタグによる基準URLの書き換え
frame-ancestorsこのページをiframeで埋め込める元(クリックジャッキング対策)

取得元には、'self'(自サイト)、'none'(すべて禁止)、https://cdn.example.com のようなホスト名を書きます。インラインのスクリプトを個別に許可する 'nonce-...' や 'sha256-...' も使えます。frame-ancestors、base-uri、form-action は default-src では代用されないため、個別に書きます。

CSPの確認方法

開発者ツールの「ネットワーク」タブでレスポンスヘッダーを見るか、次のコマンドを実行します。

curl -s -D - -o /dev/null https://example.com/ | grep -i '^content-security-policy'

ポリシーに反した読み込みは、開発者ツールの「コンソール」に「Refused to load …」などの形で記録されます。Content-Security-Policy-Report-Only だけが出る場合は、まだ強制されていません。

CSPの設定例

いきなり強制すると、サイトの表示や機能が壊れることがあります。まず Content-Security-Policy-Report-Only で違反の記録だけを行い、コンソールの違反がなくなってから、強制の Content-Security-Policy に切り替えます。

Apache(.htaccess)の例です。

Header always set Content-Security-Policy-Report-Only "default-src 'self'; img-src 'self' data: https:; object-src 'none'; base-uri 'self'"

nginxの例です。

add_header Content-Security-Policy-Report-Only "default-src 'self'; img-src 'self' data: https:; object-src 'none'; base-uri 'self'" always;

WordPress(子テーマのfunctions.php)の例です。

add_action('send_headers', function () {
    header("Content-Security-Policy-Report-Only: default-src 'self'; img-src 'self' data: https:; object-src 'none'; base-uri 'self'");
});

実際のサイトでは、解析タグや埋め込み地図などの外部サービスが違反として記録されます。必要なものだけを取得元に加えていきます。違反の報告を集めたい場合は、report-to や report-uri で送信先を指定します。

よくある間違いと注意点

  • script-src に 'unsafe-inline' や *、https: を入れると、XSSを止める効果がほとんど失われます。
  • 許可する取得元を並べる方式は、設計と維持が難しくなりがちです。MDNは、nonceやハッシュを使う方式を勧めています。
  • <meta http-equiv="Content-Security-Policy"> では、frame-ancestors や report-uri が効かず、Report-Onlyも使えません。HTTPヘッダーで指定します。
  • Report-Onlyの中の frame-ancestors は無視されます。クリックジャッキング対策だけを先に行うなら、強制の Content-Security-Policy: frame-ancestors 'self' の1行から始められます。
  • WordPressの管理画面はインラインスクリプトを多く使います。管理画面にまで強制する前に、動作を確かめます。

Webサイト セキュリティチェッカーで確認する

Webサイト セキュリティチェッカーは、Content-Security-Policyの有無と、script-src に 'unsafe-inline' などの弱い指定が残っていないかを診断します。Report-Onlyだけで強制されていない状態も、区別して示します。

関連用語

関連する用語

サイトの設定を無料で確認する

サイトのURLを入力するだけで、CSP などの設定状況を診断できます。Webサイト セキュリティチェッカー「Security Checker X」は、登録なしで使えます。

デジタルマーケティング事業部 統括マネージャー

略歴:京都大学情報学研究科知能情報学専攻修士課程修了後、日経大手インターネットショッピングモールの開発部でエンジニアとしてシステム開発・運用に従事。同社新規モバイル事業の立ち上げに開発プロジェクトマネージャー、兼プロダクトマネージャーとして参画。その後、外資系大手製薬メーカーのデジタルマーケティング部門でシニアアソシエイトとして従事した後、2020年にエスライン・テクノロジーズのデジタルマーケティング事業部統括マネージャーに就任。カスタマーファーストでデジタルマーケティングの役立つ情報を日々発信中。

【MALINE】総合デジタルマーケティングツール
【特別価格】Digicert VMC
NEWS
  1. 1

    【NEWS】旅行比較サイト『TRAVEL HUB(トラベルハブ)』サービス提供開始のお知らせ

  2. 2

    オフィス移転のお知らせ

  3. 3

    【MALINE】マリン株式会社設立のお知らせ

  4. 4

    無料で使える「Excel版 一斉メール配信ツール」提供開始のお知らせ ~SMTP設定だけで今すぐメール一括送信~

  5. 5

    中小企業向けDXプラットフォーム『Hirameki 7』SEO/MEO支援オプション提供開始。Hirameki 7ご利用者様の集客効果を最大化!

カレンダーから記事を探す
2026年10月
月 火 水 木 金 土 日
 1234
567891011
12131415161718
19202122232425
262728293031  
SEO検索順位チェッカー
Googleマップ/MEO順位チェックツール
【無料】メールアドレス生存確認ツール
【無料】Excel一斉メール送信ツール
メールアドレス漏洩・流出チェックツール
メールドメインブラックリスト判定ツール
DMARC/SPF/DKIM診断ツール
IPアドレス位置・住所特定ツール
自分のIPアドレス確認ツール
驚愕効果のSEO対策