なぜ危ないのか
AIはフォームを含むHTMLを生成するとき、トレーニングデータに含まれていたサードパーティのフォームサービスURLをaction属性のサンプルとして出力することがあります。指示しない限りAIは「使いやすいサンプル」として外部URLを選ぶ傾向があり、そのまま使うと送信先が制作者の管理外になります。
フォーム送信先の問題はAPIキーと異なり、パスワードのような見た目の特徴がないため自動検出が難しいです。URLとして有効な文字列がaction属性に入っているだけなので、grepパターンも工夫が必要です。プロンプトで生成を防ぐことが最もコスパの高い対策です。
- 相手がログインなしで開ける状態か確認する
- PCとスマホで最低1回ずつ表示を確認する
- 内部情報・個人情報・不要な外部送信が残っていないか見る
- レビュー期限と修正時の差し替え方を決めておく
ソースで見る場所
`grep -n 'action="https\?://'`を実行してhttpから始まるaction属性を検出します。`formspree`・`zapier`・`netlify`・`make.com`・`n8n`などのサービス名でも追加検索することで、主要な自動化サービスへの送信を漏れなく捕捉できます。
JavaScriptファイル内のfetch呼び出しは`grep -n 'fetch(\|axios.post\|XMLHttpRequest'`で一覧できます。URLが文字列リテラルとして書かれている場合はその場で確認でき、変数に分離されている場合は変数名を追ってファイル内を検索します。
- HTML内の外部script・form action・iframeを確認する
- APIキーやトークンらしき文字列がないか検索する
- 画像・CSS・JSのパスが公開後も解決できるか見る
- noindexと認証を混同せず、必要なら両方設定する
安全に共有する設定
スキャンでクリーンと確認できたHTMLは、ギガサイト便などのパスワード保護共有サービスに上げることでアクセスを制限します。URLを知っているだけでは開けない状態にすることで、万一フォームが動作する状態で渡しても入力者が限定されます。
スキャン結果を共有メッセージに添付する形式(例:「外部フォーム送信先: 0件確認済み」)をチームの標準テンプレートにしておくと、受け取った側も安心してレビューに集中できます。自動スキャンを使っていれば、その旨とスキャンコマンド・結果を貼り付けるだけで完了します。
- HTML内の外部script・form action・iframeを確認する
- APIキーやトークンらしき文字列がないか検索する
- 画像・CSS・JSのパスが公開後も解決できるか見る
- noindexと認証を混同せず、必要なら両方設定する
再発防止ルール
フォームを含むHTMLをAIに生成させるプロンプトには、「フォームのaction属性は必ず`action="#"`とし、外部URLを絶対に出力しないこと」と明示します。複数のAIツールを使うチームでは、この指示をプロンプトスニペットとして共有ドキュメントに登録しておきます。
公開前のスキャンはnpmスクリプトやMakefileのタスクとして登録し、`npm run check:forms`一発で実行できるようにします。コマンドが定義されていることでチームへの浸透が早まり、属人的なチェック作業から脱却できます。
- HTML内の外部script・form action・iframeを確認する
- APIキーやトークンらしき文字列がないか検索する
- 画像・CSS・JSのパスが公開後も解決できるか見る
- noindexと認証を混同せず、必要なら両方設定する
よくある質問
AIに指示しても外部URLが出力される場合、どう対処しますか?
出力されたURLをそのまま使わず、エディタのfind-replaceでaction="#"に一括置換します。その後grepで外部URLが残っていないことを確認してから共有してください。
netlify.appドメインが自社のNetlifyサイトの場合、ブロックすべきですか?
自社管理のNetlifyサイトであれば問題ありませんが、URLを目視で確認して間違いなく自分のアカウントのサイトであることを確認してください。サブドメインが似ているだけの第三者サイトの場合があります。
スキャンを自動化する際、CIで使えるOSSツールはありますか?
gitleaksはAPIキーに特化していますが、カスタムルールを追記することでフォームURLの検出にも使えます。また、htmlhintのカスタムルールでaction属性を制限することも可能です。