VibeCoded

Supabase security checklist

Most AI app builders put your data in Supabase and let the browser talk to it directly. That is safe only if row level security is right on every table. This is how to check.

Last reviewed 2026-09-30Written by Jacob Masse, TrazTech Inc.

A Supabase-backed app is secure when row level security (RLS) is enabled on every table the API exposes, every policy restricts rows to the right user or organization, the service role key never leaves the server, and storage buckets holding private files are private. The browser holds the project URL and the public anon key by design. Whatever RLS allows, anyone with those two values can do.

Row level security

0 of 0 done ·

The common ways these go wrong are on Supabase RLS mistakes.

Keys

0 of 0 done ·

Storage

0 of 0 done ·

Auth settings

0 of 0 done ·

Edge functions

0 of 0 done ·

How to test it yourself

  1. Create two accounts in different organizations.
  2. Logged in as the first, open the browser console and query a table with the Supabase client, filtering for the second user's rows.
  3. Try an update and a delete on a row you do not own.
  4. Log out and repeat with no session.
  5. Anything that succeeds is a finding.

Supabase's own security advisor in the dashboard flags tables without RLS. Use it. It cannot tell you whether a policy matches your business rules, which is what a security test checks. This is the failure behind the public vulnerability record CVE-2025-48757 affecting Lovable-generated projects; see Lovable app security.

Have your Supabase rules tested

Testers need the app URL and two or more test accounts.

Get matched

Common questions

Is the Supabase anon key safe to expose?

Yes. It identifies the project and carries anonymous permissions only. RLS decides what it can do.

Does enabling RLS with no policies break my app?

It denies all access through the API until you add policies, which is the safe default. Add policies for what each user should do.