Supabaseで作ったアプリのデータが外から読めないか、30分で見られる5か所にまとめました。UpGuardが2026-10-14に公開した調査では、1万6,326件のデータベースで表が外から読めましたが、原因はSupabase本体の穴ではなくアプリ側の設定でした。この記事はWebアプリ公開前チェックリストの項目4を、見つかった設定をAIにどう直してもらうかまで書き切ったものです。
Who am I?
BPR Prot. という、AIで作ったWebアプリの公開前の確認を手伝うサービスを作っています。Xでは公開前に確かめたいことを実例で毎日投稿しています。@BPR_Prot
RLSと2種類の鍵
データベースを棚、表を引き出しにたとえると、RLSは「この人には、この引き出しのこの行だけ見せる」と決める仕組みです。公開用の鍵 sb_publishable_...(旧 anon)は見られてよい鍵で、RLSが許した範囲だけを読みます。
秘密の鍵 sb_secret_...(旧 service_role)は、すべてのRLSを飛び越えます。UpGuardによると、管理画面で作った表はいまは最初からRLSが有効ですが、AIがSQLやAPIで作った表には自動でかかりません。
5か所の点検
1. RLSがかかっていない表をSecurity Advisorで探す
管理画面のSecurity Advisorを開き、0013_rls_disabled_in_public のERROR「Table publicly accessible」が出ていないかを見ます。出ていれば、その表はRLSが無効な状態です。
SQLで作った表は自分でRLSを有効にします。AIには次のように頼めます。
Security Advisorに0013のERRORが出ています。対象の表へ
alter table public.テーブル名 enable row level security;を適用し、アプリに必要な人だけが読める設定への修正をお願いします。
2. RLSがあってもだれでも読めるポリシーを見直す
次に、0024_permissive_rls_policy のWARN「Security policy allows unrestricted access」を探します。このWARNがあれば、RLSのスイッチは入っていても、広すぎるポリシーによってだれでも読める状態です。
RLSが有効という表示だけで終えず、だれがどの行を読める設定なのかまで見ます。修正はAIへこう伝えます。
Security Advisorに0024のWARNが出ています。対象のポリシーを、ログイン中の本人が自分の行だけ読める設定に直してください。変更後に、ログインしていない人と別のユーザーから読めないことも調べてもらえますか。
3. ビューが元の表のRLSに従うようにする
Security Advisorの 0010_security_definer_view にERROR「View bypasses row-level security」がないかを見ます。ビューは既定でRLSを通らないため、元の表で隠した行まで渡すことがあります。
Postgres 15以降なら、security_invoker = true を付けると元の表のRLSに従います。AIには対象のビューを示して頼みます。
Security Advisorに0010のERRORが出ています。対象のビューへ
security_invoker = trueを付け、元の表のRLSに従うよう修正をお願いします。
4. 公開ストレージの中身を一覧できない状態にする
0025_public_bucket_allows_listing のWARNは広いSELECTポリシーのせいで公開バケットの中身を一覧できるときに出ます。本人確認の画像などを公開バケットへ入れていないかも見ます。
公開する必要のないファイルまで一覧できるなら、置き場所とポリシーを直します。AIへは、必要な使い方を残しながら狭めるように頼むと話が早いです。
Security Advisorに0025のWARNが出ています。本人確認の画像を公開せず、ログイン中の本人だけが自分のファイルを読めるように、バケットとSELECTポリシーの見直しをお願いします。
5. 秘密の鍵をブラウザと公開リポジトリから外す
ブラウザで動くコードと公開リポジトリを検索し、sb_secret_ や旧 service_role が入っていないかを見ます。この鍵はすべてのRLSを飛び越えるため、見つかったらコードから外すだけでなく作り直します。
秘密の鍵をブラウザから使うと401で断られますが、漏れた鍵はほかの道具から使えます。置き場所の詳しい点検は.envと秘密鍵を5か所で確かめる記事にもまとめています。
ブラウザで動くコードと公開リポジトリに
sb_secret_またはservice_roleがないか探してください。見つかった鍵は作り直し、ブラウザには公開用の鍵だけを置く構成への修正をお願いします。
最後は自分のアプリを外から確かめる
ここまで直したら、自分のアプリと自分の公開用の鍵でだけ試します。公開用の鍵はブラウザで読み込まれるコードやアプリの環境変数にあります。
データの入った表を選び、次のコマンドの <project_ref>、<表の名前>、<公開用の鍵> を自分の値に置き換えて実行します。
curl 'https://<project_ref>.supabase.co/rest/v1/<表の名前>?select=*&limit=1' -H 'apikey: <公開用の鍵>' -H 'Authorization: Bearer <公開用の鍵>'
行が返れば、ログインしていない人でもその表を読めます。[] なら読めませんが、空の表でも [] になるため、データの入った表で試すのがポイントです。
コマンドが難しい場合は、AIへ次の文を渡せます。ただし、秘密の鍵は渡さず、自分のアプリ以外へは試さないようにします。
私のSupabaseの表が、ログインしていない状態で外から読めないかを公開用の鍵で調べたいです。自分のアプリだけを対象に、このcurlコマンドの置き換え方と結果の読み方を案内してもらえますか。
動画でも見られます
同じテーマを、BPR Prot.のYouTubeで「5分で確かめる3つの手順」として動画にしました。まず全体をつかみたい人は、動画から見るのがおすすめです。
YouTube:そのアプリ、個人情報がだれでも読める状態かも?5分でできる3つのチェック
コピーして使えるチェックリスト
- 0013のERRORがなく、すべての表でRLSが有効になっている
- 0024のWARNがなく、だれでも読めるポリシーがない
- 0010のERRORがなく、ビューが元の表のRLSに従っている
- 0025のWARNがなく、公開ストレージの中身を一覧できない
- 秘密の鍵がブラウザで動くコードや公開リポジトリにない
- 自分のアプリを公開用の鍵で外から試し、データの入った表から行が返らない
全部を一度に直すのが大変なら、まずSecurity AdvisorのERRORから始めれば大丈夫です。設定を見つけてAIへ具体的に渡せるだけでも、公開前の不安はかなり小さくなります。
わたしたちについて
公開前の点検を一つずつ手で進めるのは、正直なかなか大変ですよね。BPR Prot. はAIで作ったアプリ・Webサービスのローンチ前の最終確認から、公開後の見守りまでを、ひとつのツールで伴走するサービスです。コード診断では、コードに秘密の鍵が直書きされていないか、APIが問い合わせてきた人をデータの持ち主だと確かめているかを探せます。
- URLを入れるとWebサイトのセキュリティをA〜Fで採点
- コードの脆弱性診断
- ファイルのマルウェア検査
無料プランは登録だけで使え、クレジットカードは不要です。
Xでは公開前に確かめたいことを実例で毎日投稿しています。@BPR_Prot
YouTubeでは個人開発者向けのAIニュースを毎週まとめています。BPR Prot.
最後まで読んでくださり、ありがとうございました。自分のアプリの5か所を、ひとつずつ見てみてください!
出典
- UpGuard(2026-10-14)、Supabaseを使うアプリでデータが外から読めた調査:https://www.upguard.com/blog/everything-everywhere-systemic-data-exposure-in-supabase-apps
- TechCrunch(2026-09-25)、Supabaseを使うアプリのデータ公開設定に関する記事:https://techcrunch.com/2026/09/25/some-supabase-customers-are-publicly-exposing-reams-of-peoples-data-to-the-web/
- Supabase公式、Database Advisors:https://supabase.com/docs/guides/database/database-advisors
- Supabase公式、Row Level Security:https://supabase.com/docs/guides/database/postgres/row-level-security
- Supabase公式、API keys:https://supabase.com/docs/guides/api/api-keys
- Supabase公式、creating-routes:https://supabase.com/docs/guides/api/creating-routes
