Your Supabase Database Is Probably Wide Open
We scanned 5,371 Supabase-powered sites. We found 547 exposed databases.
Supabase tells developers the anon key is "safe to use in a browser." It is — if you configure Row Level Security. But after scanning over 5,000 sites, we can confirm: almost nobody does.
Every Supabase project exposes a PostgREST API at a predictable URL. With the anon key — which is embedded in every frontend bundle — anyone can query every table in the public schema unless Row Level Security policies explicitly prevent it.
This is not a bug in Supabase's code. It is a systemic design flaw in how security is communicated, defaulted, and enforced. The documentation says "enable RLS." The dashboard warns you. But the path of least resistance — the one every tutorial follows, the one every hackathon project ships — is the insecure one.
If you use Supabase and haven't explicitly enabled RLS on every table in your public schema, you are likely affected.
anon key in your frontend JavaScript?
It probably is -- that's by design. This is normal, but it means your RLS policies are the only thing between the public internet and your data.
service_role key only in server-side code?
This key bypasses all RLS. If it's in a .env file that gets bundled into your frontend, anyone can read your entire database and modify any row.
supabase.co/rest/v1/. The apikey parameter is your anon key. Now try: curl "https://YOUR-PROJECT.supabase.co/rest/v1/YOUR-TABLE?select=*" -H "apikey: YOUR-ANON-KEY" -H "Authorization: Bearer YOUR-ANON-KEY" — if it returns data, RLS is not enabled on that table.
No companies are named. Disclosure is in progress. These are real findings from real production applications.
/rest/v1/ endpoint returns a full schema description. This makes automated scanning trivial. Apply rate limiting and consider requiring authentication for schema introspection.