Tenant taken from the client
A policy compares org_id on the row with an org_id the user can set. Membership has to come from a table the user cannot write, checked against auth.uid().
Supabase RLS security review
Turning on Row Level Security is the easy part. The hard part is whether every policy, view, database function and Storage bucket gives each user exactly the rows they should have, and nothing from the next customer. The Launch Security Check answers that for your whole Supabase project, with every finding confirmed by a senior engineer and a SQL fix attached.
What goes wrong
None of these shows up in your own app's screens. Each lets a signed-in user, or an anonymous visitor, reach rows that belong to someone else.
A policy compares org_id on the row with an org_id the user can set. Membership has to come from a table the user cannot write, checked against auth.uid().
A using clause controls which rows you can see. Without with check on insert and update, a user can write rows into another tenant or hand a record to someone else.
A view runs with its owner's rights unless it is created with security_invoker. A reporting view over a protected table can return every customer's rows.
A security definer function bypasses RLS by design. Exposed to anon or authenticated without its own ownership check and a fixed search_path, it becomes a side door.
Users can edit their own user_metadata. A policy that trusts a role or plan stored there lets anyone promote themselves. Authorization belongs in app_metadata or your own tables.
A public bucket, or a policy that checks the bucket but not the folder, lets any user list or download every file. Paths need a user or tenant prefix enforced by policy.
How the review works
An advisor or scanner can tell you that RLS is off. It cannot tell you whether a policy that is on matches your business rules. That needs someone to read the schema with your roles in mind.
See the sample report from a demo app →How it works
One email or a 15-minute call to confirm the project fits the fixed price. Larger schemas get a fixed quote in writing first.
You authorize the review in writing and share read-only access to the repository with your migrations, or a schema-only dump. No production data, no live keys.
Automated checks across the codebase, then a senior engineer builds the access matrix and confirms what is real.
Every finding with impact, the attacker's request and the SQL fix, an executive summary, and a 30-minute call.
The report is due within two business days of confirmed scope, agreed payment arrangements and complete access. Payment terms are agreed in writing before work starts.
The report
The sample report comes from a demo app (Next.js, Supabase and a Python agent service) with planted issues, including tables without Row Level Security and a service-role key in frontend code. It contains no client data.
Full sample report →Next.js + Supabase review · Apps built with Lovable, Bolt or Cursor
Scope, plainly
We review your schema, policies and code with the access you grant. We do not attack running systems or touch production.
Auth providers, redirect URLs and bucket settings are reviewed when you share them; otherwise the report says they were not checked.
No SOC 2 report or audit opinion. A clean report means nothing was found in the agreed scope, not that the app is secure.
FAQ
Keep using it; it catches tables without RLS and several risky settings. It checks that rules exist, not that they are correct for your app. A policy can be enabled, pass the advisor and still let one customer read another's data.
No. RLS lives in the database, so the core of the review is the same for React, Flutter, mobile or AI-builder frontends. Tell us what calls Supabase so we know where the keys live.
Read-only access to the repository with your migrations, or a schema-only dump, plus the app code that talks to Supabase. Never send live keys or customer data.
Roughly one application with a few dozen tables and a handful of functions and integrations. Larger schemas or several services get a fixed quote in writing before anything starts.
Every finding comes with the corrected SQL. Applying and testing the changes in your project is quoted separately on request.
Start with one short request
Roughly how many tables and functions, whether it is multi-tenant, and when you launch. You get a scope, a fixed price and a start date back by email, usually within one business day. Please do not send code or credentials yet.
Prefer email? Write to hello@proofmerge.com · Back to all services
This site uses no tracking or advertising cookies. We only remember that you closed this notice. Cookie details