なぜ危ないのか
AIコーディングツールはサンプルや動作確認用にWebhook URLをHTMLへ直接埋め込むことがある。生成後に削除し忘れると、そのHTMLを受け取った社外の人物がソースを参照しただけでURLを取得できてしまう。SlackのIncoming Webhook URLは認証不要で誰でも投稿できる仕様のため、競合他社や悪意ある第三者がチャンネルにメッセージを送り込めるようになる。
さらに深刻なのは、Webhookエンドポイントによってはペイロードの内容からプロジェクト名・チーム構成・通知内容が推測できる点だ。レビュー依頼メールと添付HTMLがセットで流出した場合、内部の進捗状況や意思決定プロセスまで露見するリスクがある。公開前に必ずソースを確認し、URLが残っていないことを人間の目で検証する習慣をつけること。
- 相手がログインなしで開ける状態か確認する
- PCとスマホで最低1回ずつ表示を確認する
- 内部情報・個人情報・不要な外部送信が残っていないか見る
- レビュー期限と修正時の差し替え方を決めておく
ソースで見る場所
HTMLファイルをテキストエディタで開き、`hooks.slack.com`・`discord.com/api/webhooks`・`webhook.site` などのキーワードでファイル全体を検索する。JavaScriptのfetch呼び出しや変数宣言の中に紛れていることが多い。`<script>`タグ内はもちろん、HTML属性のdata-*やonclick文字列にも埋め込まれている場合があるため、単純なURL形式だけでなく `https://hooks` のプレフィックスで正規表現検索するのが確実だ。
フォームの`action`属性も見落としがちなポイントだ。`<form action="https://hooks.slack.com/...">`のようにWebhookを直接送信先にしているケースがあり、メールフォームのデモHTMLに多い。加えてインラインJSの中でBase64エンコードされているケースは目視では見つけにくいため、ブラウザの開発者ツールでNetworkタブを開き、ページを再読み込みしてリクエスト先URLを確認する方法も組み合わせると検出精度が上がる。
- HTML内の外部script・form action・iframeを確認する
- APIキーやトークンらしき文字列がないか検索する
- 画像・CSS・JSのパスが公開後も解決できるか見る
- noindexと認証を混同せず、必要なら両方設定する
安全に共有する設定
Webhook URLが検出された場合は、URLをプレースホルダ文字列(例:`WEBHOOK_URL_REMOVED`)に置換した上でHTMLを再生成し、差し替え後のファイルのみを共有する。元のHTMLはローカルに保管し、レビュアーには置換済みファイルだけを渡すこと。ギガサイト便のようなプレビュー共有サービスを使う場合も、アップロード前にこの置換を完了させる必要がある。
共有リンクにはパスワードまたはメール認証を設定し、URLを知っている全員が閲覧できる状態を避ける。特に社外レビューでは、レビュアーのメールアドレスを事前に登録して認証を必須にすることで、誤転送による漏えいリスクを最小化できる。有効期限も24〜72時間に設定し、レビュー完了後はリンクを無効化すること。
- HTML内の外部script・form action・iframeを確認する
- APIキーやトークンらしき文字列がないか検索する
- 画像・CSS・JSのパスが公開後も解決できるか見る
- noindexと認証を混同せず、必要なら両方設定する
再発防止ルール
AI生成HTMLを社外共有する際のルールをチーム内でドキュメント化し、チェックリストを共有フォルダに置く。具体的には「公開前にVS Codeの全文検索で`hooks.`と`webhook`を検索する」「検索結果ゼロを確認してからアップロードする」という2ステップを標準手順に組み込む。GitHubに上げているなら`git-secrets`や`gitleaks`を導入してプッシュ前に自動検出する構成も有効だ。
AIへのプロンプトにも制約を追加するとよい。「外部APIへのリクエストを含める場合はURLを環境変数名に置き換えること」と明示してからHTML生成を依頼すると、AIが`process.env.WEBHOOK_URL`のような形で出力し、実URLがソースに残らなくなる。生成後の確認コストが大幅に下がるため、プロンプトテンプレートとしてチームで共有しておくことを推奨する。
- HTML内の外部script・form action・iframeを確認する
- APIキーやトークンらしき文字列がないか検索する
- 画像・CSS・JSのパスが公開後も解決できるか見る
- noindexと認証を混同せず、必要なら両方設定する
よくある質問
Webhook URLが漏えいした場合、どうすれば被害を止められますか?
SlackやDiscordの管理画面で該当のWebhookを即座に削除または再生成する。削除すると既存URLへのリクエストはすべて無効になるため、正規の送信側も新URLに切り替える必要がある。
Base64エンコードされたWebhook URLはどうやって検出しますか?
ブラウザの開発者ツールでNetworkタブを開き、ページ操作後に外部ドメインへのPOSTリクエストが発生していないか確認する。`hooks.slack.com`などへの通信があれば、ソース内でBase64デコードが行われている可能性が高い。
社外レビュー後にHTMLを修正した場合、再チェックは必要ですか?
修正のたびにWebhookキーワード検索を実施する。修正でAIに追加生成させた部分に新たなURLが含まれることがあるため、差分だけでなくファイル全体を対象に再検索することが重要だ。