• 診断項目 No.12/127
  • コンテンツセキュリティポリシー(CSP)
  • 重大度 中(medium)

CSPのdefault-srcとは?フォールバックの仕組み・継承しないディレクティブ・設定方法と診断基準

CSPのdefault-srcは、個別に指定していないフェッチディレクティブの既定値(フォールバック)です。default-srcがないと何が無制限になるか、継承しないディレクティブ、'self'と'none'の選び方、設定例と診断基準を解説します。

結論(CSPのdefault-src)

CSPのdefault-srcとは、script-src・style-src・img-src・connect-src などのフェッチディレクティブが個別に指定されていないときに使われる既定値(フォールバック)です。default-src がないCSPでは、明示していない種類のリソースはどこからでも読み込めてしまいます。default-src 'self' などの安全な初期値を置くと「書き忘れたら閉じる」設計になります。ただし frame-ancestors・base-uri・form-action は継承しないため、別に指定が必要です。

この記事のポイント

  • default-srcは、個別指定のないフェッチディレクティブ(script-src、img-src、connect-src、font-src、object-src、frame-src など)の既定値です。
  • default-srcがないと、明示していない種類のリソース(画像・通信先・フォント等)は無制限になり、情報流出の経路が残ります。
  • frame-ancestors・base-uri・form-action・sandbox・upgrade-insecure-requests・report-to はdefault-srcを継承しません。
  • 'none' は最も厳格な許可リスト型、'self' は自前サーバー中心の自治体サイトで導入しやすい現実的な初期値です。
  • セキュリティAIチェッカーはdefault-srcがあれば○、CSPはあるがdefault-srcがなければ△と判定します(値の安全性は別項目で評価)。
診断項目名CSPのdefault-src
項目IDheaders.csp-default
分類コンテンツセキュリティポリシー(CSP)
重大度・配点の重み中(medium) 重み 2
関連する標準・ガイドラインOWASP ASVS 5.0.0 V3.4.3(L2)、OWASP WSTG-CONF-12(「制限的なdefault-srcの欠如」を弱点として列挙)、W3C CSP Level 3 §6.1.3 default-src

CSPのdefault-srcとは

CSPのdefault-srcとは、Content Security Policy(CSP)のフェッチディレクティブが個別に指定されていないときに使われる**既定値(フォールバック)**です。

対象となるフェッチディレクティブには、script-src、style-src、img-src、connect-src、font-src、object-src、media-src、frame-src、worker-src、manifest-src などがあります。これらを書いていない種類のリソースには、default-src の値がそのまま適用されます。

Content-Security-Policy: default-src 'self'; script-src 'self' https://www.googletagmanager.com

逆に、default-src がないCSPでは、明示していない種類のリソースはどこからでも読み込めてしまいます。

セキュリティAIチェッカーのこの項目は、CSPに default-src が定義され、未指定の種類のリソースに安全な初期値が適用されているかを確認します。CSPそのものの有無は「Content Security Policy」、default-src の値が広すぎないかは「CSPの過剰なワイルドカード」で確認します。

default-srcはなぜ必要か(フォールバックの仕組み)

default-srcがあるときとないときの違い

W3C CSP3 は、default-src があれば、その値をポリシーの既定のソースリストとして使うと定めています。たとえば default-src 'none'; script-src 'self' では、スクリプトは同一オリジンのみ、その他(画像・通信・フォント等)はすべて禁止になります。

一方、default-src がない次のような例を考えます。

Content-Security-Policy: script-src 'self'

この場合、スクリプトは制限されますが、それ以外のフェッチ系はすべて無制限になります。

ディレクティブ対象default-srcがない場合
connect-srcfetch/XHR/WebSocketの通信先無制限
img-src画像無制限
style-srcスタイルシート無制限
font-srcWebフォント無制限
object-srcプラグインコンテンツ無制限
frame-srcページ内に埋め込むiframe無制限

CSP3の「Exfiltration(情報流出)」の節でも、ポリシーの流出防止能力は、最も緩いディレクティブで決まると説明されています。スクリプトだけを厳しくしても、通信先や画像の読込先が無制限なら、情報を外へ送る経路は開いたままです。

default-srcにフォールバックしないディレクティブ

次のディレクティブは default-src を継承しないため、default-src を設定しても別途指定が必要です。

  • frame-ancestors(埋め込み元の制限)。CSP3 と MDN が「default-src 'none' でも誰でも埋め込める」と明記しています。
  • base-uri(<base> 要素の制限)
  • form-action(フォーム送信先の制限)
  • sandbox、upgrade-insecure-requests、report-to などの文書ディレクティブ・報告ディレクティブ

このため、default-src だけでなく、object-src 'none'、base-uri、form-action、frame-ancestors を明示するのが推奨です。ASVS V3.4.3 は、最低限 object-src 'none' と base-uri 'none' を要求しています。これらの有無は「CSPの基幹ディレクティブ」、埋め込み制限は「クリックジャッキング対策」で確認します。

default-src 'none' と 'self' のどちらを選ぶか

値特徴向いている構成
'none'最も厳格。必要な種類だけを個別に開ける「許可リスト」型。Mozilla HTTP Observatory はボーナス(+10)を与えています読み込む資源の種類と配信元を把握できているサイト
'self'同一オリジンを既定で許可自前サーバーから画像・CSS・JSを配信する自治体サイトの、導入しやすい現実的な初期値

default-srcについてよくある誤解

  • 「default-src * でもdefault-srcがあるので安全」:ワイルドカードは何も制限しません(「CSPの過剰なワイルドカード」で減点されます)。
  • 「strict CSP(nonce+'strict-dynamic')ならdefault-srcは不要」:スクリプトの制御としてはその通りで、Google推奨のstrict CSPは default-src を持たないこともあります。ただし、通信先・画像等の流出経路は開いたままになるため、この診断では既定値の明示を推奨として扱い、△(部分点)にとどめています。

CSPのdefault-srcの診断基準(セキュリティAIチェッカー)

取得対象

  • トップページの最終応答の Content-Security-Policy ヘッダー(カンマ区切りの複数ポリシーを個別に分解)と、HTML内のmeta CSPを対象にします。
  • 各ポリシーを ; で分割し、ディレクティブ名が default-src と一致するものを探します(大文字小文字は区別しません)。

判定条件

判定条件得点への影響
○ 問題なし(pass)いずれかのポリシーに default-src ディレクティブがある2点
△ 要確認(warn)CSPはあるが、どのポリシーにも default-src がない2×0.45=0.9点
対象外(na)CSPがヘッダーにもmetaにもない採点に計上しない

default-src の値の安全性(* や https: などの広すぎる許可、'unsafe-inline' など)は、この項目では評価しません。次の項目で評価します。

自治体サイトでの判定例

CSP判定補足
default-src 'self'; script-src 'self' https://www.googletagmanager.com○—
script-src 'self'; style-src 'self'△画像・通信先が無制限
frame-ancestors 'self'△「Content Security Policy」も△
default-src * 'unsafe-inline'○ただしワイルドカード・unsafe-inlineの項目で減点
ヘッダー frame-ancestors 'self' + meta default-src 'self'○metaのポリシーも併せて強制される

default-srcがないとどんなリスクがあるか

  • 情報の外部送信(エクスフィルトレーション):XSSやHTMLインジェクションが起きた際、connect-src や img-src が無制限だと、入力内容やCookie以外の画面情報を攻撃者のサーバーへ送れます。
  • 想定外のリソースの読込:未指定の object-src によるプラグインコンテンツ、frame-src による外部ページの埋め込み、font-src・media-src 経由の追跡などを止められません。
  • 設定漏れの温床:新しいディレクティブや新しい外部サービスを追加したときに、明示し忘れた種類が無制限のまま残ります。default-src を置くことで、「書き忘れたら閉じる」安全側の設計になります。

default-srcの設定方法(Apache・nginx・IIS・Next.js)

追加の手順

  1. 現在のCSPに default-src 'self' を追加し、Report-Onlyで違反を確認します。既存の強制ポリシーはそのままにして、Report-Only を別のヘッダーで併用できます。
  2. 違反レポートから、外部の画像・フォント・通信先(解析ツール、地図、動画、翻訳サービス)を洗い出し、img-src、font-src、connect-src、frame-src に個別に追加します。
  3. 違反がなくなったら、強制ポリシーへ反映します。
  4. 余力があれば default-src 'none' にして、必要な種類だけ開ける許可リスト型へ進めます。
  5. フォールバックしない object-src 'none'、base-uri 'self'、form-action 'self'、frame-ancestors 'self' も同時に明示します。

Apache(.htaccess)

<IfModule mod_headers.c>
  Header always set Content-Security-Policy "default-src 'self'; script-src 'self' https://www.googletagmanager.com; img-src 'self' data: https://www.google-analytics.com; connect-src 'self' https://www.google-analytics.com; frame-src https://www.youtube.com https://www.google.com; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'self'"
</IfModule>

nginx

add_header Content-Security-Policy "default-src 'self'; img-src 'self' data:; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'self'" always;

IIS

<add name="Content-Security-Policy" value="default-src 'self'; img-src 'self' data:; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'self'" />

Next.js(Vercel)

公式ガイドの例は、default-src 'self' を起点に、img-src 'self' blob: data:、font-src 'self'、object-src 'none'、base-uri 'self'、form-action 'self'、frame-ancestors 'none' を明示する構成です。外部サービスを使う場合は、connect-src・img-src に該当ドメインを追加します。

const csp = [
  "default-src 'self'",
  "script-src 'self'",
  "img-src 'self' blob: data:",
  "font-src 'self'",
  "object-src 'none'",
  "base-uri 'self'",
  "form-action 'self'",
  "frame-ancestors 'none'",
].join('; ');

サイトを壊さないための注意点

  • default-src 'self' を追加すると、それまで暗黙に許されていた外部画像・Webフォント・地図タイル・動画埋め込みが止まります。必ずReport-Onlyで確認してから強制してください。
  • data: を img-src に許可するのは一般的ですが、script-src には許可しないでください。
  • 既にmeta CSPがある場合、ヘッダーとmetaの両方が適用され、より厳しい側が効きます。片方だけ更新して表示が崩れることがあるため、どちらで管理するかを一本化します。

設定後の確認方法

curl -sI https://www.example.lg.jp/ | grep -i '^content-security-policy' | grep -io 'default-src[^;]*'

default-src の値が表示されれば、ヘッダーに既定値が設定されています。meta CSPで管理している場合は、HTMLソースの meta 要素も確認してください。設定を変えたら、セキュリティAIチェッカーで再診断し、この項目が○になっていることを確認します。

よくある質問(FAQ)

CSPのdefault-srcは何のために書くのですか?

個別に指定していない種類のリソースに適用する既定値を決めるためです。default-src がないと、script-src だけを書いたCSPでも画像・通信先・フォントなどは無制限のままになります。

default-srcは 'self' と 'none' のどちらがよいですか?

'none' が最も厳格で、必要な種類だけを個別に開ける許可リスト型です。'self' は同一オリジンを既定で許可するため、自前サーバーから画像・CSS・JSを配信する自治体サイトでは導入しやすい初期値です。まず 'self' で始め、余力があれば 'none' に進める方法が現実的です。

default-src 'none' にすればframe-ancestorsも制限されますか?

制限されません。frame-ancestors は default-src を継承しないため、default-src 'none' でも誰でも埋め込める状態のままです。base-uri や form-action も同様なので、別に明示する必要があります。

default-src * でもdefault-srcがあれば安全ですか?

安全ではありません。ワイルドカードは何も制限しません。セキュリティAIチェッカーのこの項目は default-src の有無だけを見て○にしますが、* は「CSPの過剰なワイルドカード」で減点されます。

strict CSP(nonceと 'strict-dynamic')ならdefault-srcは不要ですか?

スクリプトの制御としては不要で、Google推奨のstrict CSPは default-src を持たないこともあります。ただし通信先や画像などの流出経路は開いたままになるため、セキュリティAIチェッカーは既定値の明示を推奨とし、ない場合は△(部分点)にとどめています。

default-src 'self' を追加するとサイトが壊れませんか?

それまで暗黙に許されていた外部画像・Webフォント・地図タイル・動画埋め込みが止まることがあります。必ずReport-Onlyで違反を確認し、必要な配信元を img-src や connect-src などに個別に追加してから強制してください。

セキュリティAIチェッカーを利用する

この項目を含む127項目を、URLを入れるだけで無料診断します。

参考資料