Skip to content

Check your Supabase project against 45 OWASP Top 10:2025 rules and more

Connect one project read-only and get a graded report with the fix for each finding, right on this page.

For teams shipping with Lovable, Bolt, Cursor or v0 on Supabase. Free, no sign-up.

Check my Supabase project

Free, no signup. Read-only: nothing in your project is changed.

  1. Connect SupabaseApprove read-only access on supabase.com.
  2. We run 45 checksAccess and RLS, sign-in, storage and functions, infrastructure. Catalog and settings only, never your rows.
  3. Report and a prompt for your AI agentA fix for each finding plus a prompt you paste into Cursor, Claude Code or Lovable. Stored only if you share it.

What the check can see

We read

  • Database catalog: tables, RLS flags, policies, grants, views, functions, extensions, roles and who may read the Vault
  • Auth settings: password rules, email confirmation, MFA, redirect URLs
  • Storage: the bucket list, which buckets are public and their size and file-type limits
  • Edge Functions: the list and the JWT setting of each one
  • Project settings: Postgres version, backups, SSL, network restrictions, Data API row cap

We never read

  • Rows in your tables
  • API keys and secrets: Supabase includes a few in settings replies, and the scan drops them on arrival without storing, logging or showing them
  • Files stored in your buckets
  • Your app code and repository

A report is stored only when you create a share link, for 7 days at most. The access grant is revoked right after the check.

What read access cannot check

  • A06 Insecure Design and A10 Mishandling of Exceptional Conditions live in your app code, not in project settings.
  • Frontend dependencies (the npm part of A03) and a service_role key bundled into frontend code. Check your repository for those.
  • Access rules that live only in app code or Edge Functions, such as a plan = 'pro' check in the frontend. The scan sees only columns the database itself uses in policies, functions and auth hooks, so a pass on writable access columns does not mean those columns are safe.
  • Whether one signed-in user can read another user’s rows. That needs a test with two real users: how to test Supabase RLS

Supabase Security Advisor and this check

QuestionSecurity AdvisorThis check
Where it runsIn the Supabase dashboard, one project at a timeOn this page, after read-only OAuth, for the project you pick
What it readsDatabase lintsThe same lints as one check, plus auth, storage, Edge Functions, backups and network settings
How results are groupedBy lintBy OWASP Top 10:2025, with the categories it cannot check named
What you get to fix itA link to the lint documentationSQL or the dashboard setting per finding, and a prompt for your AI agent
What you can keepThe list in your dashboardA PDF, or a share link that expires after 7 days

OWASP Top 10:2025 coverage

CategoryChecksStatus
A01 Broken Access Control18Covered
A02 Security Misconfiguration9Covered
A03 Software Supply Chain Failures2Partly Postgres version and extensions only. npm dependencies live in your repository.
A04 Cryptographic Failures4Covered
A05 Injection1Covered
A06 Insecure Design0Not checkable Insecure design lives in how your app works, not in settings.
A07 Authentication Failures8Covered
A08 Software or Data Integrity Failures1Covered
A09 Security Logging and Alerting Failures2Covered
A10 Mishandling of Exceptional Conditions0Not checkable Error handling lives in your app code, which read access never sees.

All 45 checks

CheckIDOWASPWorst case
RLS disabled on exposed tablesrls_disabled_exposedA01Critical
Policies that allow every rowpolicy_always_trueA01High
Policies that trust user metadatapolicy_uses_user_metadataA01High
Write policies open to anonymous visitorsanon_write_policiesA01High
Views that bypass RLSviews_without_security_invokerA01High
Materialized views or foreign tables in the APImatviews_or_foreign_tables_exposedA01Medium
Security definer functions callable from the APIsecurity_definer_executableA01High
Storage policies open to anonymous visitorsstorage_objects_anon_policiesA01High
Public storage bucketspublic_bucketsA01Low
Realtime private channels without protectionrealtime_messages_rlsA01High
Unused write grants for anonymous visitorsanon_table_grants_writeA01Low
Roles that bypass RLSroles_bypass_rlsA01High
Access columns signed-in users can changeauthz_columns_writableA01High
Delete and re-insert changes a protected columndelete_insert_bypassA01High
Unneeded table privileges for signed-in usersauthenticated_table_grants_extraA01Low
Default privileges that open new objects to the APIdefault_privileges_api_rolesA01Low
Security definer functions that check current_userdefiner_checks_current_userA01Medium
Policies without a role or a commandpolicies_without_to_or_forA01Low
Supabase Security Advisor findingsadvisor_lintsA02High
Extra schemas exposed in the Data APIextra_exposed_schemasA02High
Wildcards in redirect URLsredirect_wildcardsA02Medium
Redirect URLs over http or to localhostinsecure_redirect_urlsA02Medium
Anonymous sign-ins onanonymous_signins_enabledA02Medium
CAPTCHA off for sign-up and sign-incaptcha_disabledA02Medium
Database open to every IP addressnetwork_openA02Medium
Public buckets without upload limitspublic_bucket_no_limitsA02Low
No row cap on Data API responsespostgrest_max_rowsA02Medium
Postgres upgrade availablepostgres_upgrade_availableA03Medium
Installed extensionsextensions_listedA03Info
SSL not enforced on database connectionsssl_enforcement_offA04Medium
Access tokens valid longer than an hourjwt_expiry_longA04Medium
Sensitive-looking columns readable by anonymous visitorssensitive_columns_exposedA04High
Vault secrets readable by API rolesvault_secrets_exposedA04Critical
Dynamic SQL built from stringsdynamic_sql_concatA05Medium
Short minimum password lengthpassword_min_lengthA07High
Leaked password protection offleaked_password_protection_offA07Medium
Email confirmation offemail_confirm_offA07High
Secure email change offsecure_email_change_offA07Medium
One-time codes valid longer than an hourotp_expiry_longA07Medium
No multi-factor method enabledmfa_unavailableA07Medium
Refresh token rotation offrefresh_token_rotation_offA07Medium
Password change without reauthenticationpassword_change_no_reauthA07Low
Edge Functions without JWT verificationedge_functions_without_jwtA08Low
pgaudit not installedpgaudit_missingA09Info
No backups foundbackups_or_pitrA09Medium

Questions

How is this different from the Supabase Security Advisor?

The Security Advisor results are one of the checks. The scan adds auth settings, storage policies, Edge Functions, backups and network settings, groups everything by OWASP Top 10:2025 and gives a fix for each finding.

Is Supabase secure by default?

The platform is maintained by Supabase, but the access rules are yours. A new table created with plain SQL has Row Level Security off, and a policy written as using (true) lets anyone with the anon key read the table. The scan looks for exactly these settings.

What does “RLS disabled” mean, and how do I enable it?

With RLS disabled on a table in an exposed schema, anyone with your anon key can read every row through the Data API. Enable it with alter table public.your_table enable row level security; then add policies for the access you want.

Is it safe that my Supabase anon key is in the browser?

Yes, the anon (publishable) key is meant to be public. It can do only what your grants and RLS policies allow, which is why the scan checks those. The service_role key bypasses RLS and must never reach the browser.

Check your own project

Free and read-only. The report appears on this page.

Check my Supabase project