web サイトの管理者は、Content Security Policy (CSP) を使用してポリシーの範囲を定義できます。これらは web サイトの要件に応じて任意に組み合わせることができ、以下に挙げられているものすべてを指定する必要はありません。
Content sources
ポリシーを指定するディレクティブのうち大半は、content source を 1 つ以上指定する必要があります。content source とは、読み込むコンテンツの配信元を表す文字列です。
Source lists
source list とは、一つまたは複数のホストを名前や IP アドレスで指定した文字列です。スキーム とポート番号は省略可能です。web サイトのアドレスの先頭にはワイルドカード(アスタリスク文字, '*'
)を使用することもでき、ワイルドカードはポート番号に使用することもできます。この場合、すべてのポートが content source として妥当であることを示します。また、ホストはスペースで区切られます。
以下はホストの正しい表記方法です。
- https://*.example.com
http:
スキームを使用した example.com のあらゆるサブドメインに対するアクセスすべてにマッチします。- mail.example.com:443
- mail.example.com のポート番号 443 に対するすべてのアクセスにマッチします。
- https://store.example.com
https:
を使用した store.example.com に対するすべてのアクセスにマッチします。
ポート番号が省略された場合、ブラウザは指定されたスキームにおけるデフォルトのポート番号を使用します。スキームが省略された場合、CSP の保護対象であるドキュメントと同じスキームを使用します。
キーワード
以下のキーワードを用いることで、特別な種類の content sources を指定することができます。
'none'
- 空集合を指定します(どのホストにもマッチしません)。シングルクォートも必要です。
'self'
- 保護対象のドキュメントと同じオリジン(スキームとポート番号も同じ)を指定します。シングルクォートも必要です。一部のブラウザは、
blob
やfilesystem
を source のディレクティブから明確に除外しています。これらのコンテンツを許可する必要があるサイトは、Data 属性で指定してください。 'unsafe-inline'
- インラインの
<script>
要素、javascript:
URL、インラインのイベントハンドラ、インラインの<style>
要素といった、インラインリソースの使用を許可します。シングルクォートも必要です。 'unsafe-eval'
- 文字列からコードを生成する
eval()
や類似メソッドの使用を許可します。シングルクォートも必要です。
例えば、ドキュメントのオリジンと trustedscripts.example.com からコンテンツを読み込めるようにしたい場合、次のように指定します。
Content-Security-Policy: default-src 'self' trustedscripts.example.com
Data
- data:
- content source として
data:
URI を許可します。これを許可すると、攻撃者によって任意の data: URI を挿入されてしまう可能性があるため、安全ではありません。使用は控え、スクリプト用には決して使用しないでください。 - mediastream:
- content source として
mediastream:
URI を許可します。 - blob:
- content source として
blob:
URI を許可します。 - filesystem:
- content source
filesystem:
URI を許可します。
Content-Security-Policy: default-src 'self'; img-src 'self' data: blob: filesystem:; media-src mediastream:
サポートされているポリシーディレクティブ
以下のポリシーディレクティブを利用することで、様々な範囲に対するポリシーのセキュリティを制御できます。
base-uri
base-uri
ディレクティブは、ユーザエージェントがドキュメントのベース URL として使用する URI を定義します。値が省略された場合、どの URI でも許可されます。ディレクティブが省略された場合、ユーザエージェントは base
要素の値を使用します。
base-uri source-list
child-src
child-src
ディレクティブは、Web Workers と、<frame>
や <iframe>
などの要素で読み込まれる入れ子のブラウジングコンテキストについて許可する source を定義します。frame-src
ディレクティブは非推奨となったため、child-src の使用が推奨されています。ポリシーに違反したリクエストが worker に関するものだった場合、ユーザエージェントは fatal network error を返します。
default-src
ディレクティブを参照します。child-src source-list
connect-src
connect-src
ディレクティブは、Fetch、XMLHttpRequest
、WebSocket、EventSource において許可する接続先を定義します。
default-src
ディレクティブを参照します。connect-src
source-list
default-src
default-src
ディレクティブは、詳細なディレクティブで指定されなかった種類のコンテンツすべてに対するセキュリティポリシーを定義します。default-src ディレクティブは、以下のディレクティブのフォールバックとして働きます。
child-src
connect-src
font-src
img-src
manifest-src
media-src
object-src
script-src
style-src
default-src
source-list
font-src
font-src
ディレクティブは、@font-face
で読み込まれるフォントについて許可する source を定義します。
default-src
ディレクティブを参照します。font-src
source-list
form-action
form-action
ディレクティブは、<form>
について許可する送信先を定義します。
form-action
source-list
frame-ancestors
frame-ancestors
ディレクティブは、<frame>
および <iframe>
要素を使用した埋め込み先として許可するものを定義します。このディレクティブに関しては、<meta>
要素や Content-Security-policy-Report-Only
ヘッダフィールドにおける利用はサポートされていません。
frame-ancestors
source-list
frame-src
child-src
ディレクティブは、Web Workers と、<frame>
や <iframe>
などの要素で読み込まれる入れ子のブラウジングコンテキストについて許可する source を指定します。
child-src
を代わりに使用してください。frame-src source-list
img-src
img-src
ディレクティブは、画像と favicon について許可する source を指定します。
default-src
ディレクティブを参照します。img-src
source-list
manifest-src
manifest-src
ディレクティブは、リソースに適用できるマニフェストを定義します。
default-src
ディレクティブを参照します。manifest-src
source-list
media-src
media-src
ディレクティブは、<audio>
要素と <video>
要素で読み込むメディアについて許可する source を定義します。
default-src
ディレクティブを参照します。media-src
source-list
object-src
object-src
ディレクティブは、<object>
要素、<embed>
要素、<applet>
要素について許可する source を定義します。
default-src
ディレクティブを参照します。object-src
source-list
plugin-types
plugin-types
ディレクティブは、ユーザエージェントが起動できるプラグインを定義します。
plugin-types type-list
referrer
referrer
ディレクティブは、ページから離れる際に Referer HTTP ヘッダへ記載される情報を定義します。ここに指定できる値は no-refferer
/ no-referrer-when-downgrade
/ origin
/ origin-when-cross-origin
/ unsafe-url
のいずれかです。
referrer value
reflected-xss
reflected-xss
ディレクティブは、反射型クロスサイトスクリプティング攻撃をフィルタリングまたはブロックするヒューリスティック機能について、有効にするかどうかをユーザエージェントに指示するものです。ここに指定できる値は allow
/ block
/ filter
のいずれかです。<meta>
要素におけるこのディレクティブの利用はサポートされていません。
meta
要素内に存在した場合は無視されます。reflected-xss value
report-uri
report-uri
ディレクティブは、Content Security Policy に対する違反事象を報告するようにブラウザへ指示するものです。この違反報告は JSON ドキュメントで表現され、HTTP POST
リクエストで指定した URI へ送信されます。詳細は CSP 違反報告の使い方 を参照してください。<meta>
要素におけるこのディレクティブの利用はサポートされていません。
report-uri
uri
注記: Firefox は現在 report-uri
で、Content Security Policy で保護されているコンテンツと同じ URL スキームおよびポートを使用することが必要です。
sandbox
sandbox
ディレクティブは、ポップアップブロック、プラグインやスクリプトの実行防止、同一オリジンポリシーの強制などによって、ページの振る舞いを制限します。このディレクティブに関しては、<meta>
要素や Content-Security-policy-Report-Only
ヘッダフィールドにおける利用はサポートされていません。
sandbox value
script-src
script-src
ディレクティブは、JavaScript について許可する source を指定します。script-src
ディレクティブまたは default-src
ディレクティブを指定した場合、'unsafe-inline' を指定しなければインラインスクリプトが、'unsafe-eval' を指定しなければ eval()
がそれぞれ無効になります。
default-src
ディレクティブを参照します。script-src
source-list
strict-dynamic
strict-dynamic
ディレクティブは、nonce やハッシュ値とともにマークアップされたスクリプトの信頼度を、そのルートスクリプトによって読み込まれた任意のスクリプトに対しても適用することを宣言するものです。このとき、'self'
や 'unsafe-inline'
といったホワイトリストや source expression はすべて無視されます。例えば、script-src 'strict-dynamic' 'nonce-R4nd0m' https://whitelisted.com/
というポリシーを設定した場合、<script nonce="R4nd0m" src="https://example.com/loader.js">
によるルートスクリプトの読み込みは許可され、loader.js
によって読み込まれた任意のスクリプトも許可されます。ただし、https://whitelisted.com/
のスクリプトは許可されません。
script-src 'strict-dynamic' 'nonce-someNonce'
または
script-src 'strict-dynamic' 'sha256-hash'
ユーザエージェントのバージョンを確認することなく、後方互換性を保って strict-dynamic
をデプロイするには以下のようにします。
script-src 'unsafe-inline' https: 'nonce-abcdefg' 'strict-dynamic'
このように指定することで、CSP1 をサポートするブラウザでは 'unsafe-inline' https:
として、CSP2 をサポートするブラウザでは https: 'nonce-abcdefg'
として、CSP3 をサポートするブラウザでは 'nonce-abcdefg' 'strict-dynamic'
として作用します。
style-src
style-src
ディレクティブは、スタイルシートについて許可する source を指定します。ここでは、外部から読み込まれるスタイルシートとインラインで使用される <style>
要素、および HTML の style
属性のすべてが対象です。この source list に含まれていない source によるスタイルシートは、要求も読み込みもできません。style-src
ディレクティブまたは default-src
ディレクティブが指定された場合、'unsafe-inline' を指定しなければ <style>
要素や style
属性が無効になります。
default-src
ディレクティブを参照します。style-src
source-list
upgrade-insecure-requests
upgrade-insecure-requests
ディレクティブは、その Web サイト上における安全でない URL(HTTP で送信される)のすべてを、安全な URL(HTTPS で送信される)に置き換えたように動作するよう、ユーザエージェントに指示するものです。このディレクティブは、 安全でない URL を多く書き換えなければならない web サイトで利用されることを想定しています。
仕様
仕様書 | 策定状況 | 備考 |
---|---|---|
Content Security Policy Level 3 | 勧告改訂案 | strict-dynamic の追加 |
Referrer Policy | 草案 | referrer ポリシーにおける値の追加 |
Upgrade Insecure Requests | 勧告候補 | upgrade-insecure-requests の追加 |
Content Security Policy Level 2 | 勧告候補 | base-uri , child-src , form-action , frame-ancestors , plugin-types , referrer , reflected-xss , and report-uri を追加。frame-src を非推奨に変更。 |
Content Security Policy 1.0 | 勧告候補 | connect-src , default-src , font-src , frame-src , img-src , media-src , objects-src , report-uri , sandbox , script-src , style-src を定義。 |
ブラウザ実装状況
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Edge | Opera | Safari |
---|---|---|---|---|---|---|
Basic support | 14.0[4] 25.0 45.0[2] |
4.0 (2.0)[5] 23.0 (23.0) |
未サポート | 12 | 15 | 6[4] 7 |
base-uri |
40.0 | 35.0 (35.0) | ? | ? | ? | ? |
child-src |
(有) | 45.0 (45.0) | ? | ? | ? | ? |
connect-src |
(有) | 23.0 (23.0)[6] | ? | ? | ? | ? |
default-src |
(有) | 23.0 (23.0) | ? | ? | ? | ? |
font-src |
(有) | 23.0 (23.0) | ? | ? | ? | ? |
form-action |
40.0 | 36.0 (36.0) | ? | ? | ? | ? |
frame-ancestors |
40.0 | 33.0 (33.0) | ? | ? | ? | ? |
frame-src |
(有) | ? | ? | ? | ? | ? |
img-src |
(有) | 23.0 (23.0) | ? | ? | ? | ? |
manifest-src |
(有) | 41.0 (41.0) | ? | ? | ? | ? |
media-src |
(有) | 23.0 (23.0) | ? | ? | ? | ? |
object-src |
(有) | 23.0 (23.0) | ? | ? | ? | ? |
plugin-types |
40.0 | 未サポート | ? | ? | ? | ? |
referrer |
(有)[3] | 37.0 (37.0) | ? | ? | ? | ? |
reflected-xss |
(有) | 未サポート | ? | ? | ? | ? |
report-uri |
40.0 | ? | ? | ? | ? | ? |
sandbox |
(有) | 50.0 (50.0) | 10[5] | ? | ? | ? |
script-src |
(有) | 23.0 (23.0) | ? | ? | ? | ? |
strict-dynamic |
52.0 | ? | ? | ? | 39 | ? |
style-src |
(有) | 23.0 (23.0) | ? | ? | ? | ? |
upgrade-insecure-requests |
43.0 | 42.0 (42.0) | 未サポート | 未サポート | 30 | 未サポート |
Feature | Android Browser | Android Webview | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile | Chrome for Android |
---|---|---|---|---|---|---|---|
Basic support | (有)[1] | (有) 45.0[2] |
4.0 (2.0) | ? | ? | 7.1 | (有) 45.0[2] |
base-uri |
未サポート | 40.0 | 35.0 (35.0) | ? | ? | ? | 40.0 |
child-src |
未サポート | 40.0 | 未サポート | ? | ? | ? | 40.0 |
connect-src |
? | (有) | 23.0 (23.0)[6] | ? | ? | ? | (有) |
default-src |
? | (有) | 未サポート | ? | ? | ? | (有) |
font-src |
? | (有) | 未サポート | ? | ? | ? | (有) |
form-action |
未サポート | 40.0 | 36.0 (36.0) | ? | ? | ? | 40.0 |
frame-ancestors |
未サポート | 40.0 | 33.0 (33.0) | ? | ? | ? | 40.0 |
frame-src |
? | (有) | 未サポート | ? | ? | ? | (有) |
img-src |
? | (有) | 未サポート | ? | ? | ? | (有) |
manifest-src |
? | ? | 41.0 (41.0) | ? | ? | ? | ? |
media-src |
? | (有) | 未サポート | ? | ? | ? | (有) |
object-src |
? | (有) | 未サポート | ? | ? | ? | (有) |
plugin-types |
未サポート | 40.0 | 未サポート | ? | ? | ? | 40.0 |
referrer |
?[3] | (有) | 37.0 (37.0) | ? | ? | ? | (有)[3] |
reflected-xss |
? | (有) | 未サポート | ? | ? | ? | (有) |
report-uri |
未サポート | 40.0 | 未サポート | ? | ? | ? | 40.0 |
sandbox |
? | (有) | 50.0 (50.0) | ? | ? | ? | (有) |
script-src |
? | (有) | 未サポート | ? | ? | ? | (有) |
strict-dynamic |
未サポート | 52.0 | ? | ? | 39 | ? | 52.0 |
style-src |
? | (有) | 未サポート | ? | ? | ? | (有) |
upgrade-insecure-requests |
42.0 (42) | 43.0 | 未サポート | 未サポート | 未サポート | 未サポート | 43.0 |
[1] Android 4.0 から非推奨になりました。
[2] Chrome 45.0 より、blob
および filesystem
を提供元ディレクティブから除外しています。これらのコンテンツタイプを許可する必要があるサイトでは、データ属性を使用して指定してください。
[3] Chrome 45.0 より、referrer
ポリシーの値は Refferer Policy の仕様で定義された値に制限されます。
[4] X-Webkit-CSP
ヘッダによる実装。
[5] X-Content-Security-Policy
ヘッダによる実装
[6] Firefox 50 より前では、<a>
要素の ping
属性に適用されません。