なぜ危ないのか
AIが大量のLPやHTMLを生成するパイプラインでは、1件ずつ目視確認することが困難です。1000件のうち1件にGA IDが混入していても見落とされる確率が高く、その1件が運悪く社外公開されるとデータ汚染が長期化します。
特定のプロンプトテンプレートにGA IDが埋め込まれていると、そのテンプレートを使い続けた全ての生成物に同じIDが混入します。テンプレートの問題に気づくまで数週間〜数ヶ月の汚染期間が発生するリスクがあります。
- 相手がログインなしで開ける状態か確認する
- PCとスマホで最低1回ずつ表示を確認する
- 内部情報・個人情報・不要な外部送信が残っていないか見る
- レビュー期限と修正時の差し替え方を決めておく
ソースで見る場所
生成ファイルをdistディレクトリに出力している場合、`grep -rl 'G-[A-Z0-9]{10}\|GTM-[A-Z0-9]+' dist/`でIDが含まれるファイルの一覧を取得できます。出力が空であれば混入なし、ファイル名が表示された場合はそのファイルを個別に確認します。
ダミーIDのパターン(`G-XXXXXXXXXX`)を誤検知しないよう、grep後に`grep -v 'G-XXXXXXXXXX\|G-YYYYYYYYYY'`でフィルタリングします。プロジェクトで使用するダミーパターンを除外リストに登録しておけば、CI上の誤検知アラートを防げます。
- HTML内の外部script・form action・iframeを確認する
- APIキーやトークンらしき文字列がないか検索する
- 画像・CSS・JSのパスが公開後も解決できるか見る
- noindexと認証を混同せず、必要なら両方設定する
安全に共有する設定
スキャンをパスしたファイルのみをギガサイト便にアップロードするスクリプトを作成します。`scan.sh`がexit code 0を返した場合のみ`upload.sh`を実行するif文を書けば、スキャン未通過のファイルが誤ってアップロードされるのを防げます。
ギガサイト便のAPI(または手動アップロード)で発行したURLをSlackに通知するスクリプトを組み合わせると、生成→スキャン→アップロード→通知の全工程が自動化されます。担当者はSlackの通知を受け取ってレビュー依頼メールを送るだけになります。
- HTML内の外部script・form action・iframeを確認する
- APIキーやトークンらしき文字列がないか検索する
- 画像・CSS・JSのパスが公開後も解決できるか見る
- noindexと認証を混同せず、必要なら両方設定する
再発防止ルール
AIプロンプトのシステムプロンプトに「`G-`・`GTM-`・`UA-`で始まる文字列は使用しないこと。アナリティクスやタグマネージャーのコードが必要な場合は`<!-- ANALYTICS_PLACEHOLDER -->`というコメントで代替すること」と明記します。
週次のバッチ処理で過去7日間に生成した全HTMLをスキャンし、IDが検出されたファイルのリストをSlackの管理チャンネルに投稿します。ゼロ件の通知が続けば問題なし、検出があれば即座に対応できます。このサイクルが安全運用の基盤になります。
- HTML内の外部script・form action・iframeを確認する
- APIキーやトークンらしき文字列がないか検索する
- 画像・CSS・JSのパスが公開後も解決できるか見る
- noindexと認証を混同せず、必要なら両方設定する
よくある質問
プロンプトにGA IDを含む例を与えた場合、AIはそのIDをそのまま出力しますか?
例として示したIDをそのまま出力するケースがあります。プロンプト例の中でIDが登場する場合は`G-XXXXXXXXXX`のようなダミー値を使い、「この値は絶対にそのまま出力しないこと」と補足してください。
GitHub Actionsでスキャンを自動化するYAMLの最小構成を教えてください。
`- name: Scan GA IDs`のステップに`run: grep -rE 'G-[A-Z0-9]{10}' dist/ | grep -v 'G-XXXXXXXXXX' && exit 1 || exit 0`と記述します。IDが見つかった場合にexit 1でジョブを失敗させ、見つからない場合はexit 0で成功とします。
スキャンで混入を検出したとき、修正はAIに任せてよいですか?
修正をAIに依頼する場合は「以下のHTMLからG-で始まるGA測定IDを全て削除してください」と具体的に指示します。ただし修正後も再度スキャンを実施して削除が完全かどうかを確認することが必須です。修正のみAIに任せて確認を省略するのは危険です。