なぜ危ないのか
AIへのプロンプトでフォームの仕様を詳しく説明するほど、AIはその仕様をhidden inputのvalue属性に反映しようとします。例えば「ユーザーIDは123、ロールはadminで管理者用フォームを作って」と指示すると、`<input type="hidden" name="userId" value="123">`と`<input type="hidden" name="role" value="admin">`がそのまま生成されます。プロンプトに含めた値が出力に転写されるリスクを常に意識する必要があります。
AIが「説得力のある」サンプルデータを自律的に生成する場合も問題です。AIは架空とわかりやすいダミー値ではなく、実在しそうなID番号やメールアドレス形式の値を生成する傾向があります。これがそのまま共有HTMLに残ると、受け取る側が「実際のデータ?」と疑念を持つ状況が生まれます。
- 相手がログインなしで開ける状態か確認する
- PCとスマホで最低1回ずつ表示を確認する
- 内部情報・個人情報・不要な外部送信が残っていないか見る
- レビュー期限と修正時の差し替え方を決めておく
ソースで見る場所
AIから受け取ったHTMLを保存したら、`grep -n 'type="hidden"' output.html`を実行してhidden inputが存在するかを確認します。存在する場合は行番号とともに表示されるため、その行のvalue属性の中身を確認します。value属性が空でない場合は内容を記録し、問題の有無を判定してください。
JavaScriptでhidden inputを動的に生成するコードがある場合、静的なgrepでは検出できません。AIが生成したJavaScriptに`createElement('input')`や`insertAdjacentHTML`のような動的生成コードが含まれていないかも確認し、含まれている場合はブラウザでページを描画した後にDevToolsのDOMを確認する必要があります。
- HTML内の外部script・form action・iframeを確認する
- APIキーやトークンらしき文字列がないか検索する
- 画像・CSS・JSのパスが公開後も解決できるか見る
- noindexと認証を混同せず、必要なら両方設定する
安全に共有する設定
プロンプトに追加すべき指示は「フォームに含まれるhidden inputのvalue属性はすべて空にすること(value="")」「モックデータには実在する形式の値を使わず、明らかに架空とわかる値(例:user_id_placeholder、test@example.com)を使うこと」の二点です。この指示をシステムプロンプトやプロンプトテンプレートに追加しておくと毎回の指定が不要になります。
公開前スキャンスクリプトとして、`grep -E 'type=["'\''"hidden["'\''"]' output.html | grep -v 'value=""' | grep -v "value=''"` を実行し、空でないvalue属性を持つhidden inputを検出します。出力が空なら問題なし、何か出力されたら要確認という判定が直感的に使えます。
- HTML内の外部script・form action・iframeを確認する
- APIキーやトークンらしき文字列がないか検索する
- 画像・CSS・JSのパスが公開後も解決できるか見る
- noindexと認証を混同せず、必要なら両方設定する
再発防止ルール
hidden inputスキャンをCI/CDに組み込む場合は、デプロイ前ステップとして前述のgrepコマンドをシェルスクリプト化し、マッチがあった場合に終了コード1を返すようにします。GitHub ActionsやBitbucketパイプラインであれば、このステップの失敗をデプロイのブロック条件にできます。
定期的なセキュリティレビューの際にhidden inputの確認を議題として加えます。特に仕様変更に伴いAIに再生成させたHTMLが増えたタイミングや、新しいフォームを追加した直後はリスクが高まるため、重点的に確認するルーティンを作ってください。
- HTML内の外部script・form action・iframeを確認する
- APIキーやトークンらしき文字列がないか検索する
- 画像・CSS・JSのパスが公開後も解決できるか見る
- noindexと認証を混同せず、必要なら両方設定する
よくある質問
AIへの指示でvalue属性を空にしても、JavaScriptで後から値を入れることはありますか?
はい。AIが生成するJavaScriptが`document.getElementById('hidden').value = '実際の値'`のようにコードで値を設定する場合があります。HTMLだけでなくJSのコードも確認する必要があります。
スキャンスクリプトが架空のダミー値を「問題なし」と判定するよう調整できますか?
許可するダミーパターン(例:`placeholder`や`example`を含む値)をホワイトリストとしてgrepの除外条件に加えることで、ダミー値は通過させて実際のデータのみを検出するスクリプトを作れます。
hidden inputのスキャンはHTMLだけでなくPHPやTwigなどのテンプレートファイルも対象にすべきですか?
サーバーサイドテンプレートにhidden inputが書かれている場合は、生成後のHTMLだけでなくテンプレートファイル自体もスキャン対象にすることを推奨します。特にvalueにサーバー変数が展開される箇所は重点的に確認してください。