セキュリティ

Stripeキーを防ぐAIプロンプトと公開前スキャン

AIに決済フォームのHTMLを生成させるとき、プロンプトの書き方次第でStripeキーがそのままコード内に埋め込まれてしまいます。公開前スキャンと安全なプロンプト設計を組み合わせることで、漏えいリスクを根本から断ち切る方法を解説します。

なぜ危ないのか

ChatGPTやClaudeなどのAIにStripeを使った決済フォームHTMLの生成を依頼すると、サンプルコードとしてAPIキーの書き方をそのまま埋め込んでくるケースがあります。特に「動くコードを出して」と指示した場合、AIはデモ用のダミー値ではなくユーザーが貼り付けたキーをそのままJavaScriptブロックに組み込んで返すことがあります。

生成したHTMLをそのまま関係者にプレビュー共有すると、受け取った人がブラウザのDevToolsでネットワークタブを確認するだけでキーを抽出できます。sk-live_で始まる秘密鍵が含まれていれば、そのキーでStripe APIの顧客一覧・支払い履歴の取得、さらに返金操作まで実行可能になります。

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

ソースで見る場所

AIが生成したHTMLを受け取ったら、まずテキストエディタで開きCtrl+F(macOSはCmd+F)でsk-live_とwhsec_を検索します。scriptタグで囲まれたJavaScriptブロックに「const stripe = Stripe('sk-live_...')」のような形で含まれていることが典型的なパターンです。

外部ファイルを参照している場合は参照先も確認が必要です。外部スクリプトファイルが存在すればそのファイルも開いて検索します。ディレクトリごとスキャンするなら「grep -rn 'sk-live_|whsec_|rk_live_' .」とターミナルで実行すると、行番号付きで該当箇所を一覧表示できます。

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

安全に共有する設定

スキャンでキーが検出された場合は共有前に必ずStripeダッシュボードでキーをローテーションします。HTMLのキー部分はプレースホルダに置き換え、レビュー用HTMLとしてはテスト公開キー(pk-test_…)だけを残した状態で共有します。

認証付き共有URLを発行できるサービスを使えば、URL流出による二次被害を防げます。レビュー依頼時には有効期限(例:72時間)を明記し、期限後は手動または自動でURLを無効化する運用を徹底します。Slackのスレッド返信形式で共有すると、スレッド外に拡散されるリスクを下げられます。

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

再発防止ルール

AIへのプロンプトに「Stripeキーや認証情報は絶対に含めず、YOUR_STRIPE_PUBLIC_KEYのようなプレースホルダで出力すること」という制約文を追加します。この一文を入れるだけでAIの出力からキーが除外される確率が大きく高まります。社内でAI活用のガイドラインを策定している場合は、この制約をテンプレートに明記しましょう。

生成物の受け取り時点でスキャンを必須工程として定義します。具体的にはnpm run scan-keysのようなコマンドをpackage.jsonに追加し、正規表現でキーパターンを検出するシェルスクリプトと組み合わせます。CIに組み込めれば人為的な見落としをなくせます。

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

よくある質問

AIが生成したコードに含まれるキーはAI側に保存されますか?

多くのAIサービスはデフォルトでプロンプト内容を学習データに使用しません。ただしキーをプロンプトに貼り付けた時点で通信ログに含まれる可能性があるため、貼り付け後は必ずStripeでローテーションしてください。

grepで検索したが何も出なかったので安全と判断してよいですか?

grepはテキスト一致のみを検出するため、Base64エンコードや変数分割で難読化されたキーは見逃します。truffleHogなどのシークレットスキャナーを補完的に使い、エンコードされた文字列もデコードして検査することを推奨します。

テスト用のHTMLを社内チームだけに共有する場合もスキャンは必要ですか?

社内共有でも必要です。社内Slackのメッセージは管理者が閲覧でき、また誤って社外チャンネルに投稿するリスクもあります。スキャンは共有先に関わらず送信前の固定手順として習慣化することが重要です。

関連記事

セキュリティ

APIキー直書きを防ぐAIプロンプトと公開前スキャン

AI生成HTMLへのAPIキー直書きをプロンプト設計で防ぎ、公開前スキャンで二重検出したい開発者・制作担当者向け。具体的なプロンプト文言とgrepコマンドをセットで紹介します。

4分で読める
セキュリティ

Supabase anon keyを防ぐAIプロンプトと公開前スキャン

Supabaseのanon keyをAI生成HTMLに含めないためのプロンプト設計と、生成後の自動スキャン方法を知りたい開発者向け。具体的なプロンプト例とコマンドを使って実践的な防止フローを選べる。

5分で読める
セキュリティ

AI生成HTMLにStripeキーが残っていないか確認する方法

AI生成HTMLにStripeのキーが含まれていないか確認したいエンジニア・担当者向け。キーの種類ごとのリスク差と、ファイル内で見つけるための具体的な検索手順・対処法を理解できる。

5分で読める
セキュリティ

Stripeキーを含むHTMLを共有するときのリスクと対策

StripeキーがHTMLに含まれている状態でのリスクの大きさと、キーの種類に応じた対処法を理解したい開発者・担当者向け。本番・テスト・Publishable・Secretの違いをもとに、どこまで対応すべきかを判断できる。

5分で読める
「セキュリティ」の記事をもっと見る →