結論(CSP(コンテンツセキュリティポリシー))
CSP(コンテンツセキュリティポリシー)の診断では、CSPがレスポンスヘッダーで強制されているか、スクリプトの読込元を script-src か default-src で制限しているか、'unsafe-inline'・'unsafe-eval'・過剰なワイルドカード・HTTP配信元を許していないか、object-src・base-uri・form-action・frame-ancestors を明示しているかを確かめます。CSPはXSSの根本対策の代わりではなく、対策が漏れたときの被害を抑える多層防御です。
コンテンツセキュリティポリシー(CSP)の診断項目一覧(10項目)
XSS(クロスサイトスクリプティング)の被害を抑えるCSPの設定内容を確認します。各項目名から、意味・診断基準・リスク・具体的な対策を解説したページへ移動できます。
| No. | 診断項目 | 重大度 | 概要 |
|---|---|---|---|
| 9 | Content Security Policy | high | Content Security Policy(CSP)は、XSSの被害を抑えるためスクリプト等の読込元をブラウザに制限させる仕組みです。 |
| 10 | CSPでunsafe-inlineを許可していない | high | CSPでunsafe-inlineを許可していないかは、CSPがXSS対策として機能するかを左右します。 |
| 11 | CSPでunsafe-evalを許可していない | high | CSPでunsafe-evalを許可していないかは、DOM XSSやCSPバイパスの経路を閉じる重要な確認点です。 |
| 12 | CSPのdefault-src | medium | CSPのdefault-srcは、個別に指定していないフェッチディレクティブの既定値(フォールバック)です。 |
| 13 | CSPの過剰なワイルドカード | high | CSPの過剰なワイルドカードとは、配信元に*やhttps:を書いて事実上何も制限しない状態です。 |
| 14 | CSPでHTTP配信元を許可していない | high | CSPでHTTP配信元を許可していないかは、平文通信による改ざんを防ぐための確認点です。 |
| 15 | CSP違反の報告先 | low | CSP違反の報告先は、CSPがブロックした読込や実行をブラウザから受け取るための設定です。 |
| 84 | CSPがレスポンスヘッダーで強制されている | high | CSPがレスポンスヘッダーで強制されているとは、Content-Security-Policyヘッダーで違反をブロックできる状態です。 |
| 85 | CSPの基幹ディレクティブ | high | CSPの基幹ディレクティブはobject-src・base-uri・form-action・frame-ancestorsの4つです。 |
| 86 | Trusted Typesの適用 | low | Trusted Typesの適用とは、CSPのrequire-trusted-types-for 'script'でinnerHTML等への文字列代入を禁止し、DOM XSSを防… |
CSP(コンテンツセキュリティポリシー)の診断とは
CSP(コンテンツセキュリティポリシー)の診断は、ページがどこからスクリプト・スタイル・画像などを読み込み、どのような実行を許すかをブラウザに宣言させる設定が、実際に役立つ形で入っているかを確かめるものです。セキュリティ診断127項目のうち、CSPの設定内容に関する10項目がこの分類に入ります。
CSPは、XSS(クロスサイトスクリプティング)で攻撃者のスクリプトが紛れ込んでも、許可していない配信元からの読込やインライン実行をブラウザに拒否させる仕組みです。出力時のエスケープなどの根本対策の代わりではなく、対策が漏れた場合に被害を抑える「最後の防御線」と位置づけられます。
注意したいのは、「CSPのヘッダーがある」ことと「CSPが効いている」ことは別だという点です。upgrade-insecure-requests だけのCSPはスクリプトを何も制限しませんし、スクリプトで 'unsafe-inline' を許可したCSPは典型的な script タグの注入を止められません。Report-Onlyのヘッダーは違反を報告するだけで遮断しません。そのためこの分類では、CSPの有無だけでなく、届け方・中身の厳しさ・抜けやすいディレクティブを項目ごとに分けて確認します。
10項目の全体像(4つのグループ)
この分類の10項目は、大きく4つのグループに分けて考えると整理しやすくなります。
| グループ | 診断項目 | 確認する内容 |
|---|---|---|
| CSPの有無と届け方 | 「Content Security Policy」、「CSPがレスポンスヘッダーで強制されている」 | CSPがあり script-src か default-src を含むか、強制モードのレスポンスヘッダーで配信されているか(Report-Onlyやmetaだけでないか) |
| スクリプト実行の制限 | 「CSPでunsafe-inlineを許可していない」、「CSPでunsafe-evalを許可していない」、「Trusted Typesの適用」 | インラインのスクリプトや文字列のコード実行を許していないか、DOM XSSの原因になるAPIへの文字列代入を禁止しているか |
| 配信元リストの厳しさ | 「CSPの過剰なワイルドカード」、「CSPでHTTP配信元を許可していない」、「CSPのdefault-src」 | * や https: で事実上何も制限していない状態や、平文HTTPの配信元が残っていないか、既定値(フォールバック)が置かれているか |
| 抜けやすい指定と運用 | 「CSPの基幹ディレクティブ」、「CSP違反の報告先」 | default-src では代用されない object-src・base-uri・form-action・frame-ancestors の明示、report-uri・report-to による違反レポートの受け取り |
CSPの配信方法には、強制ヘッダー・Report-Onlyヘッダー・meta要素の3通りがあり、すべての機能が使えて攻撃を止められるのは強制ヘッダーだけです。meta要素では frame-ancestors・report-uri・sandbox が使えず、Report-Onlyは違反を報告するだけです。このため「CSPの基幹ディレクティブ」と「CSP違反の報告先」は、強制CSPヘッダーがない場合は対象外となり、届け方の問題は「CSPがレスポンスヘッダーで強制されている」で評価されます。
優先して確認すべき項目
この分類に重大度「最重要(critical)」の項目はありませんが、10項目のうち7項目が「重要(high)」です。CSPの効果そのものを左右する順に確認します。
- CSPの有無と強制:「Content Security Policy」と「CSPがレスポンスヘッダーで強制されている」が土台です。CSPがあっても script-src も default-src もなければスクリプトは無制限で、Report-Onlyやmetaだけでは防御効果が限られます。
- スクリプトの 'unsafe-inline':XSSの典型的な注入はインラインのスクリプトです。スクリプトで 'unsafe-inline' が有効なCSPは、注入された script 要素や onerror などのイベントハンドラーをそのまま実行させます。最も優先して外すべき設定です。
- 'unsafe-eval':eval() や new Function()、文字列を渡した setTimeout() などを許可します。nonce・hash・'strict-dynamic' があっても無効化されないため、削除が必要です。
- 過剰なワイルドカードとHTTP配信元:スクリプトに *・https:・data: を許すと、攻撃者が用意したHTTPSサイトのスクリプトも読み込めます。平文HTTPの配信元は、通信経路上で書き換えられたコードが入り込む余地を残します。
- 基幹ディレクティブ:object-src・base-uri・form-action・frame-ancestors の4つは、default-src を厳しくしても抜けが生じます。推奨の最小構成は object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'self' です。
「中(medium)」の「CSPのdefault-src」は、明示していない種類のリソース(画像・通信先・フォントなど)が無制限になるのを防ぐ既定値です。「低(low)」の「CSP違反の報告先」と「Trusted Typesの適用」は、直接の脆弱性というより運用監視の品質や、DOM XSSへの追加の防御にかかわる項目で、基本の設定がそろった後に進めます。
直すときの進め方と注意点
CSPは、いきなり厳しい値を強制すると、許可していない外部タグや地図・動画が止まり、表示が崩れることがあります。次の順で段階的に進めるのが安全です。
- 棚卸しから始める:ページが読み込んでいる外部スクリプト・スタイル・画像・通信先と、インラインのスクリプトやonclickなどのイベントハンドラー属性を洗い出します。
- Report-Onlyで試す:まずContent-Security-Policy-Report-Onlyで配信し、数週間違反を確認します。報告先(report-uri・report-to)を設定しておくと、違反の内容を把握しやすくなります。report-to を使う場合はReporting-Endpointsヘッダーも必要です。
- 強制ヘッダーに切り替える:違反がなくなったら、同じ値をContent-Security-Policyレスポンスヘッダーで配信します。ヘッダーとmetaの両方に書くと両方が適用され意図より厳しくなることがあるため、ヘッダーへ移行したらmetaは削除して一本化します。
- インラインを外していく:onclick などの属性は外部の .js ファイルに移して addEventListener で登録し、残るインラインスクリプトはnonceやhashで許可します。出力後のHTMLを書き換えて全scriptタグに一律にnonceを付ける方式は、注入されたscriptにもnonceが付くため避けます。
- 値の書き方に注意する:'none' は単独で書いたときだけ有効で、object-src 'none' https: のように並べると https の任意オリジンを許可してしまいます。http:// の配信元は https:// に書き換えても、HTTPS配信されているリソースの読込は維持されます。
- Trusted Typesは最後に検討する:require-trusted-types-for 'script' は、外部ウィジェットが文字列でシンクを使うと動かなくなることがあります。Report-Onlyで違反箇所を洗い出してから強制します。
自治体・公共機関のサイトで特に注意すること
自治体や公共機関のサイトは、CMSのテンプレートや外部の地図・動画・アクセス解析タグなどを組み合わせて作られていることが多く、CSPの導入でつまずきやすい傾向があります。よくある状況として、次のようなものがあります。
- CMSのプラグインやテーマがインラインスクリプトを多用しており、default-src 'self' 'unsafe-inline' https: のような、ヘッダーはあっても実質的にスクリプトを制限しない値になっている。
- upgrade-insecure-requests だけのCSPや、frame-ancestors だけのCSPで「CSPは導入済み」と扱われている。
- 外部の電子申請・決済サービスへ送信するフォームがあり、form-action 'self' を入れると送信が止まる。必要な送信先オリジンを form-action に追加する必要があります。
- 自前サーバーから画像・CSS・JSを配信している場合、default-src 'self' が導入しやすい現実的な初期値になりますが、外部の画像・Webフォント・地図タイル・動画埋め込みは個別に許可が要ります。
- 検索結果の表示、多言語切替、地図やイベントカレンダーの埋め込みなど、クライアント側でHTMLを組み立てる機能が多く、DOM XSSの入口になりやすい。
CMSを使っている場合は、サーバー設定でReport-Onlyから始め、管理画面は別ポリシーにするのが安全です。
よくある質問(FAQ)
CSP(コンテンツセキュリティポリシー)の診断項目は、どの順番で直せばよいですか?
まずCSPを強制モードのレスポンスヘッダーで配信し、script-src か default-src でスクリプトの読込元を制限します。次にスクリプトの 'unsafe-inline' と 'unsafe-eval'、過剰なワイルドカード、HTTP配信元を外し、基幹ディレクティブ(object-src・base-uri・form-action・frame-ancestors)を明示します。default-src・違反の報告先・Trusted Typesはその後に整えます。
CSP(コンテンツセキュリティポリシー)を入れればXSSは起きなくなりますか?
起きなくなるわけではありません。CSPは出力時のエスケープなどの根本対策が漏れた場合に被害を抑える策です。特にスクリプトで 'unsafe-inline' を許可したCSPは、典型的な script タグの注入を止められません。
CSP(コンテンツセキュリティポリシー)はmetaタグやReport-Onlyで設定しても同じ効果がありますか?
同じではありません。Report-Onlyは違反を報告するだけで遮断しません。meta要素のCSPは強制されますが、frame-ancestors・report-uri・sandbox は無視され、meta要素より前の内容には適用されません。効果を確実に得るには強制モードのレスポンスヘッダーで配信します。
CSP(コンテンツセキュリティポリシー)を導入するとサイトが壊れませんか?
いきなり強制すると、許可していない外部タグや地図・動画が止まることがあります。まずReport-Onlyで違反を確認し、必要な配信元を追加して違反がなくなってから、同じ値を強制ヘッダーで配信すれば、表示を壊さずに導入できます。
CSP(コンテンツセキュリティポリシー)でdefault-srcを書けば、base-uriやframe-ancestorsも制限されますか?
制限されません。default-src が代わりに使われるのはフェッチ系ディレクティブだけで、base-uri・form-action・frame-ancestors は default-src を継承しません。default-src 'none' にしても、これらは個別に明示する必要があります。
CSP(コンテンツセキュリティポリシー)の10項目はまとめて確認できますか?
セキュリティAIチェッカーにURLを入力すると、この10項目を含む127項目を公開情報から自動で診断し、項目ごとの判定と改善の優先順位を表示します。