Was macht supabase?
Kernprinzipien
1. Supabase ändert sich häufig — vor der Implementierung Änderungsprotokoll und aktuelle Dokumentation prüfen. Verlassen Sie sich nicht auf Trainingsdaten für Supabase-Funktionen. Funktionssignaturen, config.toml-Einstellungen und API-Konventionen ändern sich zwischen Versionen.
Rufen Sie zuerst https://supabase.com/changelog.md (eine kurze Zusammenfassung – kein schwerer Abruf) ab, scannen Sie nach breaking-change-Tags, die für Ihre Aufgabe relevant sind, und folgen Sie der verlinkten Seite für alle zutreffenden. Schlagen Sie dann das relevante Thema mit den untenstehenden Methoden für den Dokumentationszugriff nach.
2. Überprüfen Sie Ihre Arbeit. Führen Sie nach der Implementierung einer Korrektur eine Testabfrage aus, um die Änderung zu bestätigen. Eine Korrektur ohne Überprüfung ist unvollständig.
3. Erholen Sie sich von Fehlern, wiederholen Sie keine Endlosschleifen. Wenn ein Ansatz nach 2-3 Versuchen fehlschlägt, stoppen Sie und überdenken Sie ihn. Versuchen Sie eine andere Methode, überprüfen Sie die Dokumentation, untersuchen Sie den Fehler sorgfältiger und sehen Sie sich die relevanten Protokolle an, falls verfügbar. Supabase-Probleme werden nicht immer durch Wiederholen desselben Befehls gelöst, und die Antwort liegt nicht immer in den Protokollen, aber es lohnt sich oft, die Protokolle zu überprüfen, bevor Sie fortfahren.
4. Tabellen für die Daten-API verfügbar machen: Abhängig von den Daten-API-Einstellungen des Benutzers werden neu erstellte Tabellen möglicherweise nicht automatisch über die Daten- (REST) API verfügbar gemacht. Wenn dies der Fall ist, muss den Rollen anon und authenticated explizit Zugriff gewährt werden.
Beachten Sie, dass dies getrennt von RLS ist, das steuert, welche Zeilen sichtbar sind, sobald eine Tabelle zugänglich ist, und nicht, ob die Tabelle überhaupt zugänglich ist.
Wenn ein Benutzer meldet, dass eine per SQL erstellte Tabelle unerwartet nicht zugänglich ist, überprüfen Sie seine Daten-API-Einstellungen und ob den Rollen Zugriff über explizites GRANT SQL gewährt wurde. Wenn Sie öffentlichen (anon/authenticated) Zugriff gewähren, aktivieren Sie auch immer RLS. Siehe Tabelle für die Daten-API verfügbar machen für den vollständigen Einrichtungsworkflow.
5. RLS in exponierten Schemas.
Aktivieren Sie RLS auf jeder Tabelle in jedem exponierten Schema, einschließlich public standardmäßig. Dies ist in Supabase kritisch, da Tabellen in exponierten Schemas über die Daten-API erreichbar sein können, wenn die Rollen anon/authenticated Zugriff haben (siehe Tabelle für die Daten-API verfügbar machen). Für private Schemas bevorzugen Sie RLS als mehrschichtige Verteidigung. Erstellen Sie nach dem Aktivieren von RLS Richtlinien, die zum tatsächlichen Zugriffsmodell passen, anstatt standardmäßig für jede Tabelle dasselbe auth.uid()-Muster zu verwenden.
6. Sicherheits-Checkliste. Wenn Sie an einer Supabase-Aufgabe arbeiten, die Auth, RLS, Views, Storage oder Benutzerdaten betrifft, gehen Sie diese Checkliste durch. Dies sind Supabase-spezifische Sicherheitsfallen, die stillschweigend Schwachstellen schaffen:
-
Auth- und Sitzungssicherheit
- Verwenden Sie
user_metadata-Claims niemals für JWT-basierte Autorisierungsentscheidungen. In Supabase istraw_user_meta_datavom Benutzer bearbeitbar und kann inauth.jwt()erscheinen, daher ist es für RLS-Richtlinien oder andere Autorisierungslogik unsicher. Speichern Sie Autorisierungsdaten stattdessen inraw_app_meta_data/app_metadata. - Das Löschen eines Benutzers macht vorhandene Zugriffstoken nicht ungültig. Melden Sie sich zuerst ab oder widerrufen Sie Sitzungen, halten Sie die JWT-Ablaufzeit für sensible Apps kurz, und validieren Sie für strenge Garantien bei sensiblen Operationen
session_idgegenauth.sessions. - Wenn Sie
app_metadataoderauth.jwt()zur Autorisierung verwenden, denken Sie daran, dass JWT-Ansprüche nicht immer aktuell sind, bis das Token des Benutzers aktualisiert wird.
- Verwenden Sie
-
API-Schlüssel- und Client-Exposition
- Setzen Sie den
service_roleoder geheimen Schlüssel niemals in öffentlichen Clients ein. Bevorzugen Sie veröffentlichbare Schlüssel für Frontend-Code. Legacy-anon-Schlüssel sind nur für die Kompatibilität. In Next.js wird jedeNEXT_PUBLIC_-Umgebungsvariable an den Browser gesendet.
- Setzen Sie den
-
RLS, Views und privilegierter Datenbankcode
- Views umgehen standardmäßig RLS. Verwenden Sie in Postgres 15 und höher
CREATE VIEW ... WITH (security_invoker = true). Schützen Sie in älteren Versionen von Postgres Ihre Views, indem Sie den Zugriff für die Rollenanonundauthenticatedentziehen, oder indem Sie sie in einem nicht exponierten Schema ablegen. - UPDATE erfordert eine SELECT-Richtlinie. In Postgres RLS muss ein UPDATE zuerst die Zeile SELECTEN. Ohne eine SELECT-Richtlinie geben Updates stillschweigend 0 Zeilen zurück – kein Fehler, nur keine Änderung.
auth.role()ist veraltet – verwenden Sie stattdessen dieTO-Klausel. Supabase hatauth.role()zugunsten der direkten Angabe der Zielrolle in der Richtlinie mitTO authenticatedoderTO anonabgelehnt. Über die Veraltung hinaus brichtauth.role() = 'authenticated'' stillschweigend, wenn anonyme Anmeldungen aktiviert sind, weil anonyme Benutzer die Postgres-Rolleauthenticated` tragen und die Prüfung unabhängig davon bestehen, ob der Benutzer wirklich angemeldet ist.-- Veraltet (nicht verwenden) create policy "example" on table_name for select using ( auth.role() = 'authenticated' );TO authenticatedallein ist Authentifizierung ohne Autorisierung (BOLA / IDOR). Die Verwendung vonTO authenticatedprüft nur die Rolle – sie schränkt nicht ein, auf welche Zeilen ein Benutzer zugreifen kann. Das korrekte Muster kombiniertTO authenticatedmit einem Besitzprädikat inUSING:create policy "example" on table_name for select to authenticated using ( (select auth.uid()) = user_id );- UPDATE-Richtlinien erfordern sowohl
USINGals auchWITH CHECK. OhneWITH CHECKkann ein Benutzer dieuser_ideiner Zeile einem anderen Benutzer zuweisen:create policy "example" on table_name for update to authenticated using ( (select auth.uid()) = user_id ) with check ( (select auth.uid()) = user_id ); SECURITY DEFINER-Funktionen umgehen RLS. EineSECURITY DEFINER-Funktion wird mit den Berechtigungen ihres Erstellers ausgeführt – typischerweise einer Rolle mitbypassrls(z.B.postgres). Fügen Sie niemalsSECURITY DEFINERhinzu, um einen Berechtigungsfehler zu beheben; es entfernt stillschweigend die Zugriffskontrolle, ohne die zugrunde liegende Ursache zu beheben. Bevorzugen SieSECURITY INVOKER.SECURITY DEFINER-Funktionen inpublicsind von allen Rollen aufrufbar. Postgres gewährt standardmäßig für jede neue FunktionEXECUTEanPUBLIC, daher ist jedeSECURITY DEFINER-Funktion inpublicein öffentlicher API-Endpunkt, der vonanonundauthenticatedaufrufbar ist (die vonPUBLICerben), ohne zusätzliche Berechtigung. WennSECURITY DEFINERwirklich benötigt wird (z.B. Umgehung von RLS in einer internen Nachschlagetabelle), halten Sie die Funktion in einem nicht exponierten Schema, fügen Sie immer eineauth.uid()-Prüfung im Funktionsrumpf ein und führen Siesupabase db advisorsnach Änderungen aus.
- Views umgehen standardmäßig RLS. Verwenden Sie in Postgres 15 und höher
-
Speicherzugriffskontrolle
- Storage-Upsert erfordert INSERT + SELECT + UPDATE. Nur INSERT zu gewähren, ermöglicht neue Uploads, aber das Ersetzen von Dateien (Upsert) schlägt stillschweigend fehl. Sie benötigen alle drei.
-
Abhängigkeits- und Lieferkettensicherheit
- Pin-Paketversionen und committen Sie Sperrdateien immer, wenn Sie Supabase-Pakete installieren (
supabase-js,@supabase/ssr,supabase-pyusw.). Siehe den npm-Sicherheitsleitfaden für die vollständige Checkliste.
- Pin-Paketversionen und committen Sie Sperrdateien immer, wenn Sie Supabase-Pakete installieren (
Wenn ein Sicherheitsbedenken nicht oben abgedeckt ist, rufen Sie den Supabase-Produktsicherheitsindex ab: https://supabase.com/docs/guides/security/product-security.md