本文へスキップ

公開ページを、漏れた25種類のシークレットでスキャン

バイブコーディングで作られたアプリは、キーをブラウザーに送ってしまうことがよくあります。運営している1ページのアドレスを入力すると、そのページのHTMLとリンク先のスクリプトファイルを読み取り、訪問者がコピーできる API キー、トークン、データベース URL を探します。値はマスクして表示します。

スキャンするページ

対象は1ページのみで、サイト全体ではありません。スキャンするのは、入力したアドレスとそこからリンクされたスクリプトだけです。別のページを確認するには、そのページのアドレスも入力してスキャンしてください。

人間であることを確認

自動化されたリクエストがサービスに負荷をかけるのを防ぎます。

入力したアドレスの公開ファイルだけを、Cloudflare のネットワークから取得します。何も保存されません。

結果

このスキャンでは確認できないこと

スキャナーが読み取るのは、訪問者のブラウザーがページからダウンロードするファイルだけです。サーバーに残るシークレット、ログインが必要なページ、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 アクセスキー IDaws-access-key高シークレット
AWS シークレットアクセスキーaws-secret緊急シークレット
GitHub トークンgithub-token緊急シークレット
Google API キーgoogle-api-key情報意図して公開
Firebase ウェブ設定の apiKeyfirebase-web-config情報意図して公開
Supabase の service_role キーsupabase-service-role-jwt緊急シークレット
Supabase の anon キーsupabase-anon-jwt情報意図して公開
JSON Web Tokenjwt-other低シークレット
Supabase のシークレットキーsupabase-secret-key緊急シークレット
Supabase の publishable キーsupabase-publishable-key情報意図して公開
Slack トークンslack-token緊急シークレット
Slack の Webhook URLslack-webhook高シークレット
SendGrid API キーsendgrid-key緊急シークレット
Twilio API キーの SIDtwilio-key高シークレット
Mailgun API キーmailgun-key高シークレット
秘密鍵のブロックprivate-key-block緊急シークレット
パスワード付きのデータベース URLdatabase-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 をブラウザーから直接呼び出すことが多く、キーが、すべての訪問者がダウンロードするスクリプトに入ってしまいます。バイブコーディングのセキュリティは、そうした呼び出しをサーバー側に置くことから始まります。