[{"data":1,"prerenderedAt":732},["ShallowReactive",2],{"blog-de-supabase-rls-disabled-in-public":3,"blog-index-de":491},{"id":4,"title":5,"body":6,"category":447,"cover":448,"coverAlt":449,"description":450,"draft":451,"extension":452,"faq":453,"image":469,"keywords":470,"meta":479,"navigation":480,"ogTitle":481,"path":482,"published":483,"seo":484,"stem":485,"tldr":486,"updated":483,"__hash__":490},"blog_de\u002Fblog\u002Fsupabase-rls-disabled-in-public.md","Supabase \"RLS disabled in public\": was die Warnung übersieht",{"type":7,"value":8,"toc":435},"minimark",[9,18,29,36,41,44,55,58,61,65,68,71,77,80,83,87,98,101,107,110,117,212,215,221,235,239,242,249,252,255,261,271,275,278,281,286,299,306,310,313,316,329,335,348,352,355,362,365,370,373,385,389,422],[10,11,12,13,17],"p",{},"Du hast den Security Advisor in deinem Supabase-Dashboard geöffnet, oder jemand\nhat dir dessen Ausgabe hingeworfen, und da steht es in Rot:\n",[14,15,16],"strong",{},"RLS disabled in public",". Darunter eine Zeile pro Tabelle, in Supabases\neigenen Worten:",[19,20,25],"pre",{"className":21,"code":23,"language":24},[22],"language-text","Table public.profiles is public, but RLS has not been enabled.\n","text",[26,27,23],"code",{"__ignoreMap":28},"",[10,30,31,32,35],{},"Hier ist der Punkt, den Anleitung um Anleitung falsch darstellt: ",[14,33,34],{},"Diese Liste\nabzuarbeiten heißt nicht, dass niemand deine Daten lesen kann."," Für eine\nPolicy, die alle hereinlässt, hat der Advisor eine eigene Regel, und diese Regel\nüberspringt genau die Form, die ein KI-Baukasten schreibt, wenn er deine App\nwieder zum Laufen bringt. Die Liste, die du gerade abgearbeitet hast, und die\nListe der Tabellen, die ein Fremder lesen kann, sind also zwei verschiedene\nListen, und eine davon steht nirgends in deinem Dashboard.",[37,38,40],"h2",{"id":39},"was-bedeutet-rls-disabled-in-public","Was bedeutet \"RLS disabled in public\"?",[10,42,43],{},"Bei einer Tabelle in deinem public-Schema ist Row Level Security ausgeschaltet,\nund die Folge davon ist, dass jeder mit deiner Projektadresse jede Zeile darin\nlesen kann.",[10,45,46,47,50,51,54],{},"Beide Hälften davon brauchen eine Erklärung. Das ",[14,48,49],{},"public-Schema"," ist der Ort,\nan den eine Tabelle geht, wenn niemand etwas anderes sagt, und es ist der Teil\ndeiner Datenbank, den Supabase im Web veröffentlicht: Jedes Projekt beantwortet\nAnfragen unter einer eigenen Adresse, und der Schlüssel, den man dafür braucht,\nsteckt in dem Code, den deine Seite an jeden Besucher schickt. ",[14,52,53],{},"Row Level\nSecurity"," ist der Schalter, der entscheidet, ob deine Regeln geprüft werden,\nbevor Zeilen herausgegeben werden. Ist er aus, gibt es nichts zu prüfen, und\ndeshalb lautet die Antwort immer ja.",[10,56,57],{},"Diese Kombination ist der Grund, warum das hier als Fehler und nicht als Warnung\ngemeldet wird. Der Advisor stuft seine Funde ein, und das hier ist die oberste\nStufe.",[10,59,60],{},"Stell dir den Advisor als Prüfer mit einem Klemmbrett vor. Er liest deine\nUnterlagen sorgfältig und er ist gut darin. Er probiert nie die Klinke. Nichts\nin diesem Panel ist das Ergebnis einer Anfrage, die jemand an deine Datenbank\ngestellt hat.",[37,62,64],{"id":63},"bricht-meine-app-wenn-ich-rls-anschalte","Bricht meine App, wenn ich RLS anschalte?",[10,66,67],{},"Ja, sofort, und genau das ist der Schalter bei der Arbeit.",[10,69,70],{},"Die Behebung, die Supabase dir gibt, ist eine Zeile, und du führst sie im SQL\nEditor aus:",[19,72,75],{"className":73,"code":74,"language":24},[22],"alter table public.profiles enable row level security;\n",[26,76,74],{"__ignoreMap":28},[10,78,79],{},"Supabases eigene Dokumentation ist deutlich, was als Nächstes passiert: Mit\neinem veröffentlichbaren Schlüssel sind die Daten über die API nicht mehr\nerreichbar, solange keine Policies definiert sind. Deine Listen kommen also leer\nzurück, deine Bildschirme bleiben weiß, und der Fehler im Advisor wird durch\neinen leiseren Eintrag ersetzt, der sagt, dass die Tabelle RLS an hat, aber\nkeine Policies.",[10,81,82],{},"Das ist die geschlossene Tür, bei der noch niemand auf der Liste steht. Als\nNächstes fügen die meisten eine Policy hinzu, die alle lesen lässt, weil danach\ndie Bildschirme wieder etwas anzeigen.",[37,84,86],{"id":85},"der-fall-nach-dem-die-warnung-gar-nicht-sucht","Der Fall, nach dem die Warnung gar nicht sucht",[10,88,89,90,93,94,97],{},"Eine Tabelle mit ",[14,91,92],{},"angeschalteter"," Row Level Security und einer Lese-Policy,\nderen Bedingung ",[26,95,96],{},"USING (true)"," lautet, gibt genau dieselben Zeilen an genau\ndenselben Fremden heraus. Der Advisor meldet sie nicht.",[10,99,100],{},"Das ist kein Versehen. Für immer wahre Policies hat Supabase durchaus eine\nRegel, und Lese-Policies lässt sie absichtlich aus. Die eigene Beschreibung der\nRegel sagt das so:",[19,102,105],{"className":103,"code":104,"language":24},[22],"SELECT policies with `USING (true)` are intentionally excluded as this\npattern is often used deliberately for public read access.\n",[26,106,104],{"__ignoreMap":28},[10,108,109],{},"Für den allgemeinen Fall hat die Regel recht. Ein Produktkatalog, eine Liste\nveröffentlichter Artikel, eine Karte mit Veranstaltungsorten: Die sollen für\njeden lesbar sein, und sie zu melden würde jeden Entwickler auf der Plattform\ndarauf trainieren, das Panel zu ignorieren. Was kein Linter wissen kann, ist, ob\nin der Tabelle vor ihm Veranstaltungsorte oder Kunden stehen.",[10,111,112,113,116],{},"Und eine Policy, die alle lesen lässt, ist der schnellste Weg, eine kaputte App\nwieder zum Laufen zu bringen, weshalb ein KI-Baukasten danach greift. Bitte\nCursor oder Lovable, die leeren Bildschirme zu reparieren, und\n",[26,114,115],{},"FOR SELECT USING (true)"," ist eine häufige Antwort. Deine App lädt, der Fehler\nverschwindet, das Panel wird still, und die Tabelle ist so lesbar wie vorher.",[118,119,120,136],"table",{},[121,122,123],"thead",{},[124,125,126,130,133],"tr",{},[127,128,129],"th",{},"Was der Advisor sehen kann",[127,131,132],{},"Wie er es meldet",[127,134,135],{},"Was ein Fremder mit deinem veröffentlichbaren Schlüssel bekommt",[137,138,139,155,169,183,198],"tbody",{},[124,140,141,145,148],{},[142,143,144],"td",{},"RLS ausgeschaltet",[142,146,147],{},"Fehler",[142,149,150],{},[151,152,154],"key-verdict",{"type":153},"danger","Jede Zeile",[124,156,157,160,163],{},[142,158,159],{},"RLS an, gar keine Policies",[142,161,162],{},"Info",[142,164,165],{},[151,166,168],{"type":167},"safe","Nichts",[124,170,171,176,179],{},[142,172,173,174],{},"RLS an, ",[26,175,115],{},[142,177,178],{},"Gar nichts",[142,180,181],{},[151,182,154],{"type":153},[124,184,185,190,193],{},[142,186,173,187],{},[26,188,189],{},"FOR ALL USING (true)",[142,191,192],{},"Warnung",[142,194,195],{},[151,196,197],{"type":153},"Jede Zeile, und er kann sie ändern",[124,199,200,205,207],{},[142,201,173,202],{},[26,203,204],{},"USING (auth.uid() = user_id)",[142,206,178],{},[142,208,209],{},[151,210,211],{"type":167},"Nur die eigenen",[10,213,214],{},"Die beiden Zeilen, bei denen gar nichts gemeldet wird, sind das Paar, bei dem es\nsich zu verweilen lohnt. Die eine ist eine Tabelle, die außerhalb deiner App\nniemand anfassen kann. Die andere ist eine Tabelle, die jeder lesen kann. Dein\nDashboard schweigt zu beiden gleich.",[216,217],"diagram",{"alt":218,"caption":219,"src":220},"Zwei Bahnen, die in denselben vier Zeilen enden, alle davon hervorgehoben. In der oberen Bahn ist der Schalter für Row Level Security aus und ein Warnzeichen steht daneben. In der unteren Bahn ist er an, eine Policy zeigt USING (true), und wo ein Zeichen wäre, steht ein leerer gestrichelter Kreis.","Dieselben vier Zeilen, an denselben Fremden herausgegeben. Der Unterschied zwischen den Bahnen ist, zu welcher dein Dashboard überhaupt etwas sagt.","\u002Fblog\u002Fsupabase-rls-disabled-in-public\u002Ftwo-tables-one-outcome-1600x640.png",[10,222,223,224,229,230,234],{},"Wie diese Policy zustande kam und wodurch du sie Tabelle für Tabelle ersetzt,\nsteht in\n",[225,226,228],"a",{"href":227},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","Row Level Security ist an, die Tabelle ist trotzdem offen",".\nWenn dieselbe Policy auch noch erlauben soll, dass deine App speichert, ist der\nFehler, den du als Nächstes triffst,\n",[225,231,233],{"href":232},"\u002Fblog\u002Fnew-row-violates-row-level-security-policy","new row violates row-level security policy",".",[37,236,238],{"id":237},"warum-die-tabelle-aus-einer-migration-nie-gewarnt-hat","Warum die Tabelle aus einer Migration nie gewarnt hat",[10,240,241],{},"Weil der Table Editor Row Level Security für dich anschaltet und SQL das nicht\ntut.",[10,243,244,245,248],{},"Supabase dokumentiert die Trennung unmissverständlich: Bei Tabellen, die über\nden Table Editor im Dashboard entstehen, ist RLS standardmäßig an, und bei\nTabellen aus rohem SQL muss es ausdrücklich angeschaltet werden. Eine Tabelle,\ndie du zusammengeklickt hast, startet geschützt. Eine Tabelle, die über eine\nMigrationsdatei, ein ",[26,246,247],{},"supabase db push",", einen Schnipsel im SQL Editor oder eine\nAnweisung deines KI-Baukastens ankam, startet offen.",[10,250,251],{},"Der zweite Weg ist der, auf dem ein KI-Baukasten Tabellen anlegt. Er schreibt\ndas SQL und führt es für dich aus, du hast das Häkchen also nie gesehen und nie\ngesehen, dass es fehlte.",[10,253,254],{},"Die Gewohnheit, die das schließt, ist die Zeile in der Migration direkt neben\ndem, was sie schützt:",[19,256,259],{"className":257,"code":258,"language":24},[22],"create table public.profiles (\n  id uuid primary key references auth.users,\n  full_name text\n);\n\nalter table public.profiles enable row level security;\n",[26,260,258],{"__ignoreMap":28},[262,263,265],"callout",{"type":264},"warn",[10,266,267,270],{},[14,268,269],{},"Der Advisor ist eine Momentaufnahme und keine Überwachung."," Er meldet, wie\ndeine Datenbank beim letzten Lauf aussah, und er zeigt dir bereitwillig weiter\nein sauberes Panel von vor der Migration heute Morgen. Lass ihn nach jeder\nÄnderung neu laufen, die eine Tabelle anlegt oder eine Policy berührt, und das\nsind in einem KI-gebauten Projekt die meisten Änderungen.",[37,272,274],{"id":273},"so-prüfst-du-die-tabellen-die-der-advisor-durchgewinkt-hat","So prüfst du die Tabellen, die der Advisor durchgewinkt hat",[10,276,277],{},"Stell deiner Datenbank die Frage, die ein Fremder stellt: Schick eine Anfrage\nvon außen, mit dem veröffentlichbaren Schlüssel, der in deiner App mitgeliefert\nwird, und sieh dir an, was zurückkommt.",[10,279,280],{},"Das ist der Unterschied, um den sich der ganze Artikel dreht. Der Advisor liest\ndeine Konfiguration. Eine Anfrage liest deine Zeilen. Das sind zwei verschiedene\nFragen, und eine Tabelle kann die erste bestehen und die zweite nicht, was eine\ngroßzügige Lese-Policy genau so tut.",[216,282],{"alt":283,"caption":284,"src":285},"Zwei Leser außerhalb einer gestrichelten Projektgrenze. Eine Lupe erreicht nur das Einstellungs-Panel darin und kommt mit einem leeren gestrichelten Kreis zurück. Die Anfrage einer Person reicht daran vorbei bis zu den Zeilen der Tabelle und kommt mit ihnen zurück.","Der Advisor endet bei deinen Einstellungen. Eine Anfrage von außen geht weiter bis zu den Zeilen, und deshalb können die beiden zur selben Tabelle Verschiedenes sagen.","\u002Fblog\u002Fsupabase-rls-disabled-in-public\u002Fsettings-versus-answer-1600x600.png",[10,287,288,289,293,294,298],{},"Wir haben diese Anfrage in großem Maßstab gestellt. Zwischen dem 12. und dem 14.\nAugust 2026 haben wir neun externe Prüfungen über 30.998 laufende Apps aus\nLovable, Base44, Replit, v0 und Bolt ausgeführt. Von den 3.680 Supabase-Apps,\nbei denen die Prüfung durchlief, hatten 2.096 mindestens eine Tabelle, die einer\nanonymen Anfrage Zeilen zurückgegeben hat. Das sind 57 %, und zwar als Anteil an\nden Apps, von denen wir eine klare Antwort bekommen haben, und nicht an allem,\nwas wir gescannt haben. Bei den Apps aus Bolt waren es 27 von 35, eine kleine\ngenug Stichprobe, um sie als Richtung und nicht als Quote zu lesen. Der\n",[225,290,292],{"href":291},"\u002Fresearch\u002Fvibe-coded-app-security-2026","vollständige Datensatz ist veröffentlicht",",\nund ",[225,295,297],{"href":296},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","worauf sich die 57 % beziehen","\ngeht die Zählung durch.",[10,300,301,302,234],{},"Du kannst dieselbe Anfrage mit einem Browser und deinem eigenen\nveröffentlichbaren Schlüssel selbst an eine Tabelle stellen. Wenn du das lieber\nnicht Tabelle für Tabelle machst: Unser kostenloser Scan fragt deine laufende\nApp von außen und sagt dir, welche Tabellen geantwortet haben. Er dauert etwa 20\nSekunden und braucht kein Konto: ",[225,303,305],{"href":304},"\u002F#scan","App scannen",[37,307,309],{"id":308},"brauche-ich-ein-backup-bevor-ich-rls-policies-ändere","Brauche ich ein Backup, bevor ich RLS-Policies ändere?",[10,311,312],{},"Für jede Tabelle, in die deine App schreibt, ja. Bei einer Tabelle, die nur\ngelesen wird und die du enger fasst, besteht das Risiko darin, dass deine App\nweiß bleibt, und nicht darin, dass Daten verschwinden.",[10,314,315],{},"Zwei verschiedene Dinge lohnen sich hier zu trennen, weil nur eines davon mit\nder Reparatur zu tun hat.",[10,317,318,321,322,324,325,328],{},[14,319,320],{},"Was eine großzügige Policy bereits erlaubt hat."," Wenn die Regel auf der\nTabelle ",[26,323,189],{}," statt ",[26,326,327],{},"FOR SELECT"," war, dann konnte jeder, der\nsie gefunden hat, Zeilen nicht nur lesen, sondern auch ändern und löschen, und\nsie heute enger zu fassen ändert nichts an gestern. Diese Variante taucht\nmeistens als Support-Nachricht über Daten auf, die sich von selbst geändert\nhaben, oder als eine Tabelle, die plötzlich leer ist.",[10,330,331,334],{},[14,332,333],{},"Die Reparatur selbst."," Policies über ein Dutzend Tabellen umzuschreiben ist\neine Änderung an einer laufenden Datenbank, geschrieben von denselben Werkzeugen\nwie das Problem. Eine Migration, die eine Policy löscht und falsch neu anlegt,\nist ein ganz gewöhnlicher Dienstag, und der Weg zurück ist eine Kopie davon, wie\nes vor einer Stunde war.",[10,336,337,338,342,343,347],{},"Auf einem bezahlten Supabase-Plan liegt die Kopie von letzter Nacht in der\nKonsole. Auf dem kostenlosen Plan gibt es nichts, worauf du zurückfallen\nkannst, weil\n",[225,339,341],{"href":340},"\u002Fblog\u002Fdoes-supabase-back-up-my-database","der kostenlose Plan überhaupt keine automatischen Backups macht",".\nWenn das auf dich zutrifft, nimm eine Kopie, bevor du eine Policy anfasst:\n",[225,344,346],{"href":345},"\u002Fblog\u002Fback-up-supabase-free-tier","So sicherst du eine Supabase-Datenbank im kostenlosen Tarif","\nist die Zehn-Minuten-Fassung.",[37,349,351],{"id":350},"wovon-reeve-care-eine-kopie-behält","Wovon Reeve Care eine Kopie behält",[10,353,354],{},"Von deiner Supabase-Datenbank, nach Zeitplan kopiert, außerhalb deines\nSupabase-Kontos gehalten, verschlüsselt und zurückgelesen, bevor sich das Datum\nin deinem Dashboard bewegt. Die Dateien, die deine Nutzer hochgeladen haben,\nreisen mit, sobald du einen Storage-Schlüssel verbindest.",[10,356,357,358,361],{},"Zwei Grenzen, vorab gesagt. Backups gibt es ",[14,359,360],{},"nur für Supabase",": Wenn deine\nDaten woanders liegen, sagen wir das, statt dir ein Abo zu verkaufen, das eine\nleere Kiste bewacht. Und der Storage-Schlüssel wird getrennt abgefragt, weil\nSupabase für Dateien keinen nur lesenden Schlüssel ausgibt, der Schlüssel für\ndeine Uploads also auch schreiben kann. Der Schlüssel für deine Datenbank kann\ndas nicht. Ihn zu verbinden ist optional, und die Datenbank wird so oder so\ngesichert.",[10,363,364],{},"Der Restore ist der Teil, auf den es in diesem Artikel ankommt. Eine alte Kopie\nüber eine laufende Datenbank zu legen ist der unheimlichste Knopf im Produkt,\nalso nimmt Care zuerst eine Kopie des aktuellen Zustands und spielt erst dann\ndie ein, die du ausgewählt hast. Der Restore hat selbst ein Rückgängig.",[216,366],{"alt":367,"caption":368,"src":369},"Eine gestrichelte Grenze um eine Datenbank, daneben das Reeve-Care-Zeichen. Schritt eins ist ein Pfeil, der die Grenze zu einer frischen Kopie verlässt. Schritt zwei ist ein Pfeil, der die gespeicherte Kopie wieder hineinbringt.","Was passiert, wenn du auf Restore drückst. Der aktuelle Zustand wird herauskopiert, bevor irgendetwas eingespielt wird, also ist auch das Drücken des Knopfes umkehrbar.","\u002Fblog\u002Fsupabase-rls-disabled-in-public\u002Frestore-takes-a-copy-first-1600x520.png",[10,371,372],{},"Die andere Hälfte von Care ist die, auf die dieser Artikel dauernd zeigt. Eine\nPolicy, die sich während einer Migration gelockert hat, findest du nicht durch\nHinschauen, also läuft dieselbe externe Prüfung nach Zeitplan erneut und sagt\ndir, wenn sich die Antwort ändert. Uptime, ein Monatsbericht und der Scan\ngehören zum selben Abo.",[10,374,375,376,380,381,234],{},"Was eine Kopie nicht tut, ist deine Policies für dich zu schreiben, und kein\nBackup macht aus einer offenen Tabelle eine geschlossene. Diese Tabellen bleiben\ndeine Aufgabe. Was die Kopie ändert, ist, was passiert, wenn die Reparatur\nschiefgeht.\n",[225,377,379],{"href":378},"\u002Fsupabase-backups","Was Reeve bei Supabase sichert, wie oft, und was ein Restore tut","\nzeichnet den ganzen Zyklus, und die Tarife und ihre Preise stehen auf der\n",[225,382,384],{"href":383},"\u002Fpricing","Preisseite",[37,386,388],{"id":387},"was-du-diese-woche-tun-solltest","Was du diese Woche tun solltest",[390,391,392],"key-takeaways",{},[393,394,395,403,409,412,419],"ul",{},[396,397,398,399,402],"li",{},"Räum zuerst die Einträge \"RLS disabled in public\" ab. Das sind die Tabellen, bei denen überhaupt nichts geprüft wird, und die Behebung ist je eine ",[26,400,401],{},"alter table","-Zeile.",[396,404,405,406,408],{},"Öffne dann Authentication → Policies und lies die Bedingung jeder Policy, die übrig geblieben ist. Ein ",[26,407,96],{}," auf einer Lese-Policy ist für den Advisor unsichtbar und für einen Fremden weit offen.",[396,410,411],{},"Entscheide Tabelle für Tabelle, ob es dir recht wäre, ihren Inhalt auf einer Seite zu veröffentlichen. Das ist die Frage, die der Linter dir nicht beantworten kann, und bei einer großzügigen Lese-Policy die einzige, die zählt.",[396,413,414,415,418],{},"Schreib ",[26,416,417],{},"alter table ... enable row level security;"," in jede Migration, die eine Tabelle anlegt, und lass den Advisor nach jeder neu laufen. Die Voreinstellung im Dashboard gilt nur für Tabellen, die du klickst.",[396,420,421],{},"Nimm eine Kopie deiner Datenbank, bevor du Policies an einer laufenden Tabelle umschreibst, und schau nach, auf welchem Supabase-Plan du bist, damit du weißt, ob du schon eine hast.",[10,423,424,425,429,430,434],{},"Fang mit der Tabelle an, die dir als öffentliche Seite am peinlichsten wäre. Die\n",[225,426,428],{"href":427},"\u002Fchecklist","Sicherheits-Checkliste in 10 Minuten"," deckt das zusammen mit dem\nRest ab, was bei einer frisch veröffentlichten App zu prüfen ist, und der\n",[225,431,433],{"href":432},"\u002Fis-your-supabase-app-safe","Supabase-Sicherheitsleitfaden"," geht durch, was\nsonst noch offen bleibt.",{"title":28,"searchDepth":436,"depth":436,"links":437},3,[438,440,441,442,443,444,445,446],{"id":39,"depth":439,"text":40},2,{"id":63,"depth":439,"text":64},{"id":85,"depth":439,"text":86},{"id":237,"depth":439,"text":238},{"id":273,"depth":439,"text":274},{"id":308,"depth":439,"text":309},{"id":350,"depth":439,"text":351},{"id":387,"depth":439,"text":388},"Sicherheitsgrundlagen","\u002Fblog\u002Fsupabase-rls-disabled-in-public\u002Fcover-1200x630.png","Ein Dashboard-Panel mit mehreren Tabellen, ein Warnzeichen neben einer davon und nichts neben den anderen.","Supabase meldet \"RLS disabled in public\" als Fehler. Zur Lese-Policy, die deine Tabelle genauso offen lässt, sagt der Advisor gar nichts.",false,"md",[454,457,460,463,466],{"q":455,"a":456},"Ist \"RLS disabled in public\" ein Fehler oder eine Warnung?","Ein Fehler, und zwar auf der höchsten Stufe, die der Advisor kennt. Der Eintrag lautet \"Table public.\u003Cname> is public, but RLS has not been enabled.\" Die beiden verwandten Einträge sind leiser: Eine Tabelle mit angeschaltetem Schalter und ganz ohne Policies wird als INFO gemeldet, und eine Policy mit einer immer wahren Bedingung als WARN. Diese Stufen sagen, wie sicher sich der Linter bei dem ist, was er in deiner Konfiguration sehen kann, und nicht, wie groß dein Problem ist.",{"q":458,"a":459},"Bricht meine App, wenn ich Row Level Security anschalte?","Sofort, ja, und genau das ist der Schalter bei der Arbeit. Supabase dokumentiert, dass Daten mit einem veröffentlichbaren Schlüssel nicht mehr über die API erreichbar sind, solange keine Policies existieren. In dem Moment, in dem du die Zeile ausführst, kommen deine Listen also leer zurück und deine Bildschirme bleiben weiß. Die App kommt zurück, sobald du eine Policy hinzufügst, die beschreibt, wer welche Zeilen sehen darf. Der Fehler, den es zu vermeiden gilt: eine, die alle hereinlässt, denn diese Variante bringt die App genauso zum Laufen.",{"q":461,"a":462},"Ich habe RLS angeschaltet und jetzt lädt nichts mehr. Was ist passiert?","Nichts ist kaputt. Mit angeschalteter Row Level Security und ohne geschriebene Policies weist Postgres (die Datenbank-Engine unter Supabase) jede Anfrage ab, auch die aus deiner eigenen App, und der Advisor tauscht seinen Fehler gegen einen INFO-Eintrag, der sagt, dass die Tabelle RLS an hat, aber keine Policies. Schreib eine Policy für die Zeilen, die deine App zeigen soll, und fang mit der an, die den angemeldeten Besucher mit der Besitzerspalte auf der Zeile vergleicht.",{"q":464,"a":465},"Meine Tabelle wird nicht gemeldet, aber jeder kann sie lesen. Wieso?","Höchstwahrscheinlich, weil Row Level Security an ist und es eine Lese-Policy mit der Bedingung USING (true) gibt. Für immer wahre Policies hat der Advisor durchaus eine Regel, und die lässt Lese-Policies absichtlich aus, weil öffentlicher Lesezugriff für einen Produktkatalog oder eine Liste veröffentlichter Artikel eine vernünftige Sache ist. Nichts in deinem Dashboard weiß, ob in deiner Tabelle Veranstaltungsorte oder Kunden stehen, also ist die Prüfung deine Sache.",{"q":467,"a":468},"Brauche ich Row Level Security, wenn meine App nur mit meinem eigenen Server spricht?","Wenn der Browser wirklich nie mit Supabase spricht und kein veröffentlichbarer Schlüssel in dem Code steht, den deine Seite an Besucher ausliefert, dann ist die Data API kein Weg hinein und Policies sind nicht das, was diese Tabellen schützt. In einer App aus Lovable, Bolt oder v0 ist das selten, weil diese Baukästen den Browser standardmäßig direkt an Supabase hängen. Öffne deine eigene Seite, schau nach, ob Projekt-URL und veröffentlichbarer Schlüssel darin stehen, und lass diese Antwort entscheiden.","\u002Fblog\u002Fsupabase-rls-disabled-in-public\u002Fcard-800x500.png",[471,472,473,474,475,476,477,478],"rls disabled in public","supabase rls warnung","supabase security advisor","supabase database linter","supabase lint 0013","table is public but rls has not been enabled","supabase rls aktivieren","rls policy always true",{},true,"Supabase: was \"RLS disabled in public\" übersieht","\u002Fblog\u002Fsupabase-rls-disabled-in-public","2026-09-09",{"title":5,"description":450},"blog\u002Fsupabase-rls-disabled-in-public",[487,488,489],"\"RLS disabled in public\" heißt genau eine Sache: Bei einer Tabelle in deinem public-Schema ist Row Level Security ausgeschaltet, also kann sie jeder lesen, der deine Projektadresse und deinen veröffentlichbaren Schlüssel hat.","Über eine Tabelle, bei der du den Schalter angemacht und danach eine Policy geschrieben hast, die alle lesen lässt, sagt die Meldung nichts. Für immer wahre Policies gibt es eine eigene Regel, und die lässt Lese-Policies absichtlich aus.","Räum die gemeldeten Tabellen auf und prüfe den Rest danach von außen. Der Advisor liest deine Einstellungen und fragt deine Datenbank nie, was ein Fremder tatsächlich zurückbekommt.","wUb1t_Ta6izeGODNyiTEguzU3tEASNEyD1bW3uSMun8",[492,499,505,511,517,523,529,535,541,547,553,559,565,571,577,578,584,590,596,602,608,614,620,626,632,637,643,649,654,660,666,672,678,684,690,695,700,706,711,716,721,727],{"path":493,"title":494,"description":495,"published":496,"category":497,"image":498,"draft":451},"\u002Fblog\u002Fsupabase-backup-auth-users","Warum in deinem Supabase-Dump keine Nutzer stehen","Führe supabase db dump allein aus und du bekommst die Form deiner Datenbank und keine einzige Zeile, und das auth-Schema mit deinen Nutzern fehlt ganz.","2026-09-23","Backups","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":500,"title":501,"description":502,"published":503,"category":447,"image":504,"draft":451},"\u002Fblog\u002Fdomain-and-certificate-expiry","Domain abgelaufen, Website offline: was jetzt passiert","Deine Domain ist abgelaufen und deine Website ist offline. Welche Frist jetzt läuft, warum das Zertifikat das kleinere Problem ist, und wie du beides prüfst.","2026-09-22","\u002Fblog\u002Fdomain-and-certificate-expiry\u002Fcard-800x500.png",{"path":506,"title":507,"description":508,"published":509,"category":447,"image":510,"draft":451},"\u002Fblog\u002Fis-lovable-safe","Ist Lovable sicher? Was 18.554 echte Lovable-Apps zeigten","Ist Lovable sicher? Wir haben 18.554 laufende Lovable-Apps mit neun Checks geprüft. Die Plattform war die sauberste von fünf. Die Funde saßen in den Apps.","2026-09-21","\u002Fblog\u002Fis-lovable-safe\u002Fcard-800x500.png",{"path":512,"title":513,"description":514,"published":515,"category":447,"image":516,"draft":451},"\u002Fblog\u002Fvibe-coded-app-security-checklist","Die Sicherheits-Checkliste für Vibe-Coding, in neun Prüfungen","Eine Sicherheits-Checkliste für Vibe-Coding mit neun Punkten, die jeder von außen an deiner Live-App nachprüfen kann, jeder mit einem Test in einer Zeile.","2026-09-20","\u002Fblog\u002Fvibe-coded-app-security-checklist\u002Fcard-800x500.png",{"path":518,"title":519,"description":520,"published":521,"category":447,"image":522,"draft":451},"\u002Fblog\u002Fstripe-secret-key-in-frontend","Ein geheimer Stripe-Schlüssel im Frontend kann Geld bewegen","Ein geheimer Stripe-Schlüssel im Frontend kann erstatten, abbuchen und jeden Kundendatensatz lesen, den du hast. Dein pk_live_-Schlüssel gehört dorthin.","2026-09-19","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Fcard-800x500.png",{"path":524,"title":525,"description":526,"published":527,"category":447,"image":528,"draft":451},"\u002Fblog\u002Fvite-and-next-public-env-vars","Vite-Env-Variablen offengelegt: der Präfix heißt veröffentlichen","Vite-Env-Variablen offengelegt: Deine App hat getan, was der Präfix verlangt. VITE_ und NEXT_PUBLIC_ heißen veröffentlichen, und die KI kannte den Preis nie.","2026-09-18","\u002Fblog\u002Fvite-and-next-public-env-vars\u002Fcard-800x500.png",{"path":530,"title":531,"description":532,"published":533,"category":447,"image":534,"draft":451},"\u002Fblog\u002Fbase44-source-maps","Base44-Sicherheit: was ein Scan meldet und was du ändern kannst","Base44-Sicherheit auf 5.438 gescannten Apps: Drei Befunde auf fast jeder gehören der Plattform, die Source Map ist das Base44-Badge, und deine Liste ist kurz.","2026-09-17","\u002Fblog\u002Fbase44-source-maps\u002Fcard-800x500.png",{"path":536,"title":537,"description":538,"published":539,"category":447,"image":540,"draft":451},"\u002Fblog\u002Fis-cursor-ai-safe","Ist Cursor AI sicher? Editor, Code und die App, die du veröffentlichst","Ist Cursor AI sicher? Drei Fragen in einer Suche: was Cursor behält, was sein Code falsch macht und ob deine veröffentlichte App offen steht.","2026-09-16","\u002Fblog\u002Fis-cursor-ai-safe\u002Fcard-800x500.png",{"path":542,"title":543,"description":544,"published":545,"category":447,"image":546,"draft":451},"\u002Fblog\u002Fis-replit-safe","Ist Replit sicher? Was wir in 3.042 Replit-Apps gefunden haben","Ist Replit sicher? Wir haben 3.042 laufende Replit-Apps mit neun externen Checks geprüft. Die Funde saßen in der veröffentlichten App, nicht im Hosting.","2026-09-15","\u002Fblog\u002Fis-replit-safe\u002Fcard-800x500.png",{"path":548,"title":549,"description":550,"published":551,"category":497,"image":552,"draft":451},"\u002Fblog\u002Fsupabase-storage-backup","Supabase Storage Backup: deine Datenbankkopie hat keine Dateien","Ein Supabase Storage Backup ist eine eigene Aufgabe. Datenbank-Backups enthalten die Liste deiner Dateien und keine davon, also bleibt jeder Upload kaputt.","2026-09-14","\u002Fblog\u002Fsupabase-storage-backup\u002Fcard-800x500.png",{"path":554,"title":555,"description":556,"published":557,"category":497,"image":558,"draft":451},"\u002Fblog\u002Fsupabase-point-in-time-recovery","Supabase Point-in-Time Recovery: Kosten und Grenzen","Supabase Point-in-Time Recovery spult deine Datenbank auf jede Sekunde der letzten Woche zurück. $100 im Monat zusätzlich zu Pro, und nur die Datenbank.","2026-09-13","\u002Fblog\u002Fsupabase-point-in-time-recovery\u002Fcard-800x500.png",{"path":560,"title":561,"description":562,"published":563,"category":497,"image":564,"draft":451},"\u002Fblog\u002Fsupabase-project-paused-recover","Supabase-Projekt pausiert? Deine Daten sind noch da","Supabase hat dein Projekt nach einer Woche ohne Aktivität pausiert. Gelöscht ist nichts, Wiederherstellen steht neben dem Namen, und du hast ein Jahr.","2026-09-12","\u002Fblog\u002Fsupabase-project-paused-recover\u002Fcard-800x500.png",{"path":566,"title":567,"description":568,"published":569,"category":447,"image":570,"draft":451},"\u002Fblog\u002Fsafest-ai-app-builder","Welcher KI-App-Builder ist am sichersten? 30.998 Apps im Test","Welcher KI-App-Builder ist am sichersten? Wir haben 30.998 aktive Apps von Lovable, Base44, Replit, v0 und Bolt gescannt. Der Builder entscheidet das nicht.","2026-09-11","\u002Fblog\u002Fsafest-ai-app-builder\u002Fcard-800x500.png",{"path":572,"title":573,"description":574,"published":575,"category":447,"image":576,"draft":451},"\u002Fblog\u002Fenable-rls-on-every-supabase-table","Row Level Security für jede Supabase-Tabelle aktivieren und prüfen","Row Level Security in Supabase ohne Policy sperrt eine Tabelle komplett. Eine Policy ohne den Schalter bringt gar nichts. Hier ist das SQL, und der Test.","2026-09-10","\u002Fblog\u002Fenable-rls-on-every-supabase-table\u002Fcard-800x500.png",{"path":482,"title":5,"description":450,"published":483,"category":447,"image":469,"draft":451},{"path":579,"title":580,"description":581,"published":582,"category":447,"image":583,"draft":451},"\u002Fblog\u002Frotate-supabase-service-role-key","Geleakten Supabase-service_role-Schlüssel richtig tauschen","Supabase sagt: erst das Leck schließen. Andere Anleitungen: sofort tauschen. Was richtig ist, hängt davon ab, wohin dein service_role-Schlüssel gelangt ist.","2026-09-08","\u002Fblog\u002Frotate-supabase-service-role-key\u002Fcard-800x500.png",{"path":585,"title":586,"description":587,"published":588,"category":447,"image":589,"draft":451},"\u002Fblog\u002Fvibe-coding-security-scanners-compared","Vibe-Coding-Security-Scanner im Vergleich, unserer eingeschlossen","Der beste Vibe-Coding-Security-Scanner hängt an drei Fragen, die keine Funktionsliste beantwortet. Zehn Tools im Vergleich, mit Preisen und unseren Lücken.","2026-09-07","\u002Fblog\u002Fvibe-coding-security-scanners-compared\u002Fcard-800x500.png",{"path":591,"title":592,"description":593,"published":594,"category":447,"image":595,"draft":451},"\u002Fblog\u002Fsupabase-security-checker","Supabase Security Checker: die fünf Prüfungen selbst machen","Ein Supabase Security Checker liest deine veröffentlichte App statt deiner Projekteinstellungen. Hier sind die fünf Prüfungen und wie du jede selbst ausführst.","2026-09-06","\u002Fblog\u002Fsupabase-security-checker\u002Fcard-800x500.png",{"path":597,"title":598,"description":599,"published":600,"category":447,"image":601,"draft":451},"\u002Fblog\u002Fvibe-coding-security-scanner","Vibe-Coding-Security-Scanner: was ein URL-Scan übersieht","Ein Vibe-Coding-Security-Scanner liest deine laufende App von außen. Was das abdeckt, die vier Dinge, die er nicht sehen kann, und wie du das Ergebnis liest.","2026-09-05","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fcard-800x500.png",{"path":603,"title":604,"description":605,"published":606,"category":447,"image":607,"draft":451},"\u002Fblog\u002Fmissing-security-headers","Fehlende Sicherheitsheader: wann sie wirklich zählen","Fehlende Sicherheitsheader ist unser häufigster Befund. Wogegen sie schützen, und wann sie die unwichtigste Zeile in deinem Bericht sind.","2026-09-04","\u002Fblog\u002Fmissing-security-headers\u002Fcard-800x500.png",{"path":609,"title":610,"description":611,"published":612,"category":447,"image":613,"draft":451},"\u002Fblog\u002Fopenai-api-key-exposed-in-frontend","Dein OpenAI-API-Schlüssel liegt im Frontend. Tausch ihn aus.","Ein OpenAI-API-Schlüssel im Frontend lässt sich an keine Domain binden. Tausch ihn heute, leg den Aufruf hinter deinen Server und begrenze das Budget.","2026-09-03","\u002Fblog\u002Fopenai-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":615,"title":616,"description":617,"published":618,"category":447,"image":619,"draft":451},"\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps","API-Schlüssel im Frontend: was 30.998 Apps wirklich ausliefern","Ein API-Schlüssel im Frontend ist meistens ein Google-Maps-Schlüssel. Wir haben 30.998 aktive Vibe-Coding-Apps gescannt und gezählt, was wirklich austritt.","2026-09-02","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps\u002Fcard-800x500.png",{"path":621,"title":622,"description":623,"published":624,"category":497,"image":625,"draft":451},"\u002Fblog\u002Fsupabase-backup-tools-compared","Supabase-Backup-Tools im Vergleich, unseres eingeschlossen","Vier Arten von Supabase-Backup-Tool, was jedes wirklich kopiert und wann eine kostenlose GitHub Action jeden Anbieter schlägt, uns eingeschlossen.","2026-09-01","\u002Fblog\u002Fsupabase-backup-tools-compared\u002Fcard-800x500.png",{"path":627,"title":628,"description":629,"published":630,"category":447,"image":631,"draft":451},"\u002Fblog\u002Freplit-secrets-explained","Secrets in Replit nutzen, und was trotzdem veröffentlicht wird","Secrets in Replit nutzen: anlegen, auslesen und die zwei Gründe beheben, warum undefined zurückkommt. Dazu die Schlüssel, die das Werkzeug nicht schützt.","2026-08-31","\u002Fblog\u002Freplit-secrets-explained\u002Fcard-800x500.png",{"path":345,"title":633,"description":634,"published":635,"category":497,"image":636,"draft":451},"Supabase Gratis-Tarif: Backup ohne Terminal selbst machen","Im Supabase Gratis-Tarif gibt es keine Backups, die Kopie musst du selbst machen. Wie das im Dashboard geht und was der CSV-Weg auslässt.","2026-08-30","\u002Fblog\u002Fback-up-supabase-free-tier\u002Fcard-800x500.png",{"path":638,"title":639,"description":640,"published":641,"category":447,"image":642,"draft":451},"\u002Fblog\u002Fis-supabase-secure","Ist Supabase sicher? Ja. Dein Projekt ist eine eigene Frage","Ist Supabase sicher? Die Plattform ist auditiert, verschlüsselt und pentestet. Supabase schreibt selbst auf, wo das aufhört und deine Einstellungen anfangen.","2026-08-29","\u002Fblog\u002Fis-supabase-secure\u002Fcard-800x500.png",{"path":644,"title":645,"description":646,"published":647,"category":447,"image":648,"draft":451},"\u002Fblog\u002Fwhere-to-find-supabase-api-keys","Wo du deine Supabase API-Keys findest: anon, service_role, URL","Projekt-URL, anon-Schlüssel und service_role-Schlüssel liegen auf einer Seite im Dashboard. Wo sie ist, und welcher der vier Werte in deine App gehört.","2026-08-28","\u002Fblog\u002Fwhere-to-find-supabase-api-keys\u002Fcard-800x500.png",{"path":232,"title":650,"description":651,"published":652,"category":447,"image":653,"draft":451},"New row violates row-level security policy in Supabase: was jetzt?","\"New row violates row-level security policy\" heißt, Supabase hat einen Schreibvorgang abgelehnt. Die schnelle Lösung öffnet die Tabelle wieder für alle.","2026-08-27","\u002Fblog\u002Fnew-row-violates-row-level-security-policy\u002Fcard-800x500.png",{"path":655,"title":656,"description":657,"published":658,"category":447,"image":659,"draft":451},"\u002Fblog\u002Fcors-wildcard-security-risk","Ist eine CORS-Wildcard ein Sicherheitsrisiko? Meist nicht.","Ist eine CORS-Wildcard ein Sicherheitsrisiko? Meist ist sie die Voreinstellung deines Builders und gibt nichts preis, was dein Server nicht ohnehin herausgab.","2026-08-26","\u002Fblog\u002Fcors-wildcard-security-risk\u002Fcard-800x500.png",{"path":661,"title":662,"description":663,"published":664,"category":497,"image":665,"draft":451},"\u002Fblog\u002Fsupabase-branching-is-not-a-backup","Supabase Branching ist kein Backup. Es geht nur vorwärts.","Warum Supabase Branching kein Backup ist: Ein Branch startet ohne deine Daten, und ein Merge bringt nur das Schema. Wofür es gut ist und was stattdessen hilft.","2026-08-25","\u002Fblog\u002Fsupabase-branching-is-not-a-backup\u002Fcard-800x500.png",{"path":667,"title":668,"description":669,"published":670,"category":497,"image":671,"draft":451},"\u002Fblog\u002Fhow-to-restore-a-supabase-backup","Supabase-Backup wiederherstellen, und was danach kaputt ist","Wie du ein Supabase-Backup aus dem Dashboard oder aus einer Dump-Datei wiederherstellst, was ersetzt wird und warum die App danach kaputt sein kann.","2026-08-24","\u002Fblog\u002Fhow-to-restore-a-supabase-backup\u002Fcard-800x500.png",{"path":673,"title":674,"description":675,"published":676,"category":447,"image":677,"draft":451},"\u002Fblog\u002Fsupabase-storage-bucket-public","Dein Supabase-Storage-Bucket ist öffentlich. Ist das ein Problem?","Ein öffentlicher Supabase-Storage-Bucket heißt: Wer die URL einer Datei hat, kann sie öffnen. Er heißt nicht, dass jemand den Inhalt auflisten darf.","2026-08-23","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcard-800x500.png",{"path":679,"title":680,"description":681,"published":682,"category":447,"image":683,"draft":451},"\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend","Ist ein Google-API-Schlüssel im Frontend ein Problem?","Ein Google-API-Schlüssel im Frontend ist der Fund unseres Scanners Nummer eins, und meistens unbedenklich. Eine kostenlose Einstellung entscheidet darüber.","2026-08-22","\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":685,"title":686,"description":687,"published":688,"category":497,"image":689,"draft":451},"\u002Fblog\u002Fai-agent-deleted-my-database","Ein KI-Agent hat meine Supabase-Daten gelöscht. Was hole ich zurück?","Ein KI-Agent hat Daten aus deiner Datenbank gelöscht. Was du zurückholst, stand schon vorher fest, und die nächsten Minuten entscheiden über den Rest.","2026-08-21","\u002Fblog\u002Fai-agent-deleted-my-database\u002Fcard-800x500.png",{"path":296,"title":691,"description":692,"published":693,"category":447,"image":694,"draft":451},"Kann jeder deine Supabase-Datenbank lesen? 3.680 Apps im Test","Kann jeder deine Supabase-Datenbank ohne Login lesen? Wir haben 30.998 aktive Apps aus KI-Buildern gescannt und gemessen, wie oft die Antwort ja lautet.","2026-08-18","\u002Fblog\u002Fcan-anyone-read-your-supabase-database\u002Fcard-800x500.png",{"path":696,"title":697,"description":698,"published":693,"category":447,"image":699,"draft":451},"\u002Fblog\u002Fsource-maps-exposed-in-production","Source-Maps öffentlich: deine App veröffentlicht ihren Quellcode","Eine öffentliche Source-Map lässt jeden den Originalcode deiner App lesen, Kommentare inklusive. Der 30-Sekunden-Check, und was wirklich zählt.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fcard-800x500.png",{"path":701,"title":702,"description":703,"published":704,"category":447,"image":705,"draft":451},"\u002Fblog\u002Fsupabase-new-api-keys","Supabases neue API-Schlüssel: welcher gehört in deine App?","Supabase hat anon und service_role durch öffentliche und geheime Schlüssel ersetzt. Welcher gehört in deine App, und welcher nie?","2026-08-12","\u002Fblog\u002Fsupabase-new-api-keys\u002Fcard-800x500.png",{"path":340,"title":707,"description":708,"published":709,"category":497,"image":710,"draft":451},"Sichert Supabase meine Datenbank? Das hängt von deinem Tarif ab.","Sichert Supabase deine Datenbank? Auf bezahlten Tarifen täglich, im Gratis-Tarif gar nicht. So findest du heraus, was du hast und was es nicht abdeckt.","2026-08-11","\u002Fblog\u002Fdoes-supabase-back-up-my-database\u002Fcard-800x500.png",{"path":227,"title":712,"description":713,"published":714,"category":447,"image":715,"draft":451},"Supabase Row Level Security ist an. Die Tabelle ist trotzdem offen.","Supabase Row Level Security anzuschalten schützt keine Tabelle. Erst deine Policies tun das, und die, die deine App repariert hat, lässt oft alle herein.","2026-08-10","\u002Fblog\u002Fsupabase-rls-on-but-table-still-public\u002Fcard-800x500.png",{"path":717,"title":718,"description":719,"published":714,"category":497,"image":720,"draft":451},"\u002Fblog\u002Fversion-history-is-not-a-backup","Der Versionsverlauf ist kein Backup. Er holt keine Tabelle zurück.","Lovable und Bolt führen einen Versionsverlauf für deinen Code. Deine Datenbank ist ein eigener Dienst, und ein Rücksprung holt deine Daten nicht zurück.","\u002Fblog\u002Fversion-history-is-not-a-backup\u002Fcard-800x500.png",{"path":722,"title":723,"description":724,"published":725,"category":497,"image":726,"draft":451},"\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database","Drei Wege, eine Supabase-Datenbank zu sichern, und was fehlt","Das Dashboard, pg_dump und ein verwalteter Dienst. Was jeder Weg wirklich sichert, was er stillschweigend auslässt und welcher den Kontoverlust übersteht.","2026-08-09","\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database\u002Fcard-800x500.png",{"path":728,"title":729,"description":730,"published":725,"category":447,"image":731,"draft":451},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","Welche API-Schlüssel im Frontend sicher sind, und welche nicht","Dein Supabase-anon-Schlüssel darf öffentlich sein. Der service_role-Schlüssel nicht. Er ignoriert jede Regel, die du setzt. So erkennst du den Unterschied.","\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend\u002Fcard-800x500.png",1790150951364]