CSP: Content Security Policy
ドキュメント
ブラウザ標準の機能
ページに読み込むリソースの提供元(ソース)を制限できる
できることの例
eval()
禁止
- インラインスクリプト禁止
script
タグ内やonclick
属性などのJavaScript
- ソースドメインを限定
fetch()
やform
タグなど
- 画像やJavaScriptなど外部ファイル
- 逆に、自身を
iframe
などで読み込みできる親となるドメインを限定
レスポンスヘッダContent-Security-Policy
HTMLファイルをレスポンスの際
- ポリシーを指定
- 代わりに
meta
タグでも指定可能
<meta http-equiv="Content-Security-Policy" content="ポリシー">
- 先行するタグに適用なし
ポリシー
ディレクティブ 値1 値2 ..
Content-Security-Policy: connect-src 'none' example.com
複数のポリシー
- ヘッダを複数回使うか、
;
区切り
- すべてのポリシーの条件をクリアできたら許可
Content-Security-Policy: connect-src 'none'; connect-src example.org
-src
系ディレクティブ
- リソース種別ごとに、ソースを指定
- 未指定のものは
default-src
の値を適用
主なディレクティブ
script-src
: JavaScript
connect-src
: fetch()
などの宛先
frame-src
: iframe
タグ
media-src
: audio video
タグ
img-src
: img
タグ
style-src
: CSS
object-src
: object
タグなど
主な値
ドメインなど指定
- ドメイン、IPアドレス、スキーム、ポート
- サブドメイン:
https://*.example.com
同一オリジンに限定: 'self'
すべて不許可: 'none'
危険なもの
'unsafe-eval'
: eval()
を許可
'unsafe-inline'
: インラインスクリプトを許可
default-src
- リソース種別ごとに、ディレクティブ未指定のときのデフォルト
- XSS対策: 未使用なら、最低限
script-src
とobject-src
は必須
デフォルトで制限
例
Content-Security-Policy: default-src 'self' *.example.com
script-src
乱数やハッシュでスクリプトソースを指定
'nonce-ノンス'
- ノンス: レスポンスのたびに、1回限りの乱数
script
タグのnonce
属性に同じノンス
Content-Security-Policy: script-src 'nonce-12345'
<script nonce="12345">console.log(true)</script>
'アルゴリズム-ハッシュ'
- アルゴリズム: sha256, sha384, sha512
- ハッシュはBase64でエンコード
script
タグ内の改行など含めて計算
<script>console.log(true)</script>
# opensslで計算する例
echo -n 'console.log(true)' | \
openssl dgst -sha256 -binary | base64 -w 0
Content-Security-Policy: script-src 'sha256-/lAtxI6iGUPFOmMRpckRAtf/SgqqI/g/asGLZ/qQnTk='
その他のディレクティブ
default-src
ディレクティブの適用がない
- ホストや
'none'
、'self'
など指定
frame-ancestors
- 自身を
iframe
などにできる親
meta
タグ不可、ヘッダで
base-uri