← All checks
SecurityTypical severity: Critical

Open Database Checker

Checks whether your Supabase tables or Firebase database can be read by anyone, without logging in.

Free live check

We find your Supabase or Firebase project in your site's public code and check, with the same public key your visitors get, whether its tables can be read without logging in. We only count rows; we never download data.

Check it free in your dashboard

Free account, ready in 30 seconds. We only count rows; we never download data.

What it checks

This scanner looks in your site's public JavaScript for your Supabase project URL or Firebase Realtime Database URL and the public key the browser uses. With that same key, as any visitor could, it checks which tables answer without logging in. It only counts rows: it never downloads or stores data.

Why it matters

In Supabase the public key is meant to live in the browser: what protects the data are the Row Level Security policies. If a table has no RLS, anyone can read all of it with a single request. It is exactly the flaw behind the Lovable vulnerability (CVE-2025-48757) and the most common one in AI-built apps.

How to fix it

Turn on Row Level Security on every table and write policies that only let each user read their own rows; leave public read access only on what is truly public. In Firebase, replace the test-mode rules with rules that require a session. Then scan again to confirm the anonymous row count is zero.

How this check works

Apps built with Lovable, Bolt or v0 usually talk to Supabase straight from the browser, so your project URL and its public key (anon or sb_publishable_…) are inside your JavaScript. That is normal: the key is meant to be public. Scanaris finds them, asks the Supabase API which tables it exposes and, for each one, sends a HEAD request with Prefer: count=exact. The answer carries the number of rows a visitor without a session can see, and no data at all. If the API does not publish its table list, it tries the names AI tools use most (profiles, users, orders, messages…). For Firebase, it checks whether the Realtime Database root answers a read without a session.

What a finding means

A table with more than zero rows visible anonymously is readable by anyone who opens your site: one request with the public key and they get the whole table. This is the exact pattern of the Lovable vulnerability (CVE-2025-48757). With Row Level Security on and sensible policies, an anonymous visitor sees zero rows, which is why "0" never raises a finding.

How to fix it in Supabase

List the tables without RLS, turn it on and write one policy per operation. Leave public read access only where the data is meant to be public (a blog, a product catalogue).

-- Tables in the public schema without RLS
select c.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;

alter table public.profiles enable row level security;

create policy "profiles: own rows" on public.profiles
  for select to authenticated
  using ((select auth.uid()) = id);

How to fix it in Firebase

Replace the test-mode rules with rules that deny by default and only open what each user owns:

{
  "rules": {
    ".read": false,
    ".write": false,
    "users": {
      "$uid": {
        ".read": "auth != null && auth.uid === $uid",
        ".write": "auth != null && auth.uid === $uid"
      }
    }
  }
}

The step-by-step version for each stack is in the Supabase guide and the Firebase guide.

Frequently asked questions

Does Scanaris read my data?

No. It only reads the row count that the API returns in a header; the requests carry no table contents and nothing is stored.

Can I hide the public key instead?

No, and you do not need to: the browser needs it to talk to Supabase. What protects your data is RLS, not hiding the key.

Check it on your site

Scan your site free and see if this and 47 other checks pass, with a fix prompt for every issue.

Scan my site free

From the blog

Security by stack

Related checks