ZeroTool Workbench

CSP ヘッダージェネレーター

ディレクティブ・hash・nonce から Content-Security-Policy ヘッダーを構築。strict モード・Report-Only テンプレート、Express / Nginx スニペット対応。完全ブラウザ完結。

100% クライアントサイド データはブラウザ外に出ません 無料 · 登録不要
Mode
Inline script & style hash calculator
Hash will appear here
  

使い方

  1. プリセットを選びます。Strict は OWASP の「strict CSP」推奨に対応し、Empty は空のポリシーから始めます。
  2. モードを切り替えます。最初は Report-Only にして、違反を計測しつつ実ユーザーをブロックしないようにします。
  3. 各ディレクティブで、キーワードチップ(‘self’‘strict-dynamic’‘none’)やスキームチップ(https:data:)をクリック、もしくはホスト・パスを入力して Enter を押します。
  4. ハッシュ計算機で特定のインラインスクリプト / スタイルを許可するためのハッシュを生成。+ nonce ボタンでリクエストごとの nonce を追加できます。
  5. 出力タブを切り替えて必要な形式(HTTP ヘッダーHTML <meta>Express (helmet)Nginx add_header)をコピー。

Strict CSP のスタート構成

Strict プリセットは三本柱です:script-src‘self’ ‘strict-dynamic’object-src‘none’base-uri‘self’。これに nonce か hash を組み合わせれば、典型的な反射型・蓄積型 XSS のほとんどを防げます。フィッシング系の悪用を抑えたければ、form-action‘self’frame-ancestors‘none’ にしましょう。

よくある落とし穴

  • ’none’ は単独でしか使えません。 他のソースと併記するとそのディレクティブごと無視されます。
  • frame-ancestors は HTTP ヘッダー専用。 <meta> 経由では無視されます。report-urireport-tosandbox も同様です。
  • hash / nonce があると ‘unsafe-inline’ は無効化されます。 モダンブラウザは安全側を優先します。
  • default-src は必ず定義すること。 未指定の fetch 系ディレクティブは default-src をフォールバックします。これがないと将来追加されたディレクティブにフォールバックが効きません。
  • カスタムホストにセミコロンは入れられません。 セミコロンはポリシー全体を切ってしまいます。

Hash と Nonce の使い分け

静的なインライン内容(解析タグ、クリティカル CSS、SSR で出力される共通スクリプト)は hash を使います。静的 HTML やエッジキャッシュとも相性がよく、リクエストごとの値を必要としません。

動的にレンダリングされる内容は nonce です。サーバーがヘッダーに ‘nonce-XYZ’ を埋め込み、レンダリングする全 <script nonce=“XYZ”> に同じ値を付与します。‘strict-dynamic’ と組み合わせれば、信頼されたスクリプトの子スクリプトも自動的に信頼され、巨大なホスト許可リストを保守する必要がなくなります。

デプロイ早見表

  • Nginx:Nginx タブの内容を server ブロックに貼って reload。always はエラー応答にもヘッダーを付けます。
  • Apache.htaccesshttpd.confHeader always set Content-Security-Policy ”…”
  • Express / Node:helmet スニペットを貼り付け、useDefaults を必ず false にして自分のポリシーが helmet デフォルトと暗黙にマージされないようにします。
  • Cloudflare Pages / Vercel / Netlify:HTTP ヘッダー欄をそれぞれのヘッダー設定(_headersvercel.jsonnetlify.toml)に貼ります。

FAQ

Content Security Policy とは何ですか?

CSP はブラウザに対して、信頼できるスクリプト・スタイル・画像・フォント・フレームなどの読み込み元を宣言する HTTP レスポンスヘッダーです。出力エスケープと組み合わせることで、XSS・クリックジャッキング・データインジェクションに対する最強のブラウザ側防御になります。

Enforce と Report-Only、どちらから始めるべきですか?

まず `Content-Security-Policy-Report-Only` と `report-uri`(または `report-to`)エンドポイントで運用します。1〜2 週間ほど実トラフィックの違反レポートを集めて誤検知を直してから、強制版の `Content-Security-Policy` に切り替えます。

インラインスクリプトには 'unsafe-inline' が必要ですか?

可能な限り避けてください。現代の CSP は内容ベースのハッシュ(`'sha256-...'` ほか)とリクエストごとの nonce(`'nonce-...'`)をサポートします。本ページのハッシュ計算機をそのまま使えます。

'strict-dynamic' は何を意味しますか?

nonce か hash で信頼されたスクリプトが、実行時に他のスクリプトを CDN 一覧なしで読み込めるようにします。モダンアプリで推奨される方式で、ホストベースの許可リストを上書きし、典型的なバイパス手段を塞ぎます。

生成したヘッダーはどこに置けばよいですか?

オリジンサーバーから `Content-Security-Policy` を送出します(Nginx `add_header`、Apache `Header set`、Cloudflare Transform Rules、Vercel `headers` など)。HTML `<meta http-equiv>` は静的ホスト向けのフォールバックですが、`frame-ancestors`・`report-uri`・`report-to`・`sandbox` は <meta> では無視されます。