Content-Security-Policy

HTTP の Content-Security-Policy レスポンスヘッダーは、ウェブサイト管理者が、あるページにユーザーエージェントが読み込みを許可されたリソースを管理できるようにします。いくつかの例外を除いて、大半のポリシーにはサーバーオリジンとスクリプトエンドポイントの指定を含んでいます。これはクロスサイトスクリプティング攻撃 (クロスサイトスクリプティング) を防ぐのに役立ちます。

より詳細な情報は、Content Security Policy (CSP) の入門記事を参照してください。

ヘッダー種別 レスポンスヘッダー
禁止ヘッダー名 いいえ

構文

http
Content-Security-Policy: <policy-directive>; <policy-directive>

ここで、 <policy-directive><directive> <value> の形であり、内部に区切り文字はありません。

ディレクティブ

フェッチディレクティブ

フェッチディレクティブは、特定のリソース種別を読み込むことができる場所を制御します。

child-src

ウェブワーカーと、<frame><iframe> のような要素によって読み込まれる入れ子の閲覧コンテキストのための有効なソースを定義します。

警告: 複合した閲覧コンテキストやワーカーを制御するには、 child-src の代わりに、それぞれ frame-src および worker-src を使用してください。

connect-src

スクリプトインターフェイスによって読み込まれる URL を制限します。

default-src

別の Fetch ディレクティブに対する代替として提供します。

font-src

@font-face によって読み込まれるフォントのための有効なソースを指定します。

frame-src

<frame><iframe> のような要素によって読み込まれる入れ子のコンテンツの閲覧のための有効なソースを指定します。

img-src

画像やファビコンのための有効なソースを定義します。

manifest-src

アプリケーションのマニフェストファイルのための有効なソースを指定します。

media-src

<audio><video><track> 要素によって読み込むメディアのための有効なソースを指定します。

object-src

<object><embed><applet> 要素のための有効なソースを指定します。

メモ: object-src で制御される要素は、おそらく古い HTML 要素に該当すると見なされ、標準化された新しい機能が利用できません(セキュリティ属性の sandbox<iframe>allow など)。従って、このフェッチディレクティブで制限を掛けることが推奨されます (例えば、可能であれば object-src 'none' を設定するなど)。

prefetch-src Experimental

事前にフェッチされるか描画される有効なソースを指定します。

script-src

JavaScript および WebAssembly のための有効なソースを指定します。

script-src-elem

JavaScript の <script> 要素のための有効なソースを指定します。

script-src-attr

JavaScript のインラインイベントハンドラーのための有効なソースを指定します。

style-src

スタイルシートのための有効なソースを指定します。

style-src-elem

スタイルシートの <style> および <link> 要素に rel="stylesheet" がついたものののための有効なソースを指定します。

style-src-attr

個々の DOM 要素に適用されるインラインスタイルの有効なソースを指定します。

worker-src

WorkerSharedWorkerServiceWorker スクリプトのための有効なソースを指定します。

文書ディレクティブ

文書ディレクティブは、ポリシーが適用される文書またはワーカー環境のプロパティを管理します。

base-uri

文書の <base> 要素で使用される URL を制限します。

sandbox

<iframe>sandbox 属性に類似した要求リソースに対してサンドボックスを有効にします。

ナビゲーションディレクティブ

ナビゲーションディレクティブは、例えばユーザーが移動する場所やフォームを送信する場所を管理します。

form-action

指定のコンテキストからフォームの送信先として使用される URL を制限します。

frame-ancestors

<frame><iframe><object><embed><applet> によってページに埋め込まれた有効な親を指定します。

<form> (form-action が指定されていない場合)、<a>window.locationwindow.open など、あらゆる方法で文書からナビゲーションを行うことができる URL を制限します。

報告ディレクティブ

報告ディレクティブは CSP 違反の報告過程を制御します。 Content-Security-Policy-Report-Only ヘッダーも参照してください。

report-uri 非推奨

ユーザーエージェントにコンテンツセキュリティポリシーの違反を報告するよう指示します。これらの違反の報告は、 JSON 文書を HTTP の POST リクエストで指定された URI に送信することで行われます。

警告: report-to ディレクティブは非推奨の report-uri ディレクティブを置き換えることを意図していますが、 report-to はまだ多くのブラウザーが対応していません。そのため、ブラウザーで report-to の対応が行われるまでは、現在のブラウザーとの互換性のため、 report-urireport-to の両方を指定することができます。

http
Content-Security-Policy: …; report-uri https://endpoint.example.com; report-to groupname

report-to に対応しているブラウザーでは、 report-uri ディレクティブは無視されます。

report-to

SecurityPolicyViolationEvent を発生させます。

その他のディレクティブ

require-trusted-types-for Experimental

DOM XSS インジェクションシンクで Trusted Types を強制します。

trusted-types Experimental

Trusted Types ポリシーのホワイトリストを指定するために使用します (Trusted Types は、アプリケーションが DOM XSS インジェクションシンクをロックダウンして、文字列の代わりにスプーフィング不可能な型付きの値のみを受け入れるようにします)。

upgrade-insecure-requests

安全でない URL (HTTP で提供されているもの) をすべて安全な URL (HTTPS で提供されているもの) に置き換えたかのように扱うようにユーザエージェントに指示します。このディレクティブは、書き換えが必要な安全でない古い URL が大量にあるウェブサイトを対象としています。

非推奨のディレクティブ

block-all-mixed-content 非推奨

ページが HTTPS を使用して読み込まれた際に、 HTTP を使用して資産を読み込むことを防止します。

plugin-types 非推奨 Non-standard

読み込まれるリソースの種類を限定することで、文書に埋め込まれるプラグインの組を制限します。

referrer 非推奨 Non-standard

ページから離れる際の Referer (綴り注意) ヘッダー内の情報を指定するために使用されていました。代わりに Referrer-Policy ヘッダーを使用してください。

許可さ れている値の概要を以下に示します。 詳細な参照は、CSP ソース値 および各ディレクティブのドキュメントを参照してください。

キーワード値

'none'

すべてのリソースの読み込みを許可しません。

'self'

現在のオリジンからのみリソースの読み込みを許可します。

'strict-dynamic'

ページ内のスクリプトに付随する nonce やハッシュによって与えられた信頼は、それが読み込むスクリプトに拡張されます。

'report-sample'

違反したコードのサンプルを違反レポートに含めて記載することを要求する。

unsafe キーワード値

'unsafe-inline'

インラインリソースの使用を許可します。

'unsafe-eval'

evalsetImmediate (en-US) Non-standard window.execScript Non-standard のような動的コード評価の使用を許可します。

'unsafe-hashes'

特定のインラインイベントハンドラーを有効にすることができます。

'unsafe-allow-redirects' Experimental

TBD

ホスト値

  • Host
    • 指定されたホストからのリソースの読み込みのみを許可します。オプションでスキーム、ポート番号、パスを指定することができます。例えば、 example.com, *.example.com, https://*.example.com:12/path/to/file.js などです。
    • CSP 内の / で終わるパス部分は、その接頭辞であるすべてのパスに一致します。例えば、example.com/api/example.com/api/users/new のような URL に一致します。
    • CSP の他のパス属性の部分は正確に照合されます。例えば、example.com/file.jshttp://example.com/file.jshttps://example.com/file.js には一致しますが、https://example.com/file.js/file2.js に一致するわけではありません。
  • Scheme
    • 特定のスキームによるリソースの読み込みのみを許可します。常に ":" で終える必要があります。例: https:, http:, data: など

その他の値

'nonce-*'

スクリプトを許可するための暗号化された (一度しか使われない) ノンスです。サーバーは、ポリシーを送信するたびに、一意のノンス値を生成する必要があります。リソースのポリシーを迂回することは容易ではないため、推測されないノンスを提供することが重要です。これは script の nonce 属性と組み合わせて使用します。例えば、 nonce-DhcnhD3khTMePgXwdayK9BsMqXjhguVV

'sha*-*'

sha256、sha384、sha512 のいずれかです。その後にダッシュと sha* の値が続きます。例: sha256-jzgBGA4UWFFmpOBq0JpdsySukE1FrEN5bUpoK8Z29fY=

ワーカー内の CSP

ワーカーは、一般的に文書 (もしくは親ワーカー) のコンテンツセキュリティポリシーによって管理されません。ワーカーに対してコンテンツセキュリティポリシーを指定するには、ワーカースクリプト自身が要求したリクエストに対して Content-Security-Policy レスポンスヘッダーを設定して下さい。

ワーカースクリプトのオリジンがグローバルで一意の識別子の場合 (例えば、URL がデータやブロブのスキーマの場合) は例外です。この場合、ワーカーは文書もしくは作成元のワーカーのコンテンツセキュリティポリシーを継承します。

複数の CSP

CSP では、Content-Security-Policy ヘッダー、Content-Security-Policy-Report-Only ヘッダーや <meta> 要素を経由したものを含む、リソースに対して複数のポリシーを指定することができます。

以下の例のように、 Content-Security-Policy ヘッダーを複数回使うことができます。ここでは connect-src ディレクティブに特に注意してください。 2 つ目のポリシーでは接続を許可しているにもかかわらず、 1 つ目のポリシーには connect-src 'none' が含まれています。追加のポリシーを追加しても、保護されたリソースの機能がさらに制限することができるだけで、接続は許可されず、最も厳密なポリシーとして connect-src 'none' が強制されます。

http
Content-Security-Policy: default-src 'self' http://example.com;
                          connect-src 'none';
Content-Security-Policy: connect-src http://example.com/;
                          script-src http://example.com/

例: 安全でないインラインの eval を無効にし、https 経由でのリソース (画像、フォント、スクリプトなど) 読み込みを許可します。

HTTP ヘッダーの使用

http
Content-Security-Policy: default-src https:

HTML の meta 要素の使用

html
<meta http-equiv="Content-Security-Policy" content="default-src https:" />

例: 修正のためにインラインコードを多用している既存のサイトで、https 経由でのみ読み込まれるリソースを明確にし、プラグインを無効にします。

http
Content-Security-Policy: default-src https: 'unsafe-eval' 'unsafe-inline'; object-src 'none'

例: 上記のポリシーを実装せず、代わりに、発生するであろう違反を報告します。

http
Content-Security-Policy-Report-Only: default-src https:; report-uri /csp-violation-report-endpoint/

その他の例は、Mozilla Web Security Guidelines を参照して下さい。

仕様書

Specification
Content Security Policy Level 3
# csp-header

ブラウザーの互換性

BCD tables only load in the browser

関連情報