Skip to content

MS_ContentSecurityPolicy

nishi_74322014 edited this page Sep 1, 2026 · 1 revision

Content-Security-Policy

概要

特定の種類の攻撃を検知し、

  • データの窃取から
  • サイトの改ざんによるマルウェアの拡散

など影響を軽減するために追加できるセキュリティレイヤー

詳細

  • Content-Security-Policy: W3C 仕様の標準ヘッダー。

  • Firefox 23 以上、Chrome 25 以上、および Opera 19 以上でサポート。

  • 以下のようなポリシーを設定し、それを Web ブラウザに強制させる。

    • ロード可能なスクリプトを制限する
    • インライン記述のスクリプトの実行を禁止する

方式

コンテンツの

  • 提供元(URL)
  • 取得方法(HTTPS 経由のみなど)

を制限することで、

  • 攻撃者のコンテンツを読み込ませることを阻止し、
  • 結果として、コンテンツに対する攻撃を軽減する。

補足(CSP は「二の矢」): CSP は XSS の穴を塞ぐものではなく、
穴があったときに被害を抑えるための多層防御である。
攻撃者がスクリプトを注入できたとしても、

  • インライン スクリプトが実行されない
  • 攻撃者のドメインへスクリプトを読みに行けない
  • 盗んだデータを外部へ送信できない(connect-src

ため、成立する攻撃が大きく減る。
一次対策であるXSS 対策(出力のエスケープ)を
置き換えるものではない点に注意する。

対応方法

クロスサイトスクリプティング

XSS の発生する箇所を削減・根絶することができる。

  • 実行を許可するスクリプトの正しいドメインをブラウザに向けて指定する。
  • 究極的な防衛策として、スクリプトの実行を全面的に拒否することも可能。

パケットキャプチャ

取得するコンテンツのドメインを制限することに加え、
サーバは通信に使うプロトコルを指定することも可能。

  • すべてのコンテンツを HTTPS で取得されるように指定。
  • Cookie に secure フラグを付与するように指定。
  • Strict-Transport-Security HTTP ヘッダ
    セキュリティ強化のHTTPヘッダを参照)

移行メモ(リンク切れ): 元ページの「Strict-Transport-Security HTTP ヘッダ」は
同一ページ内に存在しないアンカーを指していた。
当該ヘッダは親ページの
セキュリティ強化のHTTPヘッダ」で扱われているため、
そちらへのリンクに置き換えた。

設定

設定方法

  • Content-Security-Policy HTTP ヘッダ
    CSP で優先される配信のしくみは HTTP ヘッダ

  • <meta http-equiv="Content-Security-Policy" content="・・・"> タグ
    ページのマークアップに直接ポリシーを設定する場合に便利

補足(meta タグには制限がある): meta での指定は、
frame-ancestorsreport-urisandbox が効かない
クリックジャッキング対策(frame-ancestors)を入れる場合は
必ず HTTP ヘッダで指定する必要がある。

記述

  • CSP 1.0 仕様

    • connect-src
      保護対象リソースがスクリプトインターフェイス
      (XMLHttpRequest オブジェクトの send() メソッドなど)
      を使用して読み込むことのできる URL を制限する。

    • font-src
      保護対象リソースがフォントの読み込み元にできる場所を制限する。

    • img-src
      保護対象リソースがイメージの読み込み元にできる場所を制限する。

    • media-src
      保護対象リソースがメディアの読み込み元にできる場所を制限する。

    • object-src
      保護対象リソースがプラグインの読み込み元にできる場所を制限する。

    • script-src

      • 保護対象リソースが実行できるスクリプトを制限
      • インラインスクリプト、および eval に対する追加の制限をする。
    • style-src
      保護対象リソースにユーザーが適用できるスタイルを制限する。

    • default-src
      他の CSP フェッチディレクティブのフォールバックとなる。

    • frame-src
      保護対象リソースが埋め込めるフレームの供給元を制限する(CSP2 では廃止)。

    • report-uri
      ポリシー違反に関するレポートをユーザーエージェントが送信する URL を指定する。

    • sandbox
      ユーザーエージェントが保護対象リソースに適用する HTML サンドボックスポリシーを指定する。

  • CSP2 の新しいディレクティブ

    • form-action
      HTML フォーム要素のアクションとして使用できる URL を制限する。

    • frame-ancestors
      UA が HTML 以外のリソースを埋め込めるようにするかどうかを示す。

    • plugin-types
      埋め込み可能なリソースのタイプを限定する。

    • base-uri
      ドキュメントのベース URL の指定に使用できる URL を制限する。

    • child-src
      入れ子になったブラウジングコンテキストと Worker の実行コンテキストの作成を制御する。

移行メモ(脱字): 元ページの

  • 「追加の制限する」→「追加の制限する」
  • 「フォールバックする」→「フォールバックとなる
  • 「CSP2 では廃止する。」→「CSP2 では廃止**)**。」(閉じ括弧の欠落)

を整えた。

補足(frame-ancestors の説明): 元ページの
「UA が HTML 以外のリソースを埋め込めるようにするかどうかを示す」は
説明として通りにくい。
frame-ancestors は正しくは
「自分のページを frame / iframe に埋め込んでよい親サイト」を制限する
ディレクティブで、X-Frame-Options の後継にあたる
(クリックジャッキング対策)。

補足(現在の推奨は nonce / strict-dynamic): 本ページが挙げている
ドメインのホワイトリスト方式は、CDN 上の任意の JS を経由して
迂回できることが分かっており、現在は推奨されていない。
代わりに、

  • リクエストごとに乱数を発行して script-src 'nonce-xxxx' とする
  • 'strict-dynamic' で、許可したスクリプトが読み込む先も連鎖的に許可する

という nonce ベースの CSP が推奨されている。

後方互換性

  • 後方互換性を保って設計されている。

    • CSP 未対応のブラウザでも CSP 実装済のサーバと通信できる。
    • CSP 未対応のサーバでも CSP 実装済のブラウザと通信できる。
  • CSP 2 については後方互換性が無い

関連するヘッダ

Content-Security-Policy-Report-Only

  • W3C 仕様の標準ヘッダー。

  • Firefox 23 以上、Chrome 25 以上、および Opera 19 以上でサポート。

  • ポリシーを強制せず、ポリシー違反が起きた時のレポーティングのみを行う。

  • 違反レポートは JSON の文書で構成され、HTTP POST リクエストを介して指定された URI に送信される。

補足(導入は Report-Only から): 既存サイトにいきなり CSP を強制すると
正規のスクリプトまで止まって画面が壊れる。
まず Content-Security-Policy-Report-Only で運用してレポートを集め、
違反が出なくなってから本番のヘッダに切り替える
のが定石である。

廃止されたヘッダ

X-Content-Security-Policy

以前の Firefox で、Content-Security-Policy は、X-Content-Security-Policy だった。

  • これらの実装は廃止されている。
  • 制限があり、一貫性がなく、非常に多くのバグが含まれるので使用してはいけない。

X-Webkit-CSP

以前の WebKit 系で、Content-Security-Policy は、X-Webkit-CSP だった。

  • これらの実装は廃止されている。
  • 制限があり、一貫性がなく、非常に多くのバグが含まれるので使用してはいけない。

参考

導入しました系

本 Wiki 内


Tags: IT国際標準, 通信技術, IIS, .NET開発, .NET Core, ASP.NET, ASP.NET MVC

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally