Skip to content
SniffPup
How it worksSample reportPricingGuidesAboutSign in
Home › Guides › Supabase security scanner

Supabase security scanner: which free tools check what (inside vs outside)

Published October 24, 2026 · By Ember, SniffPup · Tool facts checked October 24, 2026

Short answer: there isn't one Supabase security scanner that sees everything, because your app can leak in three places: inside the database, in the SQL you're about to deploy, and on the live website strangers load. Run Supabase's free Security Advisor for the inside, test your own rules with two accounts, then run an outside scan of your live URL for leaked secret keys and tables that answer to your public anon key. This guide compares the free options by what each one can actually see.

The kinds of Supabase scanners, side by side

KindExampleWhat it needsWhat it seesWhat it can't see
Built-in database linterSupabase Security AdvisorYour project (Studio, CLI, MCP or Management API)RLS off on public tables, always-true policies, security definer views and functions, exposed auth.users, listable public bucketsYour website, and who should see which rows in your app
Migration linterrls-lint (open source)Your SQL migration files, no connectionMissing RLS, using (true) policies and similar mistakes before you deployChanges made in the dashboard, and anything outside the migration files
Catalog auditorrls-doctor (open source)A Postgres connection string (its README recommends read-only credentials), or SQL files offlineRLS and grant risks in the live database catalogHosted Supabase settings, views and functions (per its README), and your website
Your own database testspgTAP with supabase test dbTests you writeExactly the rules your app needs (user A can't read user B's rows)Anything you didn't write a test for
Outside URL scannerSniffPup, SafeToShip, LaunchGuard and othersOnly your public URLSecret keys in your JavaScript, public files, and whether tables answer to the public anon keyYour policies, code, signed-in behavior and tables it can't discover

1. Inside the database: Supabase Security Advisor

Supabase's advisors are deterministic checks that ship with the platform. Run them in Studio (Advisors → Security Advisor), with the CLI (supabase db advisors), through the Supabase MCP get_advisors tool or the Management API. Fix every error-level finding first, such as a public table with RLS disabled. It's free, it's already in your project and no outside tool can see what it sees. Our Supabase security audit guide walks through each finding.

2. Before you deploy: migration linters and database tests

AI-written migrations are a common way a new table ships without RLS. A migration linter such as rls-lint reads your SQL files offline and flags missing RLS and always-true policies in CI, before anything reaches production. It can't see policies changed in the dashboard. A catalog auditor such as rls-doctor reads the live database's catalog over a Postgres connection instead; its README says it doesn't audit hosted Supabase settings, views or functions.

Linters know common mistakes, not your app's rules. For those, Supabase documents database testing with pgTAP (supabase test db): write a test that signs in as user B and asserts that user A's rows come back empty.

3. On the live site: an outside scan

Everything above looks at the database. Strangers look at your website, and your website ships your Supabase URL and public anon key to every visitor by design. An outside scanner starts from the same place and checks:

  • Secret keys in your JavaScript: a service_role or sb_secret_ key in a bundle bypasses every policy you wrote. The anon or sb_publishable_ key is meant to be public.
  • Tables that answer to the public key: a read-only request per table to see whether rows come back without signing in.
  • Public files: /.env files and their backups, /.git metadata and source maps that reveal your code or keys.

Outside scanners differ in how far they go. SafeToShip's site says its Supabase audit tests your RLS policies from the outside and that its database checks read at most one row. LaunchGuard's Supabase scanner page says it requests every table it can find with the anon key and counts the rows that come back, that it walks your storage buckets and flags the open ones, and that it tests RPC functions it spots in your app's requests (checked October 24, 2026). Read each tool's own page for what it does with your data before you scan.

Signs of a careful scanner: it never asks for your service_role key, it only sends read-only requests, it doesn't download your rows, and it asks you to confirm you own the app.

4. Don't forget the October 30, 2026 change

From October 30, 2026, Supabase applies a new default to all existing projects: new tables in the public schema aren't reachable through the Data API until you add an explicit grant (Supabase changelog). Existing tables keep their grants. This narrows accidental exposure of brand-new tables, but grants and RLS are separate layers: once you grant anon or authenticated access, RLS still decides which rows they see. If a new feature fails with error 42501, add the grant your app needs and an owner-scoped RLS policy, then re-scan.

Which should you run?

  1. Security Advisor after every schema change, and fix every error-level finding.
  2. A two-user test (or a pgTAP test) for every table that holds personal data.
  3. A migration linter in CI if your AI tool writes migrations for you.
  4. An outside scan of your live URL after every deploy.

For the RLS steps themselves (SQL to list tables with RLS off, the signed-out curl test and common policy mistakes), see the Supabase RLS checker guide. Built with Lovable? Start with is my Lovable app secure?

Where SniffPup fits

SniffPup is an outside scanner. A free SniffPup scan of your live URL looks for secret keys in your HTML and same-origin JavaScript, including Supabase service_role and sb_secret_ keys (masked in the report), public /.env and /.git files, source maps and security headers. With only the public anon key your site already ships, it reads the table list that key can see and sends one read-only HEAD request per table, up to 8, to learn whether at least one row is readable. It never downloads rows and never writes. On Pro, after you verify you own the domain, a deeper read-only check counts readable rows on up to 30 tables, lists public storage buckets and counts the files anyone can list in them, and checks what your GraphQL API shows signed-out visitors (counts only, never names or contents). It can't see your policies, so use it alongside Security Advisor, not instead of it. See Supabase Security Advisor and SniffPup side by side or the free Supabase exposed data checker.

FAQ

What is the best free Supabase security scanner?

No single scanner sees everything, so use two kinds. Start with Supabase's own Security Advisor, which reads your database from the inside (RLS off, always-true policies, security definer views and functions, listable public buckets). Then add an outside scan of your live site, which sees what strangers get: a service_role or sb_secret key in your JavaScript, public .env files and which tables answer to the public anon key. SniffPup's free scan is one outside option.

Does a Supabase security scanner need my service_role key?

It shouldn't. Security Advisor runs inside your own project, and an outside scanner only needs your public URL: the public anon or publishable key is already in your site's JavaScript. Never paste a service_role or sb_secret key into a third-party website. That key bypasses Row Level Security entirely.

Can an outside scanner see my RLS policies?

No. From the outside, a scanner can only test the result of your policies: whether a request with the public anon key gets rows back from a table. It can't read the policies, can't test as a signed-in user and can't see tables it can't find. Use Security Advisor and a two-user test for the rest.

Is it safe to scan my Supabase app?

Scan only apps you own or have permission to test. A careful scanner sends read-only requests, never writes, and doesn't download your rows. SniffPup's free check, for example, sends one read-only HEAD request per table (up to 8) to learn whether at least one row is readable, and downloads no row data.

Does the October 30, 2026 Supabase change make my tables safe?

Not by itself. From that date Supabase stops auto-granting Data API access to new tables in the public schema on existing projects, so a new table isn't reachable until you grant it. Existing tables keep their grants, and once you grant access, RLS is still what decides which rows each role sees. Keep scanning after the change.

Does a 100 SniffPup score mean my Supabase project is secure?

No. A 100 means no issues were found in our checks, never proof of security. SniffPup can't see your policies, your code or anything behind a login.

A score of 100 means no issues were found in our checks. It is never proof that your app is secure.

Run a free scan →

Get the daily tip

Get one short security tip for your vibe-coded app each morning. Free, unsubscribe anytime.

We use your email only for these tips. See our Privacy Policy.

SniffPup

Ember supervises from the couch. SniffPup is a product of Ember and Saru LLC.
10850 Providence Rd #1370, Charlotte, NC 28277, USA

Support: support@sniffpup.com
Abuse & scan opt-out: abuse@sniffpup.com

Have an idea? Drop it in our suggestion box or email us. We read all feedback and may improve SniffPup in future updates; we can't promise any specific feature. Suggestions are covered by the Feedback section of our Terms.

ProductFree scanSample reportPricingHow our scanner worksHow scoring worksFAQCompareGuidesFree checkersBlogChangelogStatus
CompanyAboutSniffed by SniffPup badgeSniffPupScanner bot & opt-outsecurity.txtSniffPup on XContact
LegalTermsPrivacyAcceptable UseRefunds

🐾 We scan ourselves daily

Featured on: Fazier · Dang.ai

Follow for more Ember adventures 🐾 emberandsaru.com · @EmberandSaru on X

SniffPup checks what is publicly visible on your site. A clean report is not a guarantee of security. © 2026 Ember and Saru LLC.