セキュリティ

社外レビュー前にWebhook URLを検出するチェックリスト

AIが生成したHTMLをそのまま社外に送ってしまうと、コード内に残ったWebhook URLが第三者に悪用されるリスクがある。SlackやDiscordのIncoming Webhook URLは一度漏れると誰でも任意のメッセージを投稿でき、通知チャンネルが乗っ取られる。公開前に必ず実施すべきチェック項目を工程ごとに整理した。

なぜ危ないのか

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が含まれることがあるため、差分だけでなくファイル全体を対象に再検索することが重要だ。

関連記事

「セキュリティ」の記事をもっと見る →