• 診断項目 No.46/127
  • HTML・JavaScript・外部資産
  • 重大度 中(medium)

外部スクリプト配信元を限定するには?配信ホスト数のリスク・集約方法・診断基準

外部スクリプト配信元を限定するとは、JavaScriptを読み込む外部ホストの種類を必要最小限に絞ることです。配信元の数がリスクになる理由、失効ドメインの乗っ取り、台帳化・集約・CSPでの許可リスト化と診断基準を解説します。

結論(外部スクリプト配信元を限定)

外部スクリプト配信元を限定するとは、Webページが外部JavaScriptを読み込むホスト(ドメイン)の種類を必要最小限に絞ることです。配信ホストの1つ1つが、自サイトのページで任意のコードを実行できる信頼の境界になるため、数が増えるほど侵害・ドメイン失効・提供終了のリスクを負う相手が増えます。セキュリティAIチェッカーは、トップページの配信元が4ホスト以下なら○、5ホスト以上なら△と判定します。

この記事のポイント

  • 同じ件数の外部スクリプトでも、配信元が1つか7つかで、リスクを負う相手の数が違います。
  • 利用終了したサービスのタグが残っていると、失効したドメインを第三者が取得して任意のコードを配信できます。
  • 配信元が多いほどCSPの script-src の許可リストが肥大化し、緩くなりがちです。
  • 判定はホスト名単位で、4ホスト以下が○、5ホスト以上が△です。4ホストは運用上の目安です。
  • 配信元の台帳を作り、不要タグの削除・汎用CDNからの自己ホスト移行・CSPの許可リスト化で絞り込みます。
診断項目名外部スクリプト配信元を限定
項目IDhtml.external-hosts
分類HTML・JavaScript・外部資産
重大度・配点の重み中(medium) 重み 2
関連する標準・ガイドラインOWASP ASVS 5.0.0 V3.6.1(L3: 外部ホスト資産の条件)/OWASP Third Party JavaScript Management Cheat Sheet/CWE-829(信頼できない制御領域からの機能の取り込み)

外部スクリプト配信元を限定するとは

外部スクリプト配信元を限定するとは、Webページが外部JavaScriptを読み込むホスト(ドメイン)の種類を、必要最小限に絞ることです。

外部JavaScriptを読み込むとき、そのファイルを配信するホスト1つ1つが、自治体サイトのページで任意のコードを実行できる「信頼の境界」になります。同じ件数のスクリプトでも、1つのCDNから配信されている場合と、7つの異なる事業者から配信されている場合とでは、侵害・ドメイン失効・提供終了などのリスクを負う相手の数が違います。

セキュリティAIチェッカーのこの項目は、トップページで読み込まれている外部JavaScriptの配信元ホスト名の種類数を数え、信頼する相手が増えすぎていないかを確認します。件数は「外部JavaScript依存数」で、改ざん検知は「外部JavaScriptのSRI」で別に評価します。

ホスト名とオリジンの数え方

この項目ではホスト名(例: www.googletagmanager.com)を単位に数えます。同一事業者でも www.google-analytics.com と www.googletagmanager.com は別ホストとして数えます。ポートやスキームは区別しません。

外部スクリプトの配信元の数がなぜリスクになるのか

  • 侵害されうる相手の数:配信元の事業者のサーバー、CDNアカウント、ビルド環境のどれか1つが侵害されれば、悪性コードが配信されます。
  • ドメインの失効・譲渡:サービス終了後にドメインが失効し、第三者に再取得されると、そのドメインから任意のスクリプトを配信できます。2024年のpolyfill.ioの事例では、ドメインと配信サービスが第三者に売却された後に配信スクリプトが改変され、Sansecの報告では、このスクリプトを埋め込んでいた10万を超えるサイトが影響を受けました。
  • CSPの許可リストの肥大化:配信元が多いほど、Content Security Policyの script-src に列挙するオリジンが増え、許可リストが緩くなりがちです。特に、任意の利用者がファイルを置けるCDN(汎用のnpm配信CDNなど)をドメイン単位で許可すると、そこに置かれた別のファイルも実行を許すことになります。CSPのワイルドカードは「CSPの過剰なワイルドカード」で確認します。
  • データの送信先の増加:OWASPのチートシートが指摘するとおり、外部スクリプトを読み込むたびにブラウザはその配信元へ直接接続し、リファラーなどの情報を送ります。

外部スクリプト配信元を限定の診断基準(セキュリティAIチェッカー)

取得対象

  • 入力URLのリダイレクト後の最終URLのHTML本文(最大2MB)を対象にします。
  • 「外部JavaScript依存数」と同じ外部JavaScriptの集合(<script ... src="..."> のうち、解決後のオリジンがページと異なるもの)から、ホスト名を重複なく集めます。HTMLに直接書かれていないスクリプト(タグマネージャー経由など)は含まれません。

判定条件

判定条件得点への影響
○ 問題なし(pass)外部スクリプト配信元が4ホスト以下(0を含む)重み2を満点で加算
△ 要確認(warn)外部スクリプト配信元が5ホスト以上重み2×0.45
  • この項目に×(fail)と対象外(na)はありません。外部スクリプトがないサイトは0ホストとして○になります。
  • 4ホストという閾値は、アクセス解析、タグマネージャー、アクセシビリティ支援、地図程度の一般的な構成を許容するための運用上の目安であり、標準規格で定められた数値ではありません。
  • 根拠欄には配信元ホスト数を表示します。重大度はmedium、重みは2です。

自治体サイトでの判定例

外部スクリプトの配信元ホスト数判定
www.googletagmanager.com、翻訳サービス、読み上げサービス3○
上記に加え、SNS(2社)、地図API、チャットボット事業者、汎用CDN8△
すべて自サイトから配信0○
自治体管理の cdn.city.example.lg.jp のみ1○(別オリジンとして1ホストに数える)

検出の限界

  • 実行時に動的に読み込まれるスクリプトの配信元は数えないため、実際の配信元はこれより多いことがあります。タグマネージャーを使っているサイトでは、タグマネージャーの管理画面で配信先の一覧を確認してください。
  • 同じ事業者の複数のホストは別々に数え、異なる事業者が同じCDNを共有している場合は1つとして数えます。数は「信頼する相手の数」の近似値です。
  • 配信元の信頼性そのもの(契約の有無、ドメインの管理状況)は外部から判定できません。

配信元を評価する観点

観点確認内容
ドメインの管理者契約先の事業者が保有しているか。更新期限の管理は誰がしているか
配信形態事業者専用のホストか、誰でもファイルを置ける汎用CDNか
代替可能性自己ホスト、iframe埋め込み、リンクへの置き換えが可能か
停止時の影響配信元が停止・失効したとき、ページのどの機能が止まるか
インシデント時の連絡先改ざんが疑われたとき、誰にどう連絡するか

台帳には、ホスト名ごとにこれらの観点を記録し、利用終了時にHTMLとタグマネージャーの両方からタグを削除したことを確認する欄を設けると、失効ドメインの乗っ取りを防ぎやすくなります。

外部スクリプトの配信元が多いとどんなリスクがあるか

  • 一点突破による全利用者への影響:配信元のどれか1つが侵害されれば、トップページを開いたすべての利用者が影響を受けます。英国ICOは、Ticketmasterの決済ページに置かれた第三者のチャットボットのスクリプトが悪用された2018年の事案で、2020年に125万ポンドの制裁金を科しています。
  • 失効ドメインの乗っ取り:過去に使っていたサービスのドメインが失効し、スクリプトタグだけがHTMLに残っている場合、第三者がドメインを取得すると任意のコードを配信できます。
  • 管理責任の所在不明:配信元が多いと、どの課の誰が導入し、どの契約で、何のデータが送られているかが分からなくなり、インシデント時の切り分けが遅れます。
  • 個人情報・閲覧情報の第三者提供:配信元ごとに利用者の閲覧情報が送信されるため、自治体のプライバシーポリシーや外部送信規律に関する説明との整合が必要になります。

外部スクリプト配信元を限定する方法(一覧化・集約・CSP)

1. 配信元の一覧化

curl -s https://www.city.example.lg.jp/ \
  | grep -o -i -E '<script[^>]*src="(https?:)?//[^"/]+' \
  | sed -E 's#.*//##' | sort | uniq -c | sort -rn

ブラウザの開発者ツール「ネットワーク」タブで種類「JS」に絞り、「ドメイン」列を表示すると、タグマネージャー経由で読み込まれる配信元も含めて確認できます。

2. 集約・削減の方針

状況対応
同じライブラリを複数のCDNから読み込んでいる1か所に統一、または自己ホスト
汎用CDN(誰でもファイルを置けるもの)からの読み込み版を固定して自己ホストへ移行
利用を終了したサービスのタグが残っている削除(ドメイン失効時の乗っ取り対策)
機能ごとに別事業者のスクリプト必要なページだけで読み込む、iframe埋め込み方式を優先
解析タグが複数1つの仕組みに統一

3. CSPで許可する配信元を明示

配信元の台帳ができたら、そのままCSPの許可リストにします。ホスト単位で必要最小限を列挙し、汎用CDNはドメイン全体ではなくパスまで限定することも検討します(CSPのソース式はパス指定に対応していますが、リダイレクト後はパス部分が照合されない点に注意)。

Apache(.htaccess)

<IfModule mod_headers.c>
  Header always set Content-Security-Policy-Report-Only "script-src 'self' https://www.googletagmanager.com https://translate.example-vendor.jp; object-src 'none'; base-uri 'self'; report-uri /csp-report"
</IfModule>

nginx

add_header Content-Security-Policy-Report-Only "script-src 'self' https://www.googletagmanager.com https://translate.example-vendor.jp; object-src 'none'; base-uri 'self'; report-uri /csp-report" always;

IIS(web.config)

<httpProtocol>
  <customHeaders>
    <add name="Content-Security-Policy-Report-Only"
         value="script-src 'self' https://www.googletagmanager.com https://translate.example-vendor.jp; object-src 'none'; base-uri 'self'" />
  </customHeaders>
</httpProtocol>

Next.js(Vercel)

// next.config.js
module.exports = {
  async headers() {
    return [{
      source: "/(.*)",
      headers: [{
        key: "Content-Security-Policy-Report-Only",
        value: "script-src 'self' https://www.googletagmanager.com; object-src 'none'; base-uri 'self'",
      }],
    }];
  },
};

違反の報告先の設定は「CSP違反の報告先」で確認します。

4. 段階的な削減手順

  1. 一覧化した配信元ごとに、担当課へ「現在も必要か」「代替手段はあるか」を照会する
  2. 不要と確認できたタグを、HTMLテンプレートとタグマネージャーの両方から削除する
  3. 版固定できるライブラリを自己ホストへ移し、汎用CDNへの依存をなくす
  4. 残った配信元をCSPのReport-Onlyに列挙し、1〜2週間ほど違反の有無を観察する
  5. 違反がなければCSPを強制に切り替え、以後は台帳の更新とCSPの更新を同じ手続きで行う

5. 運用ルール

  • 外部スクリプトの追加は、目的・送信データ・契約・担当者を記載した申請と承認を経て行う
  • 年1回以上、台帳と実際の読み込みを突き合わせ、不要なものを削除する
  • 委託先(CMS保守事業者・制作会社)にも同じルールを契約で求める
  • 新規導入の審査では、既存の配信元で代替できないかを最初に確認する
  • サービスの利用終了時は、契約終了の手続きと同時にタグの削除を完了させ、ドメイン失効後にタグだけが残る状態を作らない

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

  • CSPはまずReport-Onlyで運用し、違反レポートやブラウザのコンソールで、許可漏れの配信元がないことを確認してから強制に切り替えてください。インラインスクリプトが多いCMSでは、script-src の強制で機能が停止することがあります。
  • タグマネージャーで配信しているタグは、タグマネージャー側の設定も整理しないと、HTMLから消しても読み込まれ続けます。
  • 翻訳・読み上げなどアクセシビリティ支援の削除は、利用者への影響が大きいため、代替手段を用意してから行ってください。

整理後はセキュリティAIチェッカーで再診断し、根拠欄の配信元ホスト数が4以下になったことを確認します。

よくある質問(FAQ)

外部スクリプトの配信元はいくつまでが目安ですか?

セキュリティAIチェッカーでは、トップページのHTMLに書かれた外部JavaScriptの配信元が4ホスト以下なら○、5ホスト以上なら△です。4ホストはアクセス解析・タグマネージャー・アクセシビリティ支援・地図程度の構成を許容する運用上の目安で、標準規格の数値ではありません。

外部JavaScript依存数とは何が違いますか?

「外部JavaScript依存数」はスクリプトの件数を、この項目は配信元ホスト名の種類数を数えます。同じCDNから10本読み込んでも配信元は1つですが、7社から1本ずつ読み込めば配信元は7つになります。

同じ会社の別ドメインは1つに数えますか?

別々に数えます。www.google-analytics.com と www.googletagmanager.com は別ホストです。逆に、異なる事業者が同じCDNを共有している場合は1つとして数えるため、数は「信頼する相手の数」の近似値です。

使わなくなったサービスのscriptタグを放置すると何が起きますか?

サービス終了後にドメインが失効し、第三者に再取得されると、そのドメインから任意のスクリプトを配信できます。契約終了と同時に、HTMLとタグマネージャーの両方からタグを削除してください。

汎用CDNをCSPでドメインごと許可してもよいですか?

任意の利用者がファイルを置ける汎用CDNをドメイン単位で許可すると、そこに置かれた別のファイルの実行も許すことになります。版を固定して自己ホストへ移すか、パスまで限定することを検討します。ただしリダイレクト後はパス部分が照合されない点に注意が必要です。

タグマネージャー経由の配信元も数えられますか?

数えられません。実行時に動的に読み込まれるスクリプトは対象外のため、タグマネージャーの管理画面や、ブラウザの開発者ツールのネットワークタブで配信元を確認してください。

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

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

参考資料