Content Security Policy(CSP)ジェネレーター
Content-Security-Policyをディレクティブごとに作成し、ヘッダー、metaタグ、Nginx、Apacheの設定として出力します。安全でない設定には警告が表示されます。
Content-Security-Policy: default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self' data:; connect-src 'self'; font-src 'self'; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'none'; upgrade-insecure-requests
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self' data:; connect-src 'self'; font-src 'self'; object-src 'none'; base-uri 'self'; form-action 'self'; upgrade-insecure-requests">
add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self' data:; connect-src 'self'; font-src 'self'; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'none'; upgrade-insecure-requests" always;
Header always set Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self' data:; connect-src 'self'; font-src 'self'; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'none'; upgrade-insecure-requests"
既存のポリシーを取り込む
CSPジェネレーターとは?
このCSPジェネレーターは、スクリプト、スタイル、画像、フレームなどのリソースの読み込み元を制限するContent-Security-Policyの作成を支援します。厳格なポリシーから始めて、各ディレクティブを編集でき、結果をその場で評価して、'unsafe-inline'、ワイルドカードのスクリプトソース、object-srcやbase-uriの欠落、引用符のないキーワードなどの弱点を警告します。既存のポリシーを取り込むこともできます。
CSPジェネレーターの使い方
- Strictのスターターポリシーから始めるか、Clear allを押します。
- 各ディレクティブのソースを、
'self' https://cdn.example.comのように編集します。 - upgrade-insecure-requestsを切り替え、必要ならreport-uriを追加します。
- ポリシーの評価を読み、重大と中程度の指摘を修正します。
- ポリシーをHTTPヘッダー、metaタグ、Nginx、Apacheの行としてコピーします。既存のポリシーを取り込んで分析することもできます。
例
Strict starter policy
Content-Security-Policy: default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self' data:; connect-src 'self'; font-src 'self'; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'none'; upgrade-insecure-requests
CSPジェネレーターを使うべき場面
CSPをデプロイする前の下書きやレビューに使います。厳格なポリシーは、許可し忘れたインラインスクリプトやサードパーティのウィジェットを壊すため、新しいポリシーはまずContent-Security-Policy-Report-Onlyで展開して、違反を監視してください。チェックは静的であり、ページが実際にどのスクリプトを読み込むかは分かりません。
CSPジェネレーターの仕組み
ディレクティブは、空のものを除き、name source source; … の形で決まった順序でシリアライズされます。評価は、GoogleのCSP Evaluatorに似た静的なルールを適用します。selfやnoneなどのキーワードは引用符で囲む必要があり、nonceやhashなしで 'unsafe-inline'、'unsafe-eval'、*、http:、https:、data: を含むscript-src(またはフォールバックのdefault-src)は指摘され、object-srcは 'none' にすべきで、base-uri、frame-ancestors、form-actionは設定すべきです。metaタグ版では、ブラウザがmetaタグでは無視するframe-ancestors、report-uri、report-to、sandboxが省かれます。
一般的な使用例
- 新しいサイトのための最初の厳格なCSPを作る。
- 本番からコピーしたポリシーを、'unsafe-inline'やワイルドカードの観点で監査する。
- アクセス解析やCDNのホストをscript-srcに正しく追加する。
- ポリシーに対応する、正確なNginxのadd_header行を取得する。
よくある質問
'unsafe-inline'が問題なのはなぜですか。
XSSの脆弱性から注入されたものを含め、あらゆるインラインスクリプトを許可してしまい、CSPの主な目的が損なわれます。代わりにnonceやhashを使ってください。
ヘッダーとmetaタグのどちらがよいですか。
HTTPヘッダーを推奨します。metaタグではframe-ancestors、report-uri、sandboxを使えず、それより後ろのコンテンツにしか適用されません。
サイトを壊さずにテストするにはどうすればよいですか。
同じポリシーをContent-Security-Policy-Report-Onlyとして送ります。ブラウザは何もブロックせず、違反をコンソールに報告します。