So funktioniert diese Prüfung
Apps, die mit Lovable, Bolt oder v0 gebaut sind, sprechen meist direkt aus dem Browser mit Supabase. Die URL deines Projekts und sein öffentlicher Schlüssel (anon oder sb_publishable_…) stecken also in deinem JavaScript. Das ist normal: Der Schlüssel soll öffentlich sein. Scanaris findet beides, fragt die Supabase-API, welche Tabellen sie freigibt, und sendet pro Tabelle eine HEAD-Anfrage mit Prefer: count=exact. Die Antwort enthält die Zahl der Zeilen, die ein Besucher ohne Sitzung sieht, und keinerlei Daten. Veröffentlicht die API keine Tabellenliste, werden die Namen geprüft, die KI-Tools am häufigsten verwenden (profiles, users, orders, messages…). Bei Firebase wird geprüft, ob die Wurzel der Realtime Database einen Lesezugriff ohne Sitzung beantwortet.
Was ein Befund bedeutet
Eine Tabelle mit mehr als null anonym sichtbaren Zeilen kann jeder lesen, der deine Website öffnet: eine Anfrage mit dem öffentlichen Schlüssel, und er hat die ganze Tabelle. Genau das ist das Muster der Lovable-Schwachstelle (CVE-2025-48757). Mit aktivierter Row Level Security und vernünftigen Richtlinien sieht ein anonymer Besucher null Zeilen, deshalb führt eine „0“ nie zu einem Befund.
So behebst du es in Supabase
Liste die Tabellen ohne RLS auf, aktiviere es und schreibe eine Richtlinie pro Operation. Öffentlichen Lesezugriff nur dort, wo die Daten wirklich öffentlich sind (ein Blog, ein Produktkatalog).
-- 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);
So behebst du es in Firebase
Ersetze die Regeln des Testmodus durch Regeln, die standardmäßig alles verweigern und nur öffnen, was dem jeweiligen Nutzer gehört:
{
"rules": {
".read": false,
".write": false,
"users": {
"$uid": {
".read": "auth != null && auth.uid === $uid",
".write": "auth != null && auth.uid === $uid"
}
}
}
}
Die Schritt-für-Schritt-Anleitung findest du im Supabase-Leitfaden und im Firebase-Leitfaden.
Häufige Fragen
Liest Scanaris meine Daten?
Nein. Es liest nur die Zeilenzahl, die die API in einem Header zurückgibt; die Anfragen enthalten keine Tabelleninhalte, und nichts wird gespeichert.
Kann ich stattdessen den öffentlichen Schlüssel verstecken?
Nein, und das ist auch nicht nötig: Der Browser braucht ihn, um mit Supabase zu sprechen. Deine Daten schützt RLS, nicht das Verstecken des Schlüssels.