← Alle checks
BeveiligingTypische ernst: Kritiek

Controle op open database

Controleert of de Supabase-tabellen of de Firebase-database van je site zonder inloggen te lezen zijn.

Gratis live-check

We zoeken je Supabase- of Firebase-project in de openbare code van je site en controleren, met dezelfde publieke sleutel die je bezoekers krijgen, of de tabellen zonder inloggen te lezen zijn. We tellen alleen rijen; we downloaden nooit gegevens.

Controleer het gratis in je dashboard

Gratis account, klaar in 30 seconden. We tellen alleen rijen; we downloaden nooit gegevens.

Wat het checkt

Deze scanner zoekt in het openbare JavaScript van je site naar het adres van je Supabase-project of Firebase Realtime Database en de publieke sleutel die de browser gebruikt. Met diezelfde sleutel controleert hij, zoals elke bezoeker zou kunnen, welke tabellen antwoorden zonder in te loggen. Hij telt alleen rijen: hij downloadt of bewaart nooit gegevens.

Waarom het belangrijk is

In Supabase hoort de publieke sleutel in de browser: wat de gegevens beschermt, zijn de Row Level Security-policy's. Heeft een tabel geen RLS, dan kan iedereen hem met één verzoek volledig lezen. Precies dat was de Lovable-kwetsbaarheid (CVE-2025-48757) en het is de meest voorkomende fout in met AI gebouwde apps.

Hoe je het oplost

Zet Row Level Security aan op elke tabel en schrijf policy's waarmee elke gebruiker alleen zijn eigen rijen kan lezen; laat publieke leestoegang alleen op wat echt openbaar is. Vervang in Firebase de regels van de testmodus door regels die een sessie vereisen. Scan daarna opnieuw om te bevestigen dat het anonieme aantal rijen nul is.

Hoe deze controle werkt

Apps die met Lovable, Bolt of v0 zijn gebouwd, praten meestal rechtstreeks vanuit de browser met Supabase. De URL van je project en de publieke sleutel (anon of sb_publishable_…) staan dus in je JavaScript. Dat is normaal: die sleutel is bedoeld om openbaar te zijn. Scanaris vindt ze, vraagt de Supabase-API welke tabellen hij openstelt en stuurt per tabel een HEAD-verzoek met Prefer: count=exact. Het antwoord bevat het aantal rijen dat een bezoeker zonder sessie ziet, en geen enkele gegevens. Publiceert de API geen tabellenlijst, dan worden de namen geprobeerd die AI-tools het vaakst gebruiken (profiles, users, orders, messages…). Bij Firebase wordt gecontroleerd of de root van de Realtime Database een leesverzoek zonder sessie beantwoordt.

Wat een bevinding betekent

Een tabel met meer dan nul anoniem zichtbare rijen kan iedereen lezen die je site opent: één verzoek met de publieke sleutel en hij heeft de hele tabel. Precies het patroon van de Lovable-kwetsbaarheid (CVE-2025-48757). Met Row Level Security aan en redelijke policy's ziet een anonieme bezoeker nul rijen, daarom levert een "0" nooit een bevinding op.

Oplossen in Supabase

Zoek de tabellen zonder RLS, zet het aan en schrijf per bewerking een policy. Laat publieke leestoegang alleen staan waar de gegevens echt openbaar zijn (een blog, een productcatalogus).

-- 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);

Oplossen in Firebase

Vervang de regels van de testmodus door regels die standaard alles weigeren en alleen openzetten wat van elke gebruiker is:

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

Het stappenplan per situatie staat in de Supabase-gids en de Firebase-gids.

Veelgestelde vragen

Leest Scanaris mijn gegevens?

Nee. Het leest alleen het aantal rijen dat de API in een header teruggeeft; de verzoeken bevatten geen tabelinhoud en er wordt niets opgeslagen.

Kan ik de publieke sleutel niet gewoon verbergen?

Nee, en dat hoeft ook niet: de browser heeft hem nodig om met Supabase te praten. Wat je gegevens beschermt is RLS, niet het verbergen van de sleutel.

Check het op je site

Scan je site gratis en zie of deze en 47 andere checks slagen, met een fixprompt voor elk probleem.

Mijn site gratis scannen

Uit de blog

Beveiliging per stack

Gerelateerde checks