ZeroTool Workbench
CSP ヘッダージェネレーター
ディレクティブ・hash・nonce から Content-Security-Policy ヘッダーを構築。strict モード・Report-Only テンプレート、Express / Nginx スニペット対応。完全ブラウザ完結。
使い方
- プリセットを選びます。Strict は OWASP の「strict CSP」推奨に対応し、Empty は空のポリシーから始めます。
- モードを切り替えます。最初は Report-Only にして、違反を計測しつつ実ユーザーをブロックしないようにします。
- 各ディレクティブで、キーワードチップ(
‘self’、‘strict-dynamic’、‘none’)やスキームチップ(https:、data:)をクリック、もしくはホスト・パスを入力して Enter を押します。 - ハッシュ計算機で特定のインラインスクリプト / スタイルを許可するためのハッシュを生成。
+ nonceボタンでリクエストごとの nonce を追加できます。 - 出力タブを切り替えて必要な形式(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-uri・report-to・sandboxも同様です。- 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:
.htaccessやhttpd.confにHeader always set Content-Security-Policy ”…”。 - Express / Node:helmet スニペットを貼り付け、
useDefaultsを必ずfalseにして自分のポリシーが helmet デフォルトと暗黙にマージされないようにします。 - Cloudflare Pages / Vercel / Netlify:HTTP ヘッダー欄をそれぞれのヘッダー設定(
_headers、vercel.json、netlify.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> では無視されます。