Content Security Policy(CSP)は、ページが読み込み・実行できるリソースやコードの動作を制限します。Subresource Integrity(SRI)は、指定したスクリプトやスタイルシートが宣言されたハッシュと一致するか確認します。CSPはポリシーの境界、SRIは特定ファイルのバイト列を検証します。どちらも入力検証、出力エンコード、安全なリリース手順の代わりにはなりません。CSP Level 3仕様 SRI仕様

CSP nonceはレスポンスごとに新しく作る

インラインスクリプトが必要な場合、サーバーはレスポンスごとに予測しにくいnonceを生成し、レスポンスヘッダーと許可する<script>要素に同じ値を設定できます。現在のCSP Level 3文書はWorking Draftであり、ポリシーを送信するたびにnonceを一意にし、128ビット以上を推奨しています。下の波括弧内は、レスポンスごとに安全な乱数へ置き換えるサーバー側のプレースホルダーです。固定文字列では目的を果たしません。nonceの要件

Content-Security-Policy: default-src 'self'; script-src 'nonce-{{REQUEST_NONCE}}'; object-src 'none'; base-uri 'none'
<script nonce="{{REQUEST_NONCE}}">/* 許可するインラインコード */</script>

{{REQUEST_NONCE}}は両方で同じレスポンス固有の値にします。テンプレートに固定値を置いたり、ページキャッシュで別の利用者に再利用したりしないでください。外部スクリプトの配信元とnonceやSRIの必要性も別途確認します。nonceはeval()を許可しません。eval()など文字列からコードをコンパイルする処理はscript-srcの'unsafe-eval'ポリシーで制御されます。nonceを付けて境界を回避しようとしてはいけません。script-srcの説明

SRIで外部ファイルの期待値を固定する

バージョンを固定したCDNファイルでは、ビルドまたは信頼できる配布元が作成したハッシュを記録できます。取得した内容が一致しなければブラウザーはリソースを適用しません。クロスオリジンのファイルはCORSで要求する必要があるため、crossorigin="anonymous"も指定します。ファイルが変わったらハッシュと一緒に確認・配布します。SRIの利用要件

<script src="https://cdn.example.com/lib-1.2.3.js"
        integrity="sha384-{{GENERATED_BASE64_DIGEST}}"
        crossorigin="anonymous"></script>

これはプレースホルダーの例であり、そのまま配布できるハッシュではありません。実ファイルの正確なダイジェストとCDNのCORS応答を確認してください。SRIは期待したバイト列との一致を確認しますが、コードが最初から安全または最新であることを証明しません。

強制する前に試す

まずページが実際に使うスクリプトとインラインコードを洗い出します。Content-Security-Policy-Report-Onlyヘッダーを使うと、既存の動作をブロックせず候補ポリシーを観察できます。報告先が機能することと、報告内容が機微情報を漏らさないことを確かめてから、ポリシーを絞りテスト環境で強制します。Report-Onlyは観察段階であり、保護を有効にするものではありません。W3C仕様では、このヘッダーをHTMLの<meta>から配信できず、HTTPレスポンスヘッダーで送る必要があります。Report-Onlyの動作

公開前にnonceがレスポンスごとに変わり、ヘッダーとHTMLで一致し、意図したスクリプトだけが動くことを確認します。各SRIハッシュが配布ファイルと一致することも確認します。CSPとSRIは異なる失敗を扱います。CSP違反で必要な機能が止まったり、SRI不一致でリソースが拒否されたりするため、ロールバックとハッシュ更新手順も決めてください。

出典

  • W3C, Content Security Policy Level 3 — nonce、script-src、Report-Onlyの規則。2026年9月16日付Working Draft。
  • W3C, Subresource Integrity — ファイル整合性の仕様。
  • [MDN, CSP script-src](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Content-Security-Policy/script-src) — nonceとevalポリシーの実務資料。
  • MDN, Subresource Integrity — クロスオリジン要求とcrossoriginの条件。