IST SUPABASE SICHER? SICHERHEITSANALYSE 2026 | VIBEEVAL

RLS ist nicht verhandelbar

Supabase exponiert deine PostgreSQL-Datenbank per Anon-Key direkt gegenüber Clients. Ohne RLS-Policies kann jeder mit deiner Projekt-URL alle Daten in ungeschützten Tabellen lesen, ändern oder löschen. Das ist kein Bug — das ist das Datenmodell. Supabase wurde so entworfen, dass die DB die Autorisierungs-Schicht ist; wenn du dieses Modell brichst, indem du RLS deaktiviert lässt, gibt es keine zweite Verteidigungslinie.

Das wichtigste mentale Modell: Der Anon-Key ist nicht „der Schlüssel, der nur lesen kann" — er ist der Schlüssel, der genau das tun darf, was deine Policies erlauben. Ohne Policies ist „alles erlaubt".

Häufige Sicherheitsprobleme

Fehlende RLS-Policies

Tabellen ohne aktiviertes RLS sind für jeden mit dem Anon-Key vollständig zugänglich, was zu kompletter Datenoffenlegung führt. Jeder, der dein Frontend lädt, sieht die Supabase-URL und den Anon-Key in den Network-Tabs der DevTools — sobald er die hat, kann er https://<project>.supabase.co/rest/v1/<table>?select=* direkt mit curl aufrufen.

Aktiviere RLS pro Tabelle und schreibe mindestens eine Policy:

alter table profiles enable row level security;

create policy "users read own profile"
  on profiles for select
  using ( auth.uid() = user_id );

create policy "users update own profile"
  on profiles for update
  using ( auth.uid() = user_id )
  with check ( auth.uid() = user_id );

Ohne with check auf update/insert kann ein Nutzer eine Zeile so ändern, dass sie nach dem Update einer anderen user_id gehört.

Leaken des Service-Role-Keys

Der service_role-Key ignoriert RLS. Ihn im Client-Code offenzulegen, gibt Angreifern Vollzugriff auf die DB. Die häufigsten Leak-Pfade, die wir sehen: in einem Next.js-NEXT_PUBLIC_*-Env-Var (alles mit diesem Prefix landet im Bundle), in einem öffentlichen GitHub-Repo unter .env.example mit echtem Wert, oder in einer Vercel-Preview-Env-Var, die für die falsche Umgebung scoped ist.

Trenne strikt: Der Service-Role-Key gehört ausschließlich in Server-Code (Edge Functions, API-Routes ohne NEXT_PUBLIC_-Prefix, Backend-Worker). Wenn du ihn im Browser brauchst, brauchst du ihn nicht — du brauchst eine bessere RLS-Policy.

Fehlerhafte RLS-Policies

RLS-Policies mit Logikfehlern schaffen unbeabsichtigte Zugriffspfade. Komplexe Policies erfordern gründliches Testen. Klassische Fallen: eine Policy nur auf select definieren und vergessen, dass update und delete ebenfalls eine brauchen; in einer using-Klausel ein Subquery auf eine andere Tabelle ohne RLS verwenden; oder true als Platzhalter setzen und nie zurückkommen, um den echten Check einzubauen.

Schreibe pgTAP-Tests pro Policy und lass sie im CI laufen — RLS ohne Tests ist Hoffnung, kein Schutz.

Storage-Bucket-Fehlkonfiguration

Supabase-Storage benötigt ebenfalls RLS. Öffentliche Buckets können sensible Dateien exponieren. Bei Uploads achte zusätzlich auf MIME-Allowlist und Größenlimit; sonst wird dein Bucket schnell zum kostenlosen CDN für fremde Inhalte.

create policy "users read own files"
  on storage.objects for select
  using ( bucket_id = 'avatars' and auth.uid()::text = (storage.foldername(name))[1] );

Edge-Functions ohne Auth-Check

Edge Functions auf Supabase laufen mit dem Service-Role-Key, wenn du sie nicht explizit anders konfigurierst. Eine Function, die einen Request annimmt und eine DB-Operation ausführt, ohne den eingehenden JWT zu verifizieren, ist effektiv ein offener Endpoint, der RLS umgeht. Verifiziere immer req.headers.get('Authorization') und nutze den User-Token für den DB-Call statt des Service-Role-Keys.

Realtime und Postgres-Changes

Supabase-Realtime respektiert RLS für postgres_changes-Subscriptions, aber nur, wenn du es einschaltest. Eine Subscription auf eine Tabelle ohne RLS streamt jede Änderung an jeden verbundenen Client.

Sicherheitsbewertung

Stärken

    • PostgreSQL mit Enterprise-Grade-Sicherheit
    • Row-Level-Security (RLS) für feingranulare Zugriffskontrolle
    • Eingebaute Authentifizierung mit JWT-Tokens
    • Open Source — Security-auditierbar
    • SOC-2-Type-II-Compliance

Bedenken

    • RLS-Policies oft fehlend oder falsch konfiguriert
    • Standardkonfigurationen können Daten offenlegen
    • Anon-Key geht in den Client — RLS ist essenziell
    • Leak des Service-Role-Keys gibt Vollzugriff
    • Komplexe RLS-Syntax führt zu Security-Lücken

Enterprise-Aspekte

Supabase bietet auf den Pro- und Team-Plänen SSO (SAML), Audit-Logs für Dashboard-Aktionen und Branch-Datenbanken für isolierte Preview-Umgebungen. Wenn du in einem regulierten Umfeld arbeitest, sind drei Punkte besonders relevant:

  • SOC-2-Boundary: Supabase ist SOC-2-Type-II-konform, aber die Compliance gilt für die Plattform — nicht für die Policies, die du selbst schreibst. Eine fehlende RLS-Policy ist deine Findings im Audit, nicht Supabases.
  • Audit-Logs: Aktiviere Audit-Logs und ship sie nach S3 oder Datadog. Ohne Off-Site-Logs hast du im Incident-Fall keine Evidenz, wer den Service-Role-Key gedreht oder eine Policy entfernt hat.
  • Branch-DBs für PRs: Nutze Branching, statt produktive Daten in Preview-Umgebungen zu kopieren. Eine geleakte Preview-URL mit echten Nutzerdaten ist ein DSGVO-Vorfall.

Das Fazit

Supabase ist als Plattform sicher, mit der erprobten Security von PostgreSQL. Der kritische Faktor ist die korrekte RLS-Konfiguration. Aktiviere RLS auf jeder Tabelle, schreibe und teste Policies gründlich und exponiere den service_role-Key niemals im Client-Code. Mit korrekter Konfiguration bietet Supabase exzellente Sicherheit.

Drei Prüfungen vor jedem Launch: (1) select * from pg_tables where rowsecurity = false and schemaname = 'public' — leere Liste? Gut. (2) Grep das Frontend-Bundle nach service_role und nach allen Keys, die nicht der Anon-Key sind. (3) Versuche als zweiter Test-Nutzer, Daten des ersten zu lesen. Wenn etwas durchkommt, ist deine Policy falsch.

Verwandte Ressourcen

Supabase absichern

Schritt-für-Schritt-Security-Guide mit RLS-Patterns, JWT-Validierung und Storage-Hardening.

Supabase-Security-Checkliste

Interaktive Security-Checkliste — von „RLS auf jeder Tabelle" bis „Audit-Logs aktiviert".

Supabase RLS Checker

Automatisierter Scan, der jede Tabelle deines Projekts auf aktiviertes RLS und mindestens eine Policy prüft.

Token Leak Checker

Findet geleakte Service-Role-Keys, Anon-Keys und JWT-Secrets in deinem Frontend-Bundle und in deinen Repos.

Vibe-Coding-Sicherheitsrisiken

Übersicht der Fehlermuster, die KI-generierter Code in Supabase-Projekten typischerweise einführt.

Scanne deine Supabase-App

Lass VibeEval deine Supabase-Anwendung auf RLS-Fehlkonfiguration und Schwachstellen prüfen — Tabellen ohne Policies, geleakte Keys, öffentliche Storage-Buckets, BOLA in Edge Functions. Ergebnisse in unter 60 Sekunden, mit Datei- und Zeilenangaben zum Fixen.

COMMON QUESTIONS

01
Ist Supabase als Plattform sicher?
Ja. Supabase läuft auf gemanagtem PostgreSQL, ist SOC-2-Type-II-konform, erzwingt TLS und patcht die eigene Infrastruktur. Die Schwachstellen, die wir in Supabase-Apps finden, liegen fast nie in der Plattform — sie liegen in fehlenden RLS-Policies, falsch geleakten Service-Role-Keys und öffentlichen Storage-Buckets, die der Entwickler selbst konfiguriert hat.
Q&A
02
Wie unterscheidet sich der Anon-Key vom Service-Role-Key?
Der Anon-Key ist als public bekannt — er gehört in den Browser und ist nur so mächtig wie deine RLS-Policies erlauben. Der Service-Role-Key ignoriert RLS komplett und gibt Vollzugriff auf jede Tabelle. Der Service-Role-Key darf niemals im Client-Bundle, in einer Vercel-Preview-Env-Var ohne Scope oder in einem öffentlichen Repo landen.
Q&A
03
Wie teste ich, ob meine RLS-Policies wirklich greifen?
Authentifiziere dich mit dem Anon-Key als zwei verschiedene Test-Nutzer, dann versuche, die Daten des jeweils anderen per `select`, `update` und `delete` zu lesen. Wenn ein Request durchgeht, der nicht durchgehen sollte, hast du eine Lücke. Supabase bietet `pgTAP` für policy-orientierte Tests im CI.
Q&A
04
Brauche ich RLS auch für Storage-Buckets?
Ja. Supabase-Storage spiegelt das gleiche Modell — jeder Bucket ist per Default privat, aber sobald du `public: true` setzt oder eine Policy schreibst, die `true` zurückgibt, sind die Dateien anonym lesbar. Schreibe pro Bucket eine Policy auf `storage.objects`, die `auth.uid()` gegen das Eigentümer-Feld prüft.
Q&A

ANALYSIERE DEINE APP

14 Tage Test. Keine Kreditkarte. Ergebnisse in unter 60 Sekunden.

KOSTENLOSEN SCAN STARTEN