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.