shipfix

Common errors · Supabase projects generated by Lovable, Bolt, v0

Is my Supabase data public? Checking what the anon key can read

Cause Tables created by SQL migrations have no RLS, or their policies say using (true): the public key can read and write everything.
Fix Enable RLS on every public table, replace the allow-all policies, and test from outside the app with only the public key.

No error at all: anyone with your public anon key can read or edit tables

Have it fixed for you, 290 EURSee the fix step by step

What you receive a diff on a branch of your repository, and a correction note: root cause, change made, how to verify it. See a sample report

The anon key is meant to be public. It is safe only if every table exposed through the API has RLS enabled with correct policies. Generated apps often create tables quickly and leave some without RLS, which the advisor flags but the app never shows.

Where it breaks

Anon keypublic, in the bundleREST APIGET /rest/v1/usersRLS offor using (true)All rowsreadable by anyoneanyonecan callnofilterreturnsAnon keypublic, in the bundleREST APIGET /rest/v1/usersRLS offor using (true)All rowsreadable by anyoneanyone can callno filterreturns
The anon key ships in every browser. Without RLS, or with using (true), it reads and writes the whole table.

Which case is yours?

  1. Tables created by SQL migrations do not get RLS automatically. Without RLS, the anon role can select, insert, update and delete everything through the REST API.
  2. Policies written as using (true) look like RLS but allow everyone.

The fix, step by step

  1. List tables in the public schema without RLS.
    select relname from pg_class c join pg_namespace n on n.oid = c.relnamespace
    where n.nspname = 'public' and c.relkind = 'r' and not c.relrowsecurity;
  2. List policies that allow everything.
    select tablename, policyname, cmd, qual from pg_policies
    where schemaname = 'public' and (qual = 'true' or with_check = 'true');
  3. Test as an attacker would, from outside the app, with only the public key.
    curl "https://<ref>.supabase.co/rest/v1/profiles?select=*" \
      -H "apikey: <anon key>" -H "Authorization: Bearer <anon key>"
  4. Enable RLS on every table, write owner-based policies, and open the Security Advisor in the dashboard until it shows no RLS warning.

How to check it is fixed

The curl above returns [] or a permission error for every table that holds user data.

Delivery example for this error

migration.sql · on a branch of your repository- create policy "read" using (true);+ enable row level security;+ using (user_id = auth.uid());
Verification checklist in the note
  • Root cause: Tables created by SQL migrations have no RLS, or their policies say using (true): the public key can read and write everything.
  • Change made: Enable RLS on every public table, replace the allow-all policies, and test from outside the app with only the public key.
  • The curl above returns [] or a permission error for every table that holds user data.

Illustrative: the real diff is written against your repository. Full sample report

Still stuck on your own code?

Send the repository and the exact error. Fix: 290 EUR all taxes included, delivered within 72 hours, refunded if not resolved.

Private repository: paste its link anyway, we reply by email within one business day with the GitHub account to invite with read access. A zip link (Google Drive, Dropbox) works too. Never send passwords or secret keys in this form.

Fix: One blocking auth, Supabase RLS or deployment problem fixed in your repository.290 EUR all taxes included · 72 hours

Secure payment by Stripe. Not resolved within 72 hours: refunded in full.

Not sure it is this error? Ask for a free written diagnosis, no card needed.