Ratgeber · 3 Min. Lesezeit
Supabase Row-Level Security prüfen: Gibt Ihre App Daten preis?
Apps aus Lovable, Bolt und vielen anderen KI-Tools speichern ihre Daten in Supabase. Ob Fremde diese Daten lesen können, entscheidet eine einzige Einstellung pro Tabelle: Row-Level Security. Mit dieser Anleitung prüfen Sie es selbst.
Eine Supabase-App spricht direkt aus dem Browser mit der Datenbank. Dafür steckt ein öffentlicher Schlüssel im Frontend – der anon- bzw. neue publishable-Key. Das ist so gewollt. Sicher ist es aber nur, wenn die Datenbank selbst entscheidet, wer welche Zeile sehen darf. Genau das macht Row-Level Security (RLS).
Fehlt RLS auf einer Tabelle, kann jeder mit dem öffentlichen Schlüssel ihren gesamten Inhalt lesen – und oft auch ändern. Bei Lovable-Projekten war das so verbreitet, dass es eine eigene Sicherheitsmeldung bekam: CVE-2025-48757, Schweregrad 9,3 von 10 (Lovable bestreitet die Einstufung).
Schritt 1: Security Advisor öffnen
Im Supabase-Dashboard unter Advisors → Security Advisor. Supabase prüft dort Ihre Datenbank automatisch. Achten Sie besonders auf diese Meldungen:
- RLS Disabled in Public – eine Tabelle im öffentlichen Schema hat keine Row-Level Security. Das ist der kritische Fall.
- RLS Enabled No Policy – RLS ist an, aber es gibt keine Regel. Dann sieht niemand etwas – sicher, aber oft ein Hinweis, dass die App anders funktioniert als gedacht.
- Security Definer View – eine View läuft mit den Rechten ihres Erstellers und umgeht damit RLS.
Jede Meldung mit Stufe «Error» gehört vor dem Livegang behoben.
Schritt 2: Selbst abfragen wie ein Fremder
Den öffentlichen Schlüssel und die Projekt-Adresse finden Sie in den Projekteinstellungen unter API – oder im Browser in den Netzwerk-Anfragen Ihrer App. Dann fragen Sie eine Tabelle ab, ohne angemeldet zu sein:
curl 'https://IHR-PROJEKT.supabase.co/rest/v1/kunden?select=*' \
-H "apikey: IHR_OEFFENTLICHER_SCHLUESSEL"
Das Ergebnis lesen Sie so:
| Antwort | Bedeutung |
|---|---|
[] |
Gut: RLS ist aktiv und gibt anonymen Nutzern nichts heraus. |
| Daten | Kritisch: Die Tabelle ist öffentlich lesbar. |
| Fehler «permission denied» | Gut: Die Rolle hat gar keinen Zugriff. |
Wiederholen Sie das für jede Tabelle mit Personendaten, Bestellungen, Nachrichten oder Zahlungsinformationen.
Schritt 3: Mit zwei Konten gegeneinander testen
Leere Antworten für Anonyme reichen nicht. Die häufigere Lücke ist eine zu grosszügige Regel für Angemeldete – etwa using (true) oder eine Regel, die nur prüft, ob jemand eingeloggt ist.
- Legen Sie zwei Testkonten an, A und B.
- Erstellen Sie mit Konto A ein paar Datensätze.
- Melden Sie sich mit Konto B an und rufen Sie die Daten ab – in der App oder per
curlmit dem Zugriffstoken von B im HeaderAuthorization: Bearer ….
Sieht B die Daten von A, ist die Regel zu offen.
Schritt 4: Regeln richtig setzen
Eine typische, sichere Regel für Daten, die einem Benutzer gehören:
alter table public.notizen enable row level security;
create policy "Eigene Notizen lesen"
on public.notizen for select
to authenticated
using ((select auth.uid()) = user_id);
create policy "Eigene Notizen anlegen"
on public.notizen for insert
to authenticated
with check ((select auth.uid()) = user_id);
Wichtig sind beide Teile: using regelt, was jemand sehen und ändern darf, with check, was er schreiben darf. Fehlt with check, kann ein Benutzer Daten im Namen eines anderen anlegen. Für Firmen-Apps mit mehreren Benutzern pro Kunde prüft die Regel statt der Benutzer-ID die Zugehörigkeit zur Organisation.
Was sonst noch auffällt
- Service-Schlüssel im Frontend. Der
service_role- bzw.secret-Key umgeht RLS vollständig. Er darf nie im Browser-Code stehen. Steht er dort, sofort im Dashboard ersetzen. - Views und Funktionen. Views sollten mit
security_invoker = trueangelegt sein. Datenbankfunktionen mitsecurity definerlaufen mit Admin-Rechten und brauchen eigene Prüfungen. - Storage. Datei-Uploads haben eigene Regeln auf
storage.objects. Ein öffentlicher Bucket macht jede Datei für jeden abrufbar, der die Adresse kennt. - Edge Functions. Prüfen Sie, ob jede Funktion das Token des Aufrufers verifiziert, bevor sie mit erhöhten Rechten arbeitet.
Wenn Sie etwas gefunden haben
Gehen Sie davon aus, dass die Daten bereits abgerufen werden konnten. Schliessen Sie die Lücke, ersetzen Sie betroffene Schlüssel, und prüfen Sie mit einer Fachperson, ob eine Meldepflicht besteht – in der Schweiz nach dem Datenschutzgesetz bei hohem Risiko an den EDÖB.
Und weil RLS selten das einzige Thema ist: In den 10 häufigsten Sicherheitslücken in KI-Code finden Sie die anderen Kandidaten.