なぜ危ないのか
AIが生成したHTMLには、プロンプトの例示や学習データ由来のStripe公開キー・PayPal決済ボタンのコードが混入することがあります。受け取った相手がURLをクリックしただけで決済フローが起動するケースも存在し、意図しない課金トラブルや契約外の取引が発生するリスクがあります。
社外レビュー用URLを認証なしで共有した場合、受信者以外の第三者がリンクを踏む可能性があります。決済リンクに有効期限や使用回数制限が設定されていないと、悪意ある第三者が実際に購入を完了させてしまうため、公開前の確認は不可欠です。
- 相手がログインなしで開ける状態か確認する
- PCとスマホで最低1回ずつ表示を確認する
- 内部情報・個人情報・不要な外部送信が残っていないか見る
- レビュー期限と修正時の差し替え方を決めておく
ソースで見る場所
HTMLをテキストエディタで開き、`stripe.com`・`pay.line.me`・`checkout.square.site`など主要決済サービスのドメイン名を全文検索します。`<script src=`や`<form action=`に外部URLが含まれていないかも併せて確認し、発見した箇所は削除またはコメントアウトしてください。
ブラウザのDevToolsで「Network」タブを開きながらページをリロードし、外部ドメインへのリクエストが発生していないか実際の通信を目視確認します。`payment`・`checkout`・`order`などのパスを含むリクエストが出ていれば、HTMLのどこかに関連コードが残っています。
- HTML内の外部script・form action・iframeを確認する
- APIキーやトークンらしき文字列がないか検索する
- 画像・CSS・JSのパスが公開後も解決できるか見る
- noindexと認証を混同せず、必要なら両方設定する
安全に共有する設定
ギガサイト便のようなパスワード付きプレビューURLを使うと、URLを知っていても認証を突破しなければページにアクセスできません。期限付きリンクを設定すれば、レビュー期間終了後に自動でアクセス不能になるため、決済コードが残っていた場合でも被害を最小限に抑えられます。
共有前に`Content-Security-Policy`ヘッダーを設定し、許可していない外部ドメインへのスクリプト実行をブロックする方法も有効です。Cloudflare Pagesでは`_headers`ファイルに1行追加するだけで適用できるため、静的HTMLの配信環境でも導入のコストは低いです。
- HTML内の外部script・form action・iframeを確認する
- APIキーやトークンらしき文字列がないか検索する
- 画像・CSS・JSのパスが公開後も解決できるか見る
- noindexと認証を混同せず、必要なら両方設定する
再発防止ルール
AIへの指示文(プロンプト)に「決済処理コードは一切出力しないこと」「外部送信を伴うformタグは使わないこと」を明示的に記載します。これだけでAIが誤って決済SDKを挿入する頻度は大幅に減ります。プロジェクトのプロンプトテンプレートとして保存し、毎回使い回してください。
チームで作業する場合は、プルリクエストのテンプレートに「決済リンク確認済み」チェックボックスを追加します。GitHub Actionsで`stripe`・`paypal`・`square`などのキーワードをgrepするステップを入れれば、マージ前に自動で検出できます。
- HTML内の外部script・form action・iframeを確認する
- APIキーやトークンらしき文字列がないか検索する
- 画像・CSS・JSのパスが公開後も解決できるか見る
- noindexと認証を混同せず、必要なら両方設定する
よくある質問
Stripe公開キーはHTML内に書いても安全ではないのですか?
公開キー自体は機密情報ではありませんが、社外レビュー用HTMLに含めると相手が本番の決済フローを誤って実行できる状態になります。レビュー版ではキーをダミー値に置き換えるか、決済処理コードごと削除してください。
formタグのaction属性が空欄でも問題になりますか?
空欄のaction属性は同一ページへのGETリクエストを発生させるだけで外部送信にはなりませんが、JavaScriptがformのsubmitをフックして外部URLに送信するケースがあります。Network タブで実際の通信を確認することが確実です。
ページをパスワード保護すれば決済コードの混入を確認しなくてよいですか?
パスワード保護は不正アクセスを防ぐ対策であり、混入した決済コードを無効化するものではありません。認証済みのレビュアーが誤ってリンクを踏むリスクは残るため、ソースの確認と認証の両方を行ってください。