[{"data":1,"prerenderedAt":1185},["ShallowReactive",2],{"blog-de-permission-denied-for-schema-public":3,"blog-index-de":654},{"id":4,"title":5,"body":6,"category":613,"cover":614,"coverAlt":615,"description":616,"draft":617,"extension":618,"faq":619,"image":635,"keywords":636,"meta":643,"navigation":644,"ogTitle":5,"path":645,"published":646,"seo":647,"stem":648,"tldr":649,"updated":646,"__hash__":653},"blog_de\u002Fblog\u002Fpermission-denied-for-schema-public.md","Supabase \"permission denied for schema public\": drei Ursachen",{"type":7,"value":8,"toc":599},"minimark",[9,18,21,31,38,46,51,57,87,102,116,125,131,134,138,154,163,166,172,183,187,192,199,205,214,217,221,224,230,240,243,250,253,269,274,277,281,287,299,302,306,316,344,357,361,364,367,373,399,405,425,431,447,451,454,487,494,498,501,510,528,537,554,558,593],[10,11,12,13,17],"p",{},"Gestern lief deine App noch. Heute bleibt jeder Bildschirm, der etwas aus\nSupabase liest, leer oder zeigt einen Fehler, und in der Browserkonsole steht bei\njedem dieselbe Zeile: ",[14,15,16],"code",{},"permission denied for schema public",". Du öffnest das\nSupabase-Dashboard, und alle Tabellen sind noch da. Der SQL Editor liest sie\nohne jede Beschwerde.",[10,19,20],{},"Die Antwort hinter dieser Zeile kommt meist als 401 oder 403. Auf die zwei Felder\ngekürzt, auf die es ankommt, sieht sie so aus:",[22,23,28],"pre",{"className":24,"code":26,"language":27},[25],"language-text","{\n  \"code\": \"42501\",\n  \"message\": \"permission denied for schema public\"\n}\n","text",[14,29,26],{"__ignoreMap":30},"",[10,32,33,34,37],{},"Supabase \"permission denied for schema public\" kommt von Postgres, der\nDatenbank, auf der Supabase läuft, und die Liste der Ursachen ist kurz. Jedes\nSupabase-Projekt wird mit einem Grant angelegt, der deine App ins Schema\n",[14,35,36],{},"public"," lässt. Jemand oder etwas hat ihn entfernt, und zurückholen lässt er sich\nmit einer Zeile SQL.",[10,39,40,41,45],{},"Hier ist der Teil, den man leicht verkehrt herum versteht: ",[42,43,44],"strong",{},"Dieser Grant ist die\nEingangstür des Gebäudes, und die Schlösser für deine Daten liegen weiter\ndrinnen."," Wenn ihn jemand entfernt hat, um Fremde draußen zu halten, hat er\ndeine App gleich mit ausgesperrt. Und ob es sicher ist, die Tür wieder zu öffnen,\nhängt an diesen inneren Schlössern. Sie sind es, was du prüfen solltest, bevor du\ndie Sache für erledigt hältst.",[47,48,50],"h2",{"id":49},"was-bedeutet-permission-denied-for-schema-public","Was bedeutet \"permission denied for schema public\"?",[10,52,53,54,56],{},"Es bedeutet, dass die Rolle hinter der Anfrage das Schema ",[14,55,36],{}," nicht\nbetreten darf. Postgres hat also abgelehnt, bevor es sich auch nur eine Tabelle\nangesehen hat.",[10,58,59,60,63,64,66,67,70,71,74,75,78,79,82,83,86],{},"Ein ",[42,61,62],{},"Schema"," ist ein benannter Ordner mit Tabellen in deiner Datenbank.\n",[14,65,36],{}," ist der, in den Lovable, Bolt, v0, Cursor, Claude Code und Replit deine\nTabellen legen, solange ihnen niemand etwas anderes sagt. Eine ",[42,68,69],{},"Rolle"," ist die\nArt von Besucher, von der eine Anfrage kommt: ",[14,72,73],{},"anon"," ist jemand, der nicht\nangemeldet ist, ",[14,76,77],{},"authenticated"," jemand, der angemeldet ist, und ",[14,80,81],{},"service_role","\ndein eigener Servercode mit dem geheimen Schlüssel. Ein ",[42,84,85],{},"Grant"," gibt einer\nRolle ein Recht auf eine Sache.",[10,88,89,90,93,94,101],{},"Das Recht, um das es bei diesem Fehler geht, heißt ",[14,91,92],{},"USAGE",", und die\n",[95,96,100],"a",{"href":97,"rel":98},"https:\u002F\u002Fwww.postgresql.org\u002Fdocs\u002Fcurrent\u002Fddl-priv.html",[99],"nofollow","Dokumentation von Postgres","\nbeschreibt es als das Recht, Objekte innerhalb des Schemas nachzuschlagen\n(\"look up\"). Eine Rolle ohne dieses Recht erreicht keine Tabelle in diesem\nSchema, ganz gleich, was in den Einstellungen der Tabelle selbst steht.",[10,103,104,105,109,110,112,113,115],{},"Wenn du dir durch\n",[95,106,108],{"href":107},"\u002Fblog\u002Fsupabase-permission-denied-for-table","die Tabellen-Variante dieses Fehlers","\nangewöhnt hast, jede Tabelle als Raum mit einer Tür pro Rolle zu sehen, dann ist\ndas Schema das Gebäude, in dem diese Räume liegen, und ",[14,111,92],{}," ist seine\nEingangstür. ",[14,114,16],{}," heißt, dass deine Anfrage\ndraußen vor dieser Tür steht. Welche Räume ihre Türen offen haben, spielt keine\nRolle, denn bis zu einem Raum kommt die Anfrage nie.",[10,117,118,119,124],{},"Supabase gibt diese Eingangstür allen drei Rollen, wenn ein Projekt angelegt\nwird. Das\n",[95,120,123],{"href":121,"rel":122},"https:\u002F\u002Fgithub.com\u002Fsupabase\u002Fpostgres\u002Fblob\u002Fdevelop\u002Fmigrations\u002Fdb\u002Finit-scripts\u002F00000000000000-initial-schema.sql",[99],"eigene Datenbank-Image von Supabase","\nführt diese Zeile in seinem ersten Setup-Skript aus:",[22,126,129],{"className":127,"code":128,"language":27},[25],"grant usage on schema public to postgres, anon, authenticated, service_role;\n",[14,130,128],{"__ignoreMap":30},[10,132,133],{},"Wenn deine App diesen Fehler bekommt, war der Grant also einmal da und ist jetzt\nweg.",[47,135,137],{"id":136},"warum-funktioniert-der-sql-editor-trotzdem","Warum funktioniert der SQL Editor trotzdem?",[10,139,140,141,146,147,150,151,153],{},"Weil der SQL Editor keine der Rollen deiner App benutzt. Ein\n",[95,142,145],{"href":143,"rel":144},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Ftroubleshooting\u002Ftracking-postgres-role-activity-to-specific-dashboard-users-8d3715",[99],"Troubleshooting-Artikel von Supabase","\nsagt, dass eine Abfrage von dort \"routed through the ",[14,148,149],{},"postgres"," role at the\ndatabase level\" wird, also auf Datenbankebene über die Rolle ",[14,152,149],{}," läuft.",[10,155,156,158,159,162],{},[14,157,149],{}," ist die Rolle, der deine Tabellen gehören, und wenn das Schema selbst\nüber das Dashboard oder von deinem Builder neu angelegt wurde, gehört ihr auch\ndas. Ein Eigentümer braucht keinen Grant, um sein eigenes Gebäude zu betreten.\nAlso zeigt das Dashboard jede Tabelle, ein ",[14,160,161],{},"select"," im SQL Editor liefert jede\nZeile, und dieselbe Anfrage aus deiner App wird an der Eingangstür abgewiesen.\nNichts auf diesen Bildschirmen verrät dir, dass die Rollen deiner App den Weg\nhinein verloren haben.",[10,164,165],{},"Um zu sehen, was deine App sieht, frag Postgres direkt nach ihren Rollen. Füg das\nin den SQL Editor ein:",[22,167,170],{"className":168,"code":169,"language":27},[25],"select rolname,\n       has_schema_privilege(rolname, 'public', 'USAGE') as can_enter\nfrom pg_roles\nwhere rolname in ('anon', 'authenticated', 'service_role');\n",[14,171,169],{"__ignoreMap":30},[10,173,174,175,178,179,182],{},"Jede Zeile sollte ",[14,176,177],{},"true"," zeigen. Eine Zeile mit ",[14,180,181],{},"false"," ist eine Rolle, die deine\nApp benutzt und die nicht mehr hineinkommt.",[47,184,186],{"id":185},"der-grant-öffnet-das-gebäude-die-schlösser-liegen-drinnen","Der Grant öffnet das Gebäude, die Schlösser liegen drinnen",[10,188,189,191],{},[14,190,92],{}," lässt eine Rolle bis zu den Tabellen in einem Schema. Es sagt nichts\ndarüber, welche dieser Tabellen die Rolle benutzen darf oder welche Zeilen sie\nzurückbekommt.",[10,193,194,195,198],{},"Hinter der Eingangstür stehen zwei weitere Prüfungen, und beide gehören zur\njeweiligen Tabelle. Der eigene Grant der Tabelle entscheidet, ob eine Rolle diese\nTabelle überhaupt benutzen darf, und ein fehlender ist das, was ",[14,196,197],{},"permission denied for table"," meldet. Danach entscheidet Row Level Security, die Regeln pro\nZeile, die du vielleicht schon kennst, welche Zeilen diese Rolle zurückbekommt.\nPostgres fragt alle drei in dieser Reihenfolge ab und hört bei der ersten\nAblehnung auf.",[200,201],"diagram",{"alt":202,"caption":203,"src":204},"Drei Bahnen, jede eine Anfrage von anon an dieselbe Tabelle. In der ersten ist ein vergittertes Tor mit der Aufschrift public zu, und der Pfeil endet dort mit dem Code 42501, noch vor der eigenen Tür der Tabelle. In der zweiten ist das Tor offen, und der Pfeil endet an der geschlossenen Tür der Tabelle, ebenfalls 42501. In der dritten sind Tor und Tür offen, der Pfeil endet an einer Row-Level-Security-Schranke, und zwei Zeilen der Tabelle leuchten auf.","Postgres prüft das Schema, dann die Tabelle, dann die Zeilen, und hört bei der ersten Ablehnung auf. Ein geschlossenes Tor weist eine Anfrage ab, bevor die Tür irgendeiner Tabelle überhaupt versucht wird.","\u002Fblog\u002Fpermission-denied-for-schema-public\u002Fthree-checks-in-order-1600x760.png",[10,206,207,208,210,211,213],{},"Genau diese Reihenfolge macht den Grant auf das Schema zu einem schlechten\nSchloss. Für eine Rolle heißt er alles oder nichts: Nimm ihn ",[14,209,73],{}," weg, und\njeder Bildschirm, den ein Besucher ohne Anmeldung sieht, hört auf einmal auf zu\nfunktionieren, auch eine Anmeldeseite, die irgendetwas aus deinen Tabellen liest.\nNimm ihn ",[14,212,77],{}," weg, und dasselbe passiert allen Angemeldeten. Die\nDokumentation von Postgres fügt hinzu, dass sein Entzug \"is not a completely\nsecure way to prevent object access\", also kein vollständig sicherer Weg ist,\nden Zugriff zu verhindern, und dass eine Rolle ohne ihn die Namen deiner Tabellen\nweiterhin aus den Systemkatalogen lesen kann.",[10,215,216],{},"Wenn du diesen Fehler überhaupt siehst, braucht deine App die Rolle, die\nabgewiesen wurde.",[47,218,220],{"id":219},"ursache-1-das-schema-wurde-gelöscht-und-neu-angelegt","Ursache 1: Das Schema wurde gelöscht und neu angelegt",[10,222,223],{},"Diese Ursache nimmt am meisten mit. Jemand hat diese zwei Zeilen ausgeführt oder\netwas, das dasselbe tut:",[22,225,228],{"className":226,"code":227,"language":27},[25],"drop schema public cascade;\ncreate schema public;\n",[14,229,227],{"__ignoreMap":30},[10,231,232,233,236,237,239],{},"Die erste Zeile entfernt das Schema und wegen ",[14,234,235],{},"cascade"," jede Tabelle, jede View\nund jede Funktion darin. Die zweite legt ein neues, leeres ",[14,238,36],{}," an. Ein neues\nSchema gehört der Rolle, die es angelegt hat, und die Dokumentation von Postgres\nsagt klar, dass sonst niemand standardmäßig irgendein Recht auf ein Schema\nbekommt. Der Grant, den Supabase beim Anlegen deines Projekts ausgeführt hat,\ngehörte zum alten Schema und ist mit ihm verschwunden, und Supabase führt sein\nSetup-Skript kein zweites Mal aus.",[10,241,242],{},"Diese zwei Zeilen sind der kürzeste Weg, eine Postgres-Datenbank zu leeren. Ein\nKI-Assistent greift deshalb womöglich zu ihnen, wenn du ihn bittest, die\nDatenbank neu aufzusetzen oder eine fehlschlagende Migration sauber durchlaufen\nzu lassen.",[10,244,245,246,249],{},"Danach kommen deine Tabellen zurück, wenn die Migrationen der App erneut laufen.\nEine ",[42,247,248],{},"Migration"," ist eine der Dateien mit Datenbankänderungen, die dein Builder\nschreibt, und wenn alle laufen, bauen sie die Tabellen wieder auf, die sie\nbeschreiben. Was nicht zurückkommt, ist alles, was sie nie erwähnen, und den\nGrant für die Eingangstür hat Supabase angelegt, bevor deine erste Migration\nexistierte. In Migrationen, die dein Builder geschrieben hat, kommt er\nwomöglich gar nicht vor.",[10,251,252],{},"Zwei weitere Dinge verschwinden mit dem alten Schema:",[254,255,256,263],"ul",{},[257,258,259,262],"li",{},[42,260,261],{},"Die automatischen Grants für neue Tabellen."," Postgres speichert sie als\nStandardrechte (default privileges) eines Schemas, und sie werden zusammen mit\ndem Schema gelöscht. Tabellen, die danach entstehen, haben für keine der Rollen\ndeiner App einen Grant.",[257,264,265,268],{},[42,266,267],{},"Die Zeilen."," Migrationen bauen leere Tabellen. Was in den alten stand, ist\nnur dann wieder da, wenn jemand eine Kopie eingespielt hat, die vor dem Reset\nentstanden ist.",[200,270],{"alt":271,"caption":272,"src":273},"Zwei ummauerte Höfe nebeneinander, beide mit public beschriftet. Links das ursprüngliche Schema: Tor offen, drei Tabellen mit offenen Türen und leuchtenden Zeilen, darüber Chips für postgres, anon, authenticated und service_role. Rechts das neu angelegte Schema: dieselben drei Tabellen mit geschlossenen Türen, das Tor zu, nur der Chip postgres leuchtet noch, und gestrichelte Umrisse, wo die anderen drei waren.","Vor dem Reset konnten alle vier Rollen das Schema betreten. Danach lassen sich die Tabellen neu bauen, aber das Tor und ihre Türen öffnen sich nur für postgres, die Rolle, die sie gebaut hat.","\u002Fblog\u002Fpermission-denied-for-schema-public\u002Fdrop-and-create-1600x700.png",[10,275,276],{},"Wenn deine Tabellen zurück und leer sind, kommt die Suche nach dieser Kopie vor\nallem anderen auf dieser Seite.",[47,278,280],{"id":279},"ursache-2-ein-entzug-der-absichern-sollte","Ursache 2: Ein Entzug, der absichern sollte",[10,282,283,284,286],{},"Der zweite Weg ist Absicht. Jemand hat gelesen, dass jede Tabelle in ",[14,285,36],{},"\nüber die Data API von Supabase erreichbar ist, also über die Webadresse, über\ndie deine App ihre Daten liest und schreibt, und hat den Grant auf das Schema\nentzogen, um das zu schließen.",[10,288,289,290,295,296,298],{},"Die Sorge dahinter ist berechtigt, das gewählte Werkzeug ist das falsche. Der\neigene Leitfaden von Supabase zum\n",[95,291,294],{"href":292,"rel":293},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fapi\u002Fsecuring-your-api",[99],"Absichern der Data API","\nfasst den Grant auf das Schema nie an. Er entzieht den automatischen Zugriff,\nden neue Tabellen in ",[14,297,36],{}," bekommen, sodass jede neue Tabelle zu bleibt, bis\njemand ihr absichtlich Zugriff gibt. Supabase schaltet das am 30. Oktober 2026\nfür jedes bestehende Projekt ein.",[10,300,301],{},"Hat ein Skript, das du ausgeführt hast, oder ein Assistent, den du um mehr\nSicherheit gebeten hast, den Grant auf das Schema entfernt, zeigt dir die\nPrüfabfrage oben, welche Rollen ihn verloren haben. Gib ihn den Rollen zurück,\ndie deine App benutzt, und sichere dann so ab, wie es die Abschnitte weiter\nunten beschreiben.",[47,303,305],{"id":304},"ursache-3-der-fehler-kommt-aus-einer-migration","Ursache 3: Der Fehler kommt aus einer Migration",[10,307,308,309,312,313,315],{},"Erscheint die Meldung, während etwas Tabellen anlegt, etwa eine Migration, ein\nDeployment oder Prisma oder Drizzle beim Einrichten deiner Datenbank, dann fehlt\nein anderes Recht. Um irgendetwas in einem Schema anzulegen, braucht es ",[14,310,311],{},"CREATE","\ndarauf, und die Fehlermeldung für ein fehlendes ",[14,314,311],{}," ist dieselbe Zeile.",[10,317,318,319,321,322,324,325,329,330,335,336,339,340,343],{},"Seit Postgres 15 bekommen gewöhnliche Rollen standardmäßig kein ",[14,320,311],{}," mehr auf\n",[14,323,36],{},". Die\n",[95,326,100],{"href":327,"rel":328},"https:\u002F\u002Fwww.postgresql.org\u002Fdocs\u002Fcurrent\u002Fddl-schemas.html",[99],"\nsagt, dass nur Datenbanken, die von Version 14 oder älter aktualisiert wurden,\nes noch allen geben. Ein eigener Datenbanknutzer für ein Migrationswerkzeug wird\ndeshalb schon bei seiner allerersten Tabelle abgewiesen. Der\n",[95,331,334],{"href":332,"rel":333},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fdatabase\u002Fprisma",[99],"Prisma-Leitfaden"," von\nSupabase legt einen Nutzer ",[14,337,338],{},"prisma"," an, und zu seinem Setup gehört\n",[14,341,342],{},"grant create on schema public to prisma",".",[10,345,346,347,350,351,353,354,356],{},"Die Lösung ist ein ",[14,348,349],{},"create","-Grant für genau diesen einen Migrationsnutzer.\nNiemand, der deine App besucht, muss Tabellen anlegen, deshalb bekommen ",[14,352,73],{},"\nund ",[14,355,77],{}," nie einen.",[47,358,360],{"id":359},"so-holst-du-den-grant-sicher-zurück","So holst du den Grant sicher zurück",[10,362,363],{},"Führ eine Zeile aus, prüf, dass alle drei Rollen hineinkommen, lad dann deine\nApp neu und lies, was sie als Nächstes sagt.",[10,365,366],{},"Die Zeile, im SQL Editor:",[22,368,371],{"className":369,"code":370,"language":27},[25],"grant usage on schema public to anon, authenticated, service_role;\n",[14,372,370],{"__ignoreMap":30},[10,374,375,376,379,380,383,384,387,388,390,391,393,394,398],{},"Bleib bei ",[14,377,378],{},"usage",". ",[14,381,382],{},"grant all on schema public"," beseitigt den Fehler auch, und\nauf einem Schema heißt ",[14,385,386],{},"all"," so viel wie ",[14,389,378],{}," plus ",[14,392,349],{},", also das Recht,\neigene Tabellen hinzuzufügen. Supabase rät, jeder Rolle\n",[95,395,397],{"href":292,"rel":396},[99],"nur das Nötigste"," zu\ngeben, und die Rollen deiner Besucher müssen nur hineinkommen.",[10,400,401,402,404],{},"Die Prüfabfrage von oben sollte jetzt für alle drei Rollen ",[14,403,177],{}," zeigen. Lad\ndeine App neu, und eins von zwei Dingen passiert:",[254,406,407,413],{},[257,408,409,412],{},[42,410,411],{},"Sie funktioniert."," Die Eingangstür war das Einzige, was gefehlt hat.",[257,414,415,418,419,421,422,343],{},[42,416,417],{},"Eine neue Meldung nennt eine Tabelle."," ",[14,420,197],{}," heißt,\ndass auch der eigene Grant dieser Tabelle fehlt. Damit ist nach der ersten\nUrsache zu rechnen, denn neu gebaute Tabellen haben die automatischen Grants\nnie bekommen. Gib jeder Tabelle\n",[95,423,424],{"href":107},"ihren Grant, Row Level Security und eine Regel in einer Änderung",[10,426,427,428,430],{},"Widersteh der Versuchung, jeder Rolle alles auf jeder Tabelle zu geben, damit die\nzweite Meldung verschwindet. Eine Tabelle mit Grant an ",[14,429,73],{}," und ausgeschalteter\nRow Level Security gibt jede Zeile an jeden heraus, der danach fragt, und in\ndeiner App sieht nichts anders aus.",[10,432,433,434,437,438,440,441,446],{},"Nennt die Meldung ein anderes Schema, etwa ",[14,435,436],{},"permission denied for schema api",",\ndann hat jemand dieses Schema selbst angelegt, und es hat nie die Grants\nbekommen, mit denen ",[14,439,36],{}," startet. Der Leitfaden von Supabase zu\n",[95,442,445],{"href":443,"rel":444},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fapi\u002Fusing-custom-schemas",[99],"eigenen Schemas","\nlistet die Zeilen auf, die es braucht.",[47,448,450],{"id":449},"was-du-stattdessen-absichern-solltest","Was du stattdessen absichern solltest",[10,452,453],{},"Die Mittel, die Fremde von deinen Daten fernhalten, gehören zu jeder einzelnen\nTabelle, und der Sicherheitsleitfaden von Supabase nennt sie:",[455,456,457,466,475,481],"ol",{},[257,458,459,462,463,465],{},[42,460,461],{},"Ein Grant pro Tabelle, für die Rollen, die ihn brauchen."," Eine Tabelle mit\nBestellungen braucht für ",[14,464,73],{}," überhaupt keinen Grant.",[257,467,468,471,343],{},[42,469,470],{},"Row Level Security auf jeder Tabelle, mit einer Regel.",[95,472,474],{"href":473},"\u002Fblog\u002Fenable-rls-on-every-supabase-table","Wie du sie einschaltest und prüfst, ob sie hält",[257,476,477,480],{},[42,478,479],{},"Neue Tabellen standardmäßig zu."," Das Entziehen der automatischen Grants\nerledigt das schon heute, und der 30. Oktober erledigt es für dich.",[257,482,483,486],{},[42,484,485],{},"Interne Tabellen außerhalb der Data API."," Der Leitfaden von Supabase\nbeschreibt, das, was deine App liest, in ein eigenes Schema zu legen, sodass\nalles andere in Schemas liegt, die die Data API nicht ausliefert.",[10,488,489,490,343],{},"Schau dir das Ergebnis danach von außen an, denn keiner dieser Bildschirme zeigt\ndir, was ein Fremder zurückbekommt. Unser kostenloser Scan fragt jede Tabelle,\ndie deine App nennt, wie viele Zeilen ein Besucher ohne Anmeldung bekäme, liest\ndie Zahl, ohne eine einzige Zeile abzurufen, und dauert ohne Konto etwa 20\nSekunden: ",[95,491,493],{"href":492},"\u002Fsecurity-scanner","scanne deine App",[47,495,497],{"id":496},"deine-tabellen-behalten-und-was-in-ihnen-steht","Deine Tabellen behalten, und was in ihnen steht",[10,499,500],{},"Nach heute kann noch zweierlei schiefgehen: Eine spätere Änderung öffnet eine\nTabelle für Fremde, und ein Reset wie bei der ersten Ursache nimmt deine Zeilen\nmit.",[10,502,503],{},[42,504,505,509],{},[95,506,508],{"href":507},"\u002Fwebsite-monitoring","Reeve Monitor"," prüft weiter von außen:",[254,511,512,515,522,525],{},[257,513,514],{},"die vollständige Sicherheitsprüfung jede Stunde, für bis zu drei Apps",[257,516,517,518,521],{},"eine Nachricht, wenn sich ein Ergebnis ",[42,519,520],{},"ändert",", damit eine Tabelle, die nach einer Migration aufgegangen ist, nicht wartet, bis du hinschaust",[257,523,524],{},"ob deine App erreichbar ist",[257,526,527],{},"ein monatlicher Bericht in einfacher Sprache über das, was er gesehen hat",[10,529,530],{},[42,531,532,536],{},[95,533,535],{"href":534},"\u002Fsupabase-backups","Reeve Care"," hält eine Kopie von dem, was in deinen Tabellen steht:",[254,538,539,542,545,548,551],{},[257,540,541],{},"eine verschlüsselte Kopie deiner Supabase-Datenbank nach Zeitplan, auf Reeves eigenem Speicher in der EU, außerhalb deines Supabase-Kontos",[257,543,544],{},"jede Kopie geprüft, bevor sie zählt, durch Zählen der Zeilen in jeder Tabelle",[257,546,547],{},"auch deine hochgeladenen Dateien, sobald du einen Storage-Zugang verbindest",[257,549,550],{},"eine Wiederherstellung per Klick, mit einer Sicherheitskopie des aktuellen Stands vorab",[257,552,553],{},"alles, was Monitor tut",[47,555,557],{"id":556},"was-du-jetzt-tun-solltest","Was du jetzt tun solltest",[559,560,561],"key-takeaways",{},[254,562,563,569,578,581,584,587],{},[257,564,565,566,568],{},"Führ die Prüfabfrage im SQL Editor aus. Jede Rolle mit ",[14,567,181],{}," ist eine, die deine App verloren hat.",[257,570,571,572,575,576,343],{},"Hol den Grant mit ",[14,573,574],{},"grant usage on schema public to anon, authenticated, service_role;"," zurück und bleib bei ",[14,577,378],{},[257,579,580],{},"Wurde das Schema gelöscht, sieh nach, ob deine Tabellen leer sind, und such eine Kopie von vor dem Reset.",[257,582,583],{},"Folgt ein Tabellen-Fehler, gib dieser Tabelle ihren Grant, Row Level Security und eine Regel zusammen.",[257,585,586],{},"Sichere pro Tabelle ab, wo es sich fein einstellen lässt, und lass den Grant auf das Schema in Ruhe.",[257,588,589,590,592],{},"Kam der Fehler aus einer Migration, gib ",[14,591,349],{}," dem Migrationsnutzer und sonst niemandem.",[10,594,595,596,598],{},"Fang mit der Prüfabfrage an, denn ein einziges Ergebnis sagt dir, welche Rollen\ndeiner App den Weg hinein verloren haben. Und wenn die Tür wieder offen ist,\n",[95,597,493],{"href":492},", um zu sehen, was sie einem Fremden gibt.",{"title":30,"searchDepth":600,"depth":600,"links":601},3,[602,604,605,606,607,608,609,610,611,612],{"id":49,"depth":603,"text":50},2,{"id":136,"depth":603,"text":137},{"id":185,"depth":603,"text":186},{"id":219,"depth":603,"text":220},{"id":279,"depth":603,"text":280},{"id":304,"depth":603,"text":305},{"id":359,"depth":603,"text":360},{"id":449,"depth":603,"text":450},{"id":496,"depth":603,"text":497},{"id":556,"depth":603,"text":557},"Sicherheitsgrundlagen","\u002Fblog\u002Fpermission-denied-for-schema-public\u002Fcover-1200x630.png","Ein ummauerter Hof mit Datenbanktabellen, jede Tür darin offen und hell, hinter einem Eingangstor, das mit gesenkten Gitterstäben zu ist.","Supabase \"permission denied for schema public\" heißt: Ein Grant auf das Schema fehlt. Was ihn entfernt hat und welche Zeile ihn zurückbringt.",false,"md",[620,623,626,629,632],{"q":621,"a":622},"Was bedeutet \"permission denied for schema public\" in Supabase?","Es bedeutet, dass die Rolle hinter der Anfrage, meist anon oder authenticated, das Schema public nicht betreten darf. Postgres hat also abgelehnt, bevor es irgendeine Tabelle angesehen hat. Der Fehler trägt den Code 42501 und erreicht deine App meist als 401 oder 403. Jedes Supabase-Projekt startet mit diesem Recht, der Fehler heißt also, dass jemand oder etwas es entfernt hat.",{"q":624,"a":625},"Ist es sicher, usage auf das Schema public zu vergeben?","Ja. Jedes Supabase-Projekt startet mit genau diesem Grant. Er lässt eine Rolle nur bis zu den Tabellen im Schema: Jede Tabelle braucht weiterhin ihren eigenen Grant, und Row Level Security entscheidet weiterhin, welche Zeilen jeder Besucher bekommt. Einen Blick verdienen die Tabellen dahinter, denn eine mit Grant an anon und ausgeschalteter Row Level Security gibt jede Zeile an jeden heraus, der danach fragt.",{"q":627,"a":628},"Was ist der Unterschied zu \"permission denied for table\"?","Der Schema-Fehler stoppt eine Anfrage, bevor sie irgendeine Tabelle erreicht, deshalb schlagen alle Tabellen im Schema auf einmal fehl. Der Tabellen-Fehler betrifft eine einzelne Tabelle, die für diese Rolle keinen Grant hat, und der Rest deiner App läuft weiter. Beide tragen den Code 42501, unterscheiden lassen sie sich also nur am Wortlaut der Meldung.",{"q":630,"a":631},"Warum funktionieren meine Tabellen im Supabase SQL Editor, aber nicht in meiner App?","Weil der SQL Editor deine Abfragen als Rolle postgres ausführt. Ihr gehören deine Tabellen, und sie braucht den Grant nicht, den die Rollen deiner App verloren haben. Deine App benutzt anon für Besucher ohne Anmeldung und authenticated für angemeldete. Frag Postgres mit has_schema_privilege direkt nach diesen beiden Rollen, dann siehst du, was deine App sieht.",{"q":633,"a":634},"Was sollte ich stattdessen absichern?","Die Tabellen. Gib jeder Tabelle nur für die Rollen einen Grant, die ihn brauchen, schalte Row Level Security mit einer Regel auf jeder Tabelle ein und lass neue Tabellen ganz ohne Zugriff starten. Diesen letzten Teil macht Supabase am 30. Oktober 2026 für bestehende Projekte zum Standard.","\u002Fblog\u002Fpermission-denied-for-schema-public\u002Fcard-800x500.png",[16,637,638,639,640,641,642],"supabase permission denied for schema public","supabase permission denied for schema","grant usage on schema public","postgres 42501 schema public","drop schema public cascade supabase","supabase anon rolle rechte",{},true,"\u002Fblog\u002Fpermission-denied-for-schema-public","2026-10-18",{"title":5,"description":616},"blog\u002Fpermission-denied-for-schema-public",[650,651,652],"Supabase \"permission denied for schema public\" bedeutet, dass die Rolle hinter der Anfrage das Schema public überhaupt nicht betreten darf. Postgres hat also abgelehnt, bevor es sich auch nur eine Tabelle angesehen hat.","Jedes Supabase-Projekt startet mit diesem Recht für anon, authenticated und service_role. Bekommt deine App diesen Fehler, hat etwas es entfernt: Das Schema wurde gelöscht und neu angelegt, oder ein Skript hat den Grant entzogen.","Zurückholen lässt er sich mit einer Zeile SQL. Der Grant lässt eine Rolle nur bis zu deinen Tabellen, welche Zeilen ein Besucher bekommt, entscheidet weiterhin Row Level Security. Prüf diese Regeln, bevor du es für erledigt hältst.","fB5d0UVlDDff58Q5C39psdIn_KxNI4aGX6mwEJYHRbY",[655,661,667,673,679,685,691,697,703,709,715,722,728,734,740,746,752,758,764,770,776,782,788,789,795,801,807,813,819,825,831,837,843,849,855,861,867,873,879,885,891,897,903,909,915,921,925,931,937,943,949,955,961,967,973,979,985,991,997,1003,1009,1015,1020,1026,1032,1038,1044,1050,1056,1062,1068,1074,1080,1086,1092,1098,1104,1110,1116,1122,1128,1134,1140,1146,1151,1157,1163,1169,1174,1180],{"path":656,"title":657,"description":658,"published":659,"category":613,"image":660,"draft":617},"\u002Fblog\u002Fmax-client-connections-reached","Supabase \"max client connections reached\" erklärt","Supabase \"max client connections reached\": Der Pooler hat keinen Platz für noch einen Client. Der Port in deinem Connection String setzt das Limit.","2026-11-09","\u002Fblog\u002Fmax-client-connections-reached\u002Fcard-800x500.png",{"path":662,"title":663,"description":664,"published":665,"category":613,"image":666,"draft":617},"\u002Fblog\u002Funsupported-provider-provider-is-not-enabled","Supabase-Fehler: \"Unsupported provider: provider is not enabled\"","\"Unsupported provider: provider is not enabled\" heißt: Google-Login ist in deinem Supabase-Projekt aus. Die Lösung, und was bei redirect_uri_mismatch hilft.","2026-11-08","\u002Fblog\u002Funsupported-provider-provider-is-not-enabled\u002Fcard-800x500.png",{"path":668,"title":669,"description":670,"published":671,"category":613,"image":672,"draft":617},"\u002Fblog\u002Fviolates-foreign-key-constraint","Supabase-Fehler \"violates foreign key constraint\" beim Einfügen","Supabase \"insert or update on table violates foreign key constraint\": Deine Zeile zeigt auf eine, die es nicht gibt. Welche, warum, und die Lösung.","2026-11-07","\u002Fblog\u002Fviolates-foreign-key-constraint\u002Fcard-800x500.png",{"path":674,"title":675,"description":676,"published":677,"category":613,"image":678,"draft":617},"\u002Fblog\u002Fnull-value-violates-not-null-constraint","Supabase-Fehler \"null value in column violates not-null constraint\"","Supabase \"null value in column violates not-null constraint\": Eine Pflichtspalte kam leer an. Woher die Null kommt, und die Lösung.","2026-11-06","\u002Fblog\u002Fnull-value-violates-not-null-constraint\u002Fcard-800x500.png",{"path":680,"title":681,"description":682,"published":683,"category":613,"image":684,"draft":617},"\u002Fblog\u002Fauth-session-missing","Supabase \"Auth session missing!\": wo die Sitzung geblieben ist","\"Auth session missing!\" heißt: supabase-js fand keine angemeldete Sitzung und fragte Supabase gar nicht erst. Wo die Sitzung blieb, und die Lösung je Fall.","2026-11-05","\u002Fblog\u002Fauth-session-missing\u002Fcard-800x500.png",{"path":686,"title":687,"description":688,"published":689,"category":613,"image":690,"draft":617},"\u002Fblog\u002Finvalid-claim-missing-sub-claim","Supabase \"invalid claim: missing sub claim\": niemand ist angemeldet","\"invalid claim: missing sub claim\" heißt: Supabase Auth bekam ein echtes Token ohne Nutzer darin, deinen Projektschlüssel statt einer Sitzung.","2026-11-04","\u002Fblog\u002Finvalid-claim-missing-sub-claim\u002Fcard-800x500.png",{"path":692,"title":693,"description":694,"published":695,"category":613,"image":696,"draft":617},"\u002Fblog\u002Ffailed-to-send-a-request-to-the-edge-function","\"Failed to send a request to the Edge Function\": der echte Grund","\"Failed to send a request to the Edge Function\" heißt: Der Browser hat keine lesbare Antwort bekommen. Seine Konsole sagt, warum, und ob deine Funktion lief.","2026-11-03","\u002Fblog\u002Ffailed-to-send-a-request-to-the-edge-function\u002Fcard-800x500.png",{"path":698,"title":699,"description":700,"published":701,"category":613,"image":702,"draft":617},"\u002Fblog\u002Fsupabase-auth-redirects-to-localhost","Warum Supabase-E-Mail-Links auf localhost:3000 weiterleiten","Leitet Supabase auf localhost:3000 um, ist die Site URL unverändert, oder deine Adresse fehlt in Redirect URLs. Die Lösung und der Platzhalter, den du meidest.","2026-11-02","\u002Fblog\u002Fsupabase-auth-redirects-to-localhost\u002Fcard-800x500.png",{"path":704,"title":705,"description":706,"published":707,"category":613,"image":708,"draft":617},"\u002Fblog\u002Femail-link-is-invalid-or-has-expired","Supabase \"Email link is invalid or has expired\" bei einem neuen Link","Bei einem Link von vor einer Minute heißt Supabases \"Email link is invalid or has expired\" meist: Ein Mailfilter hat ihn zuerst benutzt. Prüfen und beheben.","2026-11-01","\u002Fblog\u002Femail-link-is-invalid-or-has-expired\u002Fcard-800x500.png",{"path":710,"title":711,"description":712,"published":713,"category":613,"image":714,"draft":617},"\u002Fblog\u002Fcanceling-statement-due-to-statement-timeout","Supabase \"canceling statement due to statement timeout\" erklärt","Supabase \"canceling statement due to statement timeout\": Eine Abfrage lief länger als ihre Rolle darf, 3 Sekunden für Besucher. Prüf zuerst die RLS-Regel.","2026-10-31","\u002Fblog\u002Fcanceling-statement-due-to-statement-timeout\u002Fcard-800x500.png",{"path":716,"title":717,"description":718,"published":719,"category":720,"image":721,"draft":617},"\u002Fblog\u002Fdatabase-error-deleting-user","\"Database error deleting user\" in Supabase und was mitgelöscht wird","\"Database error deleting user\" in Supabase heißt: Deine Datenbank hat das Löschen abgelehnt. Der Grund steht im Log, die Lösung entscheidet, was mitgeht.","2026-10-30","Backups","\u002Fblog\u002Fdatabase-error-deleting-user\u002Fcard-800x500.png",{"path":723,"title":724,"description":725,"published":726,"category":613,"image":727,"draft":617},"\u002Fblog\u002Fstripe-webhook-no-signatures-found","\"No signatures found matching the expected signature\" bei Supabase","Ein Stripe-Webhook in einer Supabase Edge Function meldet \"No signatures found matching the expected signature\"? Zwei Ursachen. Prüfe weiter.","2026-10-29","\u002Fblog\u002Fstripe-webhook-no-signatures-found\u002Fcard-800x500.png",{"path":729,"title":730,"description":731,"published":732,"category":613,"image":733,"draft":617},"\u002Fblog\u002Fsupabase-invalid-login","\"Invalid login credentials\" in Supabase: die drei Ursachen","Supabase sagt \"Invalid login credentials\" bei falschem Passwort, unbekannter E-Mail und Google-Konto. So erkennst du, welcher Fall es ist.","2026-10-28","\u002Fblog\u002Fsupabase-invalid-login\u002Fcard-800x500.png",{"path":735,"title":736,"description":737,"published":738,"category":613,"image":739,"draft":617},"\u002Fblog\u002Fedge-function-returned-a-non-2xx-status-code","\"Edge Function returned a non-2xx status code\": der echte Fehler","\"Edge Function returned a non-2xx status code\" heißt: Deine Supabase-Funktion hat mit einem Fehler geantwortet. So liest du den echten.","2026-10-27","\u002Fblog\u002Fedge-function-returned-a-non-2xx-status-code\u002Fcard-800x500.png",{"path":741,"title":742,"description":743,"published":744,"category":613,"image":745,"draft":617},"\u002Fblog\u002Fcertificate-not-trusted","Zertifikat nicht vertrauenswürdig: drei Ursachen außer Ablauf","Zertifikat nicht vertrauenswürdig, obwohl das Datum stimmt? Es nennt eine andere Adresse, hat sich selbst signiert oder seiner Kette fehlt ein Glied.","2026-10-26","\u002Fblog\u002Fcertificate-not-trusted\u002Fcard-800x500.png",{"path":747,"title":748,"description":749,"published":750,"category":613,"image":751,"draft":617},"\u002Fblog\u002Finvalid-input-syntax-for-type-uuid","Supabase \"invalid input syntax for type uuid\": was im Zitat steht","Supabase \"invalid input syntax for type uuid\" heißt: Deine App hat etwas geschickt, das keine ID ist. Zitat lesen, Abfrage zurückhalten, Spalte behalten.","2026-10-25","\u002Fblog\u002Finvalid-input-syntax-for-type-uuid\u002Fcard-800x500.png",{"path":753,"title":754,"description":755,"published":756,"category":613,"image":757,"draft":617},"\u002Fblog\u002Fduplicate-key-value-violates-unique-constraint","Supabase \"duplicate key value violates unique constraint\" erklärt","Supabase \"duplicate key value violates unique constraint\" heißt: Der Wert ist schon vergeben. Spalte finden, Lösung wählen, Wert vom Bildschirm fernhalten.","2026-10-24","\u002Fblog\u002Fduplicate-key-value-violates-unique-constraint\u002Fcard-800x500.png",{"path":759,"title":760,"description":761,"published":762,"category":613,"image":763,"draft":617},"\u002Fblog\u002Fsupabase-relation-does-not-exist","Supabase \"relation does not exist\", obwohl die Tabelle da ist","Supabase \"relation does not exist\" oder PGRST205: Keine Tabelle passt zu Name und Schema deiner Abfrage. Vier Prüfungen, und was eine Freigabe öffnet.","2026-10-23","\u002Fblog\u002Fsupabase-relation-does-not-exist\u002Fcard-800x500.png",{"path":765,"title":766,"description":767,"published":768,"category":613,"image":769,"draft":617},"\u002Fblog\u002Fsupabase-function-not-found","Supabase PGRST202: \"Could not find the function in the schema cache\"","Supabase \"Could not find the function in the schema cache\" nennt die Argumente, die deine App geschickt hat. Vergleich sie mit der Funktion.","2026-10-22","\u002Fblog\u002Fsupabase-function-not-found\u002Fcard-800x500.png",{"path":771,"title":772,"description":773,"published":774,"category":613,"image":775,"draft":617},"\u002Fblog\u002Fsupabase-schema-cache-column-error","Supabase PGRST204: \"Could not find the column in the schema cache\"","Supabase \"Could not find the column in the schema cache\" heißt meist: Der Name passt nicht. Vier Prüfungen und der Einzeiler zum Neuladen.","2026-10-21","\u002Fblog\u002Fsupabase-schema-cache-column-error\u002Fcard-800x500.png",{"path":777,"title":778,"description":779,"published":780,"category":613,"image":781,"draft":617},"\u002Fblog\u002Fsupabase-email-rate-limit-exceeded","Supabase \"Email Rate Limit Exceeded\": zwei Limits, ein Fehlercode","Supabase \"Email Rate Limit Exceeded\" begrenzt jede E-Mail deines Projekts: 2 pro Stunde beim eingebauten Absender. Was zählt und wie du es anhebst.","2026-10-20","\u002Fblog\u002Fsupabase-email-rate-limit-exceeded\u002Fcard-800x500.png",{"path":783,"title":784,"description":785,"published":786,"category":613,"image":787,"draft":617},"\u002Fblog\u002Fsupabase-users-logged-out","Supabase \"Invalid Refresh Token: Refresh Token Not Found\": 3 Ursachen","Supabase \"Invalid Refresh Token: Refresh Token Not Found\" meldet deine Nutzer ab. Drei Ursachen, und wie das Auth-Log sie trennt.","2026-10-19","\u002Fblog\u002Fsupabase-users-logged-out\u002Fcard-800x500.png",{"path":645,"title":5,"description":616,"published":646,"category":613,"image":635,"draft":617},{"path":790,"title":791,"description":792,"published":793,"category":613,"image":794,"draft":617},"\u002Fblog\u002Fsupabase-bucket-not-found","Supabase \"Bucket not found\": die drei Dinge, die es bedeutet","Supabase \"Bucket not found\" ist eins von drei Dingen: ein öffentlicher Link zu einem privaten Bucket, ein ungenauer Name oder das falsche Projekt.","2026-10-17","\u002Fblog\u002Fsupabase-bucket-not-found\u002Fcard-800x500.png",{"path":796,"title":797,"description":798,"published":799,"category":613,"image":800,"draft":617},"\u002Fblog\u002Fsupabase-invalid-jwt","Supabase invalid JWT: Welcher Schlüssel streikt hier?","Ein Supabase invalid JWT ist PGRST301: ein signiertes Token hat die Prüfung nicht bestanden. In neueren Projekten ist das die Sitzung, nicht der API-Schlüssel.","2026-10-16","\u002Fblog\u002Fsupabase-invalid-jwt\u002Fcard-800x500.png",{"path":802,"title":803,"description":804,"published":805,"category":613,"image":806,"draft":617},"\u002Fblog\u002Fsupabase-single-row-error","Supabase \"multiple (or no) rows returned\" heißt meist: keine Zeilen","Supabase gibt PGRST116 zurück, \"JSON object requested, multiple (or no) rows returned\", wenn die Abfrage nichts fand. Versteckte Zeilen wirken fehlend.","2026-10-15","\u002Fblog\u002Fsupabase-single-row-error\u002Fcard-800x500.png",{"path":808,"title":809,"description":810,"published":811,"category":613,"image":812,"draft":617},"\u002Fblog\u002Fdatabase-error-saving-new-user","\"Database error saving new user\" in Supabase: wo du nachsiehst","\"Database error saving new user\" heißt: etwas an deiner Supabase-Registrierung ist fehlgeschlagen. Der echte Fehler steht in deinen Logs.","2026-10-14","\u002Fblog\u002Fdatabase-error-saving-new-user\u002Fcard-800x500.png",{"path":814,"title":815,"description":816,"published":817,"category":613,"image":818,"draft":617},"\u002Fblog\u002Fwhat-is-supabase","Was ist Supabase? Die Datenbank, die dein Builder ausgesucht hat","Was ist Supabase: die Datenbank, der Login und der Dateispeicher hinter deiner App. Supabase betreibt die Server, die Regeln zu deinen Zeilen gehören dir.","2026-10-13","\u002Fblog\u002Fwhat-is-supabase\u002Fcard-800x500.png",{"path":820,"title":821,"description":822,"published":823,"category":613,"image":824,"draft":617},"\u002Fblog\u002Faws-access-key-exposed-in-frontend","Ein offengelegter AWS-Schlüssel im Frontend ist kein OpenAI-Key","Ein im Frontend offengelegter AWS-Zugriffsschlüssel liest und schreibt deinen Speicher. Die Lösung ist meist eine presigned URL, kein neuer Schlüssel.","2026-10-12","\u002Fblog\u002Faws-access-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":826,"title":827,"description":828,"published":829,"category":613,"image":830,"draft":617},"\u002Fblog\u002Fstorage-upload-violates-row-level-security","\"Row-level security policy for table objects\" beim Upload","\"New row violates row-level security policy for table objects\" heißt: Deinem Upload fehlt eine insert-Regel. Ein öffentlicher Bucket fügt keine hinzu.","2026-10-11","\u002Fblog\u002Fstorage-upload-violates-row-level-security\u002Fcard-800x500.png",{"path":832,"title":833,"description":834,"published":835,"category":613,"image":836,"draft":617},"\u002Fblog\u002Fbase44-security-scan","Base44 Security Scan: das, was nur er sehen kann","Der Base44 Security Scan prüft sieben Arten von Problemen von innen. Hier ist die Hälfte, die er liest und sonst niemand, und die Hälfte, die er nie ansieht.","2026-10-10","\u002Fblog\u002Fbase44-security-scan\u002Fcard-800x500.png",{"path":838,"title":839,"description":840,"published":841,"category":613,"image":842,"draft":617},"\u002Fblog\u002Fapi-key-leaked-what-to-do","Dein API-Key wurde geleakt. Die richtige Reihenfolge","Ein API-Key wurde geleakt und du weißt nicht, was zuerst zu tun ist. Nicht jeder Key im Frontend ist ein Leck, und die Reihenfolge zählt mehr als das Tempo.","2026-10-09","\u002Fblog\u002Fapi-key-leaked-what-to-do\u002Fcard-800x500.png",{"path":844,"title":845,"description":846,"published":847,"category":613,"image":848,"draft":617},"\u002Fblog\u002Finfinite-recursion-in-policy-for-relation","\"Infinite recursion detected in policy\" ohne RLS abzuschalten","\"Infinite recursion detected in policy for relation\" heißt: Deine Policy hat die Tabelle gefragt, die sie schützt. So brichst du den Kreis.","2026-10-08","\u002Fblog\u002Finfinite-recursion-in-policy-for-relation\u002Fcard-800x500.png",{"path":850,"title":851,"description":852,"published":853,"category":613,"image":854,"draft":617},"\u002Fblog\u002Fno-api-key-found-in-request","\"No API key found in request\" in Supabase, und die falsche Lösung","\"No API key found in request\" heißt, deine Supabase-Anfrage kam ohne Schlüssel an. Die meisten Antworten zeigen stattdessen auf deine Datenbankregeln.","2026-10-07","\u002Fblog\u002Fno-api-key-found-in-request\u002Fcard-800x500.png",{"path":856,"title":857,"description":858,"published":859,"category":613,"image":860,"draft":617},"\u002Fblog\u002Fis-base44-safe","Ist Base44 sicher? Was 5.442 echte Base44-Apps zeigten","Ist Base44 sicher? Wir haben 5.442 laufende Base44-Apps mit neun Checks geprüft. Fast alle bekamen ein B, aus Gründen, die der Inhaber nie gewählt hat.","2026-10-06","\u002Fblog\u002Fis-base44-safe\u002Fcard-800x500.png",{"path":862,"title":863,"description":864,"published":865,"category":613,"image":866,"draft":617},"\u002Fblog\u002Fmove-a-secret-to-an-edge-function","API-Schlüssel verstecken: ab in eine Supabase Edge Function","Einen API-Schlüssel verstecken heißt, ihn aus dem Browser zu nehmen. Eine Supabase Edge Function ist der kleinste Ort dafür, und zwei Schritte zählen mehr.","2026-10-05","\u002Fblog\u002Fmove-a-secret-to-an-edge-function\u002Fcard-800x500.png",{"path":868,"title":869,"description":870,"published":871,"category":613,"image":872,"draft":617},"\u002Fblog\u002Fenv-file-exposed-on-your-server","Ist deine .env-Datei öffentlich? Zwölf Pfade zum Prüfen","Ist deine .env-Datei auf deinem eigenen Webserver öffentlich? Zwölf Adressen sagen es dir, und ein Treffer heißt: alles darin ist längst öffentlich.","2026-10-04","\u002Fblog\u002Fenv-file-exposed-on-your-server\u002Fcard-800x500.png",{"path":874,"title":875,"description":876,"published":877,"category":613,"image":878,"draft":617},"\u002Fblog\u002Fis-v0-safe","v0-Sicherheit: alle 1.790 gescannten v0-Apps bekamen ein A","v0-Sicherheit, gemessen an 1.790 laufenden v0-Apps: Jede bekam ein A. Nur 17 nannten eine Datenbank, und genau das misst das A vor allem.","2026-10-03","\u002Fblog\u002Fis-v0-safe\u002Fcard-800x500.png",{"path":880,"title":881,"description":882,"published":883,"category":613,"image":884,"draft":617},"\u002Fblog\u002Fis-bolt-safe","Ist Bolt sicher? Was 1.123 echte Bolt-Apps zeigten","Ist Bolt sicher? Wir haben 1.123 laufende Bolt-Apps mit neun Checks geprüft. Das Hosting war sauber. Die Funde waren Schlüssel und offene Tabellen in den Apps.","2026-10-02","\u002Fblog\u002Fis-bolt-safe\u002Fcard-800x500.png",{"path":886,"title":887,"description":888,"published":889,"category":613,"image":890,"draft":617},"\u002Fblog\u002Fis-supabase-down-or-your-app","Ist Supabase down oder liegt es an deiner App? So erkennst du es","Ist Supabase down oder liegt es an deiner App? Ein pausiertes Projekt, eine volle Datenbank und ein eigener Fehler sehen gleich aus. Vier Prüfungen helfen.","2026-10-01","\u002Fblog\u002Fis-supabase-down-or-your-app\u002Fcard-800x500.png",{"path":892,"title":893,"description":894,"published":895,"category":613,"image":896,"draft":617},"\u002Fblog\u002Fdoes-supabase-encrypt-my-data","Verschlüsselt Supabase meine Daten? Ja. Wovor das schützt","Verschlüsselt Supabase Daten? Ja: AES-256 im Ruhezustand, TLS bei der Übertragung, SOC 2 und ISO 27001. Was jedes abdeckt und welches Leck keines stoppt.","2026-09-30","\u002Fblog\u002Fdoes-supabase-encrypt-my-data\u002Fcard-800x500.png",{"path":898,"title":899,"description":900,"published":901,"category":613,"image":902,"draft":617},"\u002Fblog\u002Fsupabase-free-plan-limits","Supabase Gratis-Tarif: die Limits und was an jedem passiert","Die Limits des Supabase-Gratis-Tarifs: 500 MB Datenbank, 5 GB Egress und keine Backups. Was an jeder Grenze passiert und was $25 für Pro ändern.","2026-09-29","\u002Fblog\u002Fsupabase-free-plan-limits\u002Fcard-800x500.png",{"path":904,"title":905,"description":906,"published":907,"category":720,"image":908,"draft":617},"\u002Fblog\u002Ftest-your-supabase-backup","Teste dein Supabase-Backup, bevor du es brauchst","So testest du dein Supabase-Backup: in ein Übungsprojekt einspielen, Zeilen zählen, anmelden und die Zeile suchen, die einer abgeschnittenen Datei fehlt.","2026-09-28","\u002Fblog\u002Ftest-your-supabase-backup\u002Fcard-800x500.png",{"path":910,"title":911,"description":912,"published":913,"category":720,"image":914,"draft":617},"\u002Fblog\u002Fsupabase-backup-github-action","Kostenloses Supabase-Backup per GitHub Action, mit Haken","Eine Supabase-Backup-GitHub-Action kostet nichts und passt für viele Apps. Der Workflow, der richtige Connection String und das Egress pro Lauf.","2026-09-27","\u002Fblog\u002Fsupabase-backup-github-action\u002Fcard-800x500.png",{"path":916,"title":917,"description":918,"published":919,"category":720,"image":920,"draft":617},"\u002Fblog\u002Fdownload-your-supabase-backup","Warum du dein Supabase-Backup nicht herunterladen kannst","Dein Supabase-Backup kannst du auf aktuellen Projekten nicht herunterladen, weil die Tageskopie physisch ist. Wie du es prüfst und selbst eine Kopie hältst.","2026-09-26","\u002Fblog\u002Fdownload-your-supabase-backup\u002Fcard-800x500.png",{"path":107,"title":922,"description":923,"published":919,"category":613,"image":924,"draft":617},"Supabase \"permission denied for table\": der fehlende Grant","Ab 30. Oktober antwortet eine neue Supabase-Tabelle mit \"permission denied for table\", bis du Zugriff erteilst. Der Grant aus der E-Mail ist die halbe Lösung.","\u002Fblog\u002Fsupabase-permission-denied-for-table\u002Fcard-800x500.png",{"path":926,"title":927,"description":928,"published":929,"category":613,"image":930,"draft":617},"\u002Fblog\u002Fopen-api-endpoint-exposed","Ist ein offener API-Endpunkt ein Sicherheitsproblem? Sieh ins JSON","Dein Scan hat einen offenen API-Endpunkt gemeldet. Ob das zählt, hängt davon ab, was zurückkam, und die meisten hier gehörten der Plattform.","2026-09-25","\u002Fblog\u002Fopen-api-endpoint-exposed\u002Fcard-800x500.png",{"path":932,"title":933,"description":934,"published":935,"category":613,"image":936,"draft":617},"\u002Fblog\u002Flovable-security-scan","Lovable Security Scan: das Eine, was er nicht beweist","Lovable Security Scan: was Quick Scan und Deep Scan prüfen, wann welcher läuft, und das Eine, was kein Scan von innen beweisen kann.","2026-09-24","\u002Fblog\u002Flovable-security-scan\u002Fcard-800x500.png",{"path":938,"title":939,"description":940,"published":941,"category":720,"image":942,"draft":617},"\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","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":944,"title":945,"description":946,"published":947,"category":613,"image":948,"draft":617},"\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":950,"title":951,"description":952,"published":953,"category":613,"image":954,"draft":617},"\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":956,"title":957,"description":958,"published":959,"category":613,"image":960,"draft":617},"\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":962,"title":963,"description":964,"published":965,"category":613,"image":966,"draft":617},"\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":968,"title":969,"description":970,"published":971,"category":613,"image":972,"draft":617},"\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":974,"title":975,"description":976,"published":977,"category":613,"image":978,"draft":617},"\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":980,"title":981,"description":982,"published":983,"category":613,"image":984,"draft":617},"\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":986,"title":987,"description":988,"published":989,"category":613,"image":990,"draft":617},"\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":992,"title":993,"description":994,"published":995,"category":720,"image":996,"draft":617},"\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":998,"title":999,"description":1000,"published":1001,"category":720,"image":1002,"draft":617},"\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":1004,"title":1005,"description":1006,"published":1007,"category":720,"image":1008,"draft":617},"\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":1010,"title":1011,"description":1012,"published":1013,"category":613,"image":1014,"draft":617},"\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":473,"title":1016,"description":1017,"published":1018,"category":613,"image":1019,"draft":617},"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":1021,"title":1022,"description":1023,"published":1024,"category":613,"image":1025,"draft":617},"\u002Fblog\u002Fsupabase-rls-disabled-in-public","Supabase \"RLS disabled in public\": was die Warnung übersieht","Supabase meldet \"RLS disabled in public\" als Fehler. Zur Lese-Policy, die deine Tabelle genauso offen lässt, sagt der Advisor gar nichts.","2026-09-09","\u002Fblog\u002Fsupabase-rls-disabled-in-public\u002Fcard-800x500.png",{"path":1027,"title":1028,"description":1029,"published":1030,"category":613,"image":1031,"draft":617},"\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":1033,"title":1034,"description":1035,"published":1036,"category":613,"image":1037,"draft":617},"\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. Acht Tools im Vergleich, mit Preisen und unseren Lücken.","2026-09-07","\u002Fblog\u002Fvibe-coding-security-scanners-compared\u002Fcard-800x500.png",{"path":1039,"title":1040,"description":1041,"published":1042,"category":613,"image":1043,"draft":617},"\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":1045,"title":1046,"description":1047,"published":1048,"category":613,"image":1049,"draft":617},"\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":1051,"title":1052,"description":1053,"published":1054,"category":613,"image":1055,"draft":617},"\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":1057,"title":1058,"description":1059,"published":1060,"category":613,"image":1061,"draft":617},"\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":1063,"title":1064,"description":1065,"published":1066,"category":613,"image":1067,"draft":617},"\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":1069,"title":1070,"description":1071,"published":1072,"category":720,"image":1073,"draft":617},"\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":1075,"title":1076,"description":1077,"published":1078,"category":613,"image":1079,"draft":617},"\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":1081,"title":1082,"description":1083,"published":1084,"category":720,"image":1085,"draft":617},"\u002Fblog\u002Fback-up-supabase-free-tier","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":1087,"title":1088,"description":1089,"published":1090,"category":613,"image":1091,"draft":617},"\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":1093,"title":1094,"description":1095,"published":1096,"category":613,"image":1097,"draft":617},"\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":1099,"title":1100,"description":1101,"published":1102,"category":613,"image":1103,"draft":617},"\u002Fblog\u002Fnew-row-violates-row-level-security-policy","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":1105,"title":1106,"description":1107,"published":1108,"category":613,"image":1109,"draft":617},"\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":1111,"title":1112,"description":1113,"published":1114,"category":720,"image":1115,"draft":617},"\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":1117,"title":1118,"description":1119,"published":1120,"category":720,"image":1121,"draft":617},"\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":1123,"title":1124,"description":1125,"published":1126,"category":613,"image":1127,"draft":617},"\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":1129,"title":1130,"description":1131,"published":1132,"category":613,"image":1133,"draft":617},"\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":1135,"title":1136,"description":1137,"published":1138,"category":720,"image":1139,"draft":617},"\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":1141,"title":1142,"description":1143,"published":1144,"category":613,"image":1145,"draft":617},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","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":1147,"title":1148,"description":1149,"published":1144,"category":613,"image":1150,"draft":617},"\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":1152,"title":1153,"description":1154,"published":1155,"category":613,"image":1156,"draft":617},"\u002Fblog\u002Fsupabase-new-api-keys","Supabase publishable key: ist er derselbe wie der anon key?","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":1158,"title":1159,"description":1160,"published":1161,"category":720,"image":1162,"draft":617},"\u002Fblog\u002Fdoes-supabase-back-up-my-database","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":1164,"title":1165,"description":1166,"published":1167,"category":613,"image":1168,"draft":617},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","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":1170,"title":1171,"description":1172,"published":1167,"category":720,"image":1173,"draft":617},"\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":1175,"title":1176,"description":1177,"published":1178,"category":720,"image":1179,"draft":617},"\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":1181,"title":1182,"description":1183,"published":1178,"category":613,"image":1184,"draft":617},"\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",1794213638766]