セキュリティ

AI生成HTMLに外部フォーム送信先が残っていないか確認する方法

AIが生成したHTMLのフォームには、開発用のWebhookやサードパーティエンドポイントがaction属性に残ったまま公開されるケースがあります。入力データが意図しない外部サービスへ送られると情報漏えいに直結するため、公開前に必ず送信先を確認する習慣が必要です。

なぜ危ないのか

AI生成HTMLのフォームaction属性には、AIがサンプルとして使ったformspreeやmake.comのエンドポイントが残ることがあります。レビュアーがフォームに名前やメールを入力して送信すると、そのデータが制作者の管理外のサービスに届いてしまいます。社外のステークホルダーが個人情報を入力した場合はGDPR・個人情報保護法上の問題にもなりえます。

外部エンドポイントのURLは一見すると社内サーバーのように見えることもあります(例: `https://api.myapp.workers.dev/submit`)。ドメインが自社と無関係かどうか、action属性のURLをホワイトリストと照合する確認が欠かせません。

  • 相手がログインなしで開ける状態か確認する
  • PCとスマホで最低1回ずつ表示を確認する
  • 内部情報・個人情報・不要な外部送信が残っていないか見る
  • レビュー期限と修正時の差し替え方を決めておく

ソースで見る場所

HTMLをテキストエディタで開き、`<form`で検索してaction属性を全件抽出します。`action="`の後のURLをリストアップし、`localhost`・自社ドメイン以外が含まれていないか確認してください。action属性がなくても、JavaScriptで`fetch`や`XMLHttpRequest`を使って送信している場合があるため、`fetch(`と`XMLHttpRequest`も合わせて検索します。

ブラウザでHTMLを開き、開発者ツールのNetworkタブでフォームを実際に送信してみます(テストデータを使用)。送信先のURLがNetworkタブに表示されるため、予期しない外部ドメインへのPOSTリクエストが発生していないか一覧できます。

  • HTML内の外部script・form action・iframeを確認する
  • APIキーやトークンらしき文字列がないか検索する
  • 画像・CSS・JSのパスが公開後も解決できるか見る
  • noindexと認証を混同せず、必要なら両方設定する

安全に共有する設定

レビュー目的でフォームの見た目だけを確認してほしい場合、action属性を`#`に変更するかformタグにonsubmit="return false;"を追加します。これでフォームがどこにも送信されなくなり、UIのレビューに集中できます。変更箇所をコメントで明示しておくと、本番実装時に戻し忘れを防げます。

送信機能も含めてレビューしてもらう必要がある場合は、社内のダミーエンドポイントかPostbinのような一時的なモックサービスに向けます。受信したデータはレビュー終了後すぐに削除し、URLをレビュアー以外に共有しないようにしてください。

  • HTML内の外部script・form action・iframeを確認する
  • APIキーやトークンらしき文字列がないか検索する
  • 画像・CSS・JSのパスが公開後も解決できるか見る
  • noindexと認証を混同せず、必要なら両方設定する

再発防止ルール

AIへのプロンプトで「フォームのaction属性は必ず`#`またはプレースホルダURLを使い、実際のエンドポイントを出力しないこと」と指定します。フォームがあるHTMLを生成させるタスクでは、このルールをシステムプロンプトに組み込んでおくと効果的です。

HTMLをリポジトリにコミットする前に`grep -n 'action="http'`を実行するgit pre-commitフックを設定すると、外部httpエンドポイントが残ったままのコミットを自動ブロックできます。ローカルの確認作業を省力化しながら、チーム全体の安全基準を底上げできます。

  • HTML内の外部script・form action・iframeを確認する
  • APIキーやトークンらしき文字列がないか検索する
  • 画像・CSS・JSのパスが公開後も解決できるか見る
  • noindexと認証を混同せず、必要なら両方設定する

よくある質問

action属性が空の場合、フォームデータはどこに送られますか?

action属性が空文字または省略された場合、現在のページのURLにPOSTされます。静的HTMLであればそのままファイルパスに送信されエラーになりますが、意図しない動作を避けるためonsubmit="return false;"で明示的に無効化してください。

JavaScriptでfetchを使った送信はgrepで検出できますか?

fetch( やaxios.post(などのキーワードで検索すると送信処理を含む行を特定できます。URLが変数になっている場合は変数の定義箇所まで追って送信先ドメインを確認してください。

レビュー用のモックエンドポイントは何を使うと便利ですか?

Postbin(postb.in)やwebhook.siteが即座に使えるモックエンドポイントです。受信したリクエストをブラウザで確認でき、レビュー終了後にURLを破棄するだけで済みます。

関連記事

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