公開ページを、漏れた25種類のシークレットでスキャン
バイブコーディングで作られたアプリは、キーをブラウザーに送ってしまうことがよくあります。運営している1ページのアドレスを入力すると、そのページのHTMLとリンク先のスクリプトファイルを読み取り、訪問者がコピーできる API キー、トークン、データベース URL を探します。値はマスクして表示します。
結果
このスキャンでは確認できないこと
スキャナーが読み取るのは、訪問者のブラウザーがページからダウンロードするファイルだけです。サーバーに残るシークレット、ログインが必要なページ、import() で後から読み込まれるファイル、ソースマップは確認できません。問題が見つからなくても、アプリが安全とは限りません。
全25種類のキー
ブラウザーに届いてはいけないシークレット: 20 種類。意図して公開されているもの: 5 種類。
公開と表示されているキー (Supabase の anon キー、Firebase の apiKey、Stripe の公開可能キーなど) は、ブラウザーに置くことを前提としています。その背後のデータをデータベースのルールが守っている間だけ、安全です。
| キーの種類 | ID | 重大度 | 区分 |
|---|---|---|---|
| OpenAI API キー | openai-key | 緊急 | シークレット |
| Anthropic API キー | anthropic-key | 緊急 | シークレット |
| Stripe の本番用シークレットキー | stripe-secret | 緊急 | シークレット |
| Stripe のテスト用シークレットキー | stripe-test-secret | 中 | シークレット |
| Stripe の公開可能キー | stripe-publishable | 情報 | 意図して公開 |
| AWS アクセスキー ID | aws-access-key | 高 | シークレット |
| AWS シークレットアクセスキー | aws-secret | 緊急 | シークレット |
| GitHub トークン | github-token | 緊急 | シークレット |
| Google API キー | google-api-key | 情報 | 意図して公開 |
| Firebase ウェブ設定の apiKey | firebase-web-config | 情報 | 意図して公開 |
| Supabase の service_role キー | supabase-service-role-jwt | 緊急 | シークレット |
| Supabase の anon キー | supabase-anon-jwt | 情報 | 意図して公開 |
| JSON Web Token | jwt-other | 低 | シークレット |
| Supabase のシークレットキー | supabase-secret-key | 緊急 | シークレット |
| Supabase の publishable キー | supabase-publishable-key | 情報 | 意図して公開 |
| Slack トークン | slack-token | 緊急 | シークレット |
| Slack の Webhook URL | slack-webhook | 高 | シークレット |
| SendGrid API キー | sendgrid-key | 緊急 | シークレット |
| Twilio API キーの SID | twilio-key | 高 | シークレット |
| Mailgun API キー | mailgun-key | 高 | シークレット |
| 秘密鍵のブロック | private-key-block | 緊急 | シークレット |
| パスワード付きのデータベース URL | database-url | 緊急 | シークレット |
| npm トークン | npm-token | 緊急 | シークレット |
| Hugging Face トークン | huggingface-token | 高 | シークレット |
| Resend API キー | resend-key | 高 | シークレット |
よくある質問
シークレットスキャナーは何を読み取りますか?
ページの HTML と、そこからリンクされている最大 14 個のスクリプトファイルを、合計 3 MB まで読み取ります。ページは先頭の 512 KB、各ファイルは先頭の 1 MB までです。API キー、アクセストークン、秘密鍵のブロック、パスワード付きのデータベース URL など、既知のキーの形式を探します。
スキャンはどこで実行され、どのくらいかかりますか?
スキャンはお使いのブラウザー上で実行されます。当社のサーバーは、そのためにファイルを 1 ファイルにつき 1 リクエストで取得するだけです。何も保存されません。遅いサイトでは、スキャンに最長で 1 分半ほどかかることがあります。
スキャナーでは何が確認できませんか?
サーバー上にしかないシークレット、ログインが必要なページ、ページが後から import() で読み込むチャンク、ソースマップです。また、見つかったキーが今も有効かどうかも分かりません。問題が見つからなくても、アプリが安全とは限りません。
一部のキーが「意図して公開」と表示されるのはなぜですか?
Supabase の anon キーや publishable キー、Firebase の apiKey、Google の API キー、Stripe の公開可能キーは、ブラウザーに送ることを前提に作られています。プロジェクトを識別するだけで、データベースのルール、API の制限、サーバー側のチェックが許す範囲のことしかできません。キー自体が漏えいだからではなく、そのルールが存在することを確認していただくために報告しています。
本物のシークレットが漏れたらどうすればよいですか?
まず、ローテーションしてください。提供元で新しいキーを作成し、古いキーを無効にします。そのあと、新しいキーをサーバー側のコードか環境変数に移して、再デプロイします。コードからキーを消すだけでは足りません。古い値が、以前のビルド、キャッシュ、git の履歴に残るためです。
バイブコーディングで作ったアプリは、なぜキーが漏れやすいのですか?
AI ツールで素早く書いたコードは、有料または特権のある API をブラウザーから直接呼び出すことが多く、キーが、すべての訪問者がダウンロードするスクリプトに入ってしまいます。バイブコーディングのセキュリティは、そうした呼び出しをサーバー側に置くことから始まります。