つくった、その次に。公開したままのリスクを知る。
バイブコーディングで作ったアプリ、ウェブサイト、スキル、リポジトリのためのアンチウイルスです。
- 攻撃者の視点で公開ホームページを確認します。誰もが外部から行えるのと同じ方法で確認します。ウェブサイトのスキャンにコードは必要ありません。リポジトリとスキルのチェックは公開コードを読むだけで、決して実行しません。
- 見つかったことを、わかりやすく説明します。各指摘は、確認した内容と、それを悪用されると何が起こりうるかを示します。専門用語は使いません。
- 修正に使えるプロンプトを作ります。Lovable、Bolt、Replit、Cursor、Claude Codeに対応しています。
ひとつの指摘を、修正まで。
Pulseスキャンで見つかる問題の例です。このミスはよくあります。
atlas.example
AAtlasStudio
おはようございます、Studio
顧客 1,248 件未払いの請求書 37 件
ソースを表示/_next/static/chunks/app.js
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[931],{
- 1204:function(e,t,n){"use strict";n.r(t),n.d(t,{default:function(){return s}});
- var r=n(7437),a=n(2265),i=n(6463);function l(e){return e.replace(/\s+/g," ")}
- let o={sm:640,md:768,lg:1024},u=(0,a.createContext)(o);
- function s(e){let{title:t,children:n}=e;return(0,r.jsx)("section",{children:n})}
- },3310:function(e,t,n){n.d(t,{Z:function(){return c}});var r=n(2265);
- function c(e){let[t,n]=(0,r.useState)(!1);return[t,()=>n(e=>!e)]}
- },4821:function(e,t,n){"use strict";n.d(t,{db:function(){return o}});
- var r=n(2265),a=n(8830);let c=(0,r.createContext)(null);
- function u(e){let{children:t}=e;return(0,r.useMemo)(()=>t,[t])}
- let i={SUPABASE_URL:"https://db.atlas.example",
- SUPABASE_SERVICE_ROLE_KEY:"eyJhbGciOiJI…"},
- o=(0,a.createClient)(i.SUPABASE_URL,i.SUPABASE_SERVICE_ROLE_KEY);
- function l(){return o.from("customers").select("*")}
- function d(e){return o.from("customers").delete().neq("id",e)}
customersatlas.example を開いた誰でも
| 名前 | メール |
|---|
| Mara Quinn | mara@northwind.example |
| Theo Albers | theo@kestrel.example |
| Ines Duarte | ines@fieldnote.example |
Lockpick例
サイトのコードにデータベース管理キー
検出Pulseスキャン
atlas.example
AAtlasStudio
おはようございます、Studio
顧客 1,248 件未払いの請求書 37 件
ソースを表示/_next/static/chunks/app.js
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[931],{
- 1204:function(e,t,n){"use strict";n.r(t),n.d(t,{default:function(){return s}});
- var r=n(7437),a=n(2265),i=n(6463);function l(e){return e.replace(/\s+/g," ")}
- let o={sm:640,md:768,lg:1024},u=(0,a.createContext)(o);
- function s(e){let{title:t,children:n}=e;return(0,r.jsx)("section",{children:n})}
- },3310:function(e,t,n){n.d(t,{Z:function(){return c}});var r=n(2265);
- function c(e){let[t,n]=(0,r.useState)(!1);return[t,()=>n(e=>!e)]}
- },4821:function(e,t,n){"use strict";n.d(t,{db:function(){return o}});
- var r=n(2265),a=n(8830);let c=(0,r.createContext)(null);
- function u(e){let{children:t}=e;return(0,r.useMemo)(()=>t,[t])}
- let i={SUPABASE_URL:"https://db.atlas.example",
- キーを削除
- o=(0,a.createClient)(i.SUPABASE_URL,i.SUPABASE_ANON_KEY);
- function l(){return o.from("customers").select("*")}
- function d(e){return o.from("customers").delete().neq("id",e)}
customersatlas.example を開いた誰でも
| 名前 | メール |
|---|
| Mara Quinn | mara@northwind.example |
| Theo Albers | theo@kestrel.example |
| Ines Duarte | ines@fieldnote.example |
テーブル customers へのアクセス権がありませんウェブサイトの公開キーではこのテーブルを読み取れません。
Lockpick例
サイトのコードにデータベース管理キー
修正済み再チェック日時
修正前。Atlas のデータベース管理キーがサイトのコードにあり、サイトを開いた人は誰でも顧客テーブルを開けます。

確認できたこと
データベース全体を開けるキーが、サイトのコードに置かれていました。
技術的な詳細
ホームページが読み込む 4 つのスクリプトのうち 1 つ、/_next/static/chunks/app.js で見つかりました。eyJhbGciOiJI で始まる Supabase の JWT(ここでは一部を伏せています)は service_role ロールを持ち、行レベルセキュリティを無視します。Lockpick はブラウザと同じようにスクリプトを読んだだけで、キーは使っていません。

誰かができること
すべての顧客レコードを読み、変更し、削除できます。パスワードは不要です。

修正プロンプト
コーディングエージェントにそのまま貼り付けられるプロンプトです。キーをローテーションし、サーバー側に移し、テーブルをロックしてから、もう一度チェックしてください。
無料で始められます。さらに必要なら Deep を。
無料
カード登録は不要
- 1サイトにつき、月に5回の無料Pulseスキャン
- ホームページと、その公開DNS、メール、証明書の記録
- 最大10件のリクエスト、通常は15秒以内
- 毎週の自動チェックは、それぞれ1回のスキャンを使用します
- サインイン不要、フォーム送信なし、顧客データは扱いません
Deep
月額 $19、または年額 $190
- 月に 100 回のPulseスキャンと 20 回のDeepスキャン(3サイトあたり)
- 最大 30 ページ、そのスクリプト、およびその背後のAPI
- 週次の自動チェック
- まずサイトの所有を証明
Master Keyは近日公開。
公開されているHTTPSページのみ。テストする許可を得ているサイトだけをスキャンしてください。
スキャン前の質問。
サイトをスキャンしても安全ですか?
はい。Pulseスキャンは、どのブラウザやメールサーバーからも既に見えるものだけを読み取ります。対象はトップページとそれが読み込むファイル、メール送信設定(SPFとDMARC)、セキュリティヘッダーとTLS、そして公開DNS、証明書、サブドメインの記録です。リクエストは最大 10 回です。サインインやフォーム送信は行いません。
コードが必要ですか?
サイトについては不要です。ウェブサイトのスキャンは攻撃者と同じく外側から稼働中のサイトをチェックするため、コードは必要ありません。リポジトリとスキルのチェックは、貼り付けたGitHubリンクの公開コードだけを読み、決して実行しません。
どのビルダーに対応していますか?
HTTPSで公開されているウェブサイトであれば、何で作られていても対応します。各検出結果には、Lovable、Bolt、Replit、Cursor、Claude Codeなどのコーディングアシスタント向けの修正プロンプトが付きます。
「テストする許可」とはどういう意味ですか?
そのサイトが自分のものであるか、所有者がチェックを許可したことを意味します。Pulseスキャンの前にこれを確認します。Deepスキャンでは、サイトの所有を証明することも求められます。
いつでも解約できますか?
はい。請求画面からいつでもDeepを解約できます。無料プランには解約するものはありません。
誰かに見られる前に、確認しよう。
チェックする開けていいのは、自分の鍵だけ。