[{"data":1,"prerenderedAt":811},["ShallowReactive",2],{"blog-de-supabase-security-checker":3,"blog-index-de":571},{"id":4,"title":5,"body":6,"category":523,"cover":524,"coverAlt":525,"description":526,"draft":527,"extension":528,"faq":529,"image":545,"keywords":546,"meta":559,"navigation":560,"ogTitle":561,"path":562,"published":563,"seo":564,"stem":565,"tldr":566,"updated":563,"__hash__":570},"blog_de\u002Fblog\u002Fsupabase-security-checker.md","Supabase Security Checker: die fünf Prüfungen selbst machen",{"type":7,"value":8,"toc":511},"minimark",[9,13,21,24,29,32,35,38,47,51,54,66,89,112,115,118,124,128,131,141,148,159,162,226,231,237,260,268,272,275,281,287,290,301,322,330,334,337,344,350,357,363,373,377,380,386,389,396,400,403,409,429,435,445,448,452,483,488,496,503],[10,11,12],"p",{},"Du hast nach einem Supabase Security Checker gesucht und neun davon bekommen.\nEiner will dein Repository. Einer will eine Browser-Erweiterung. Einer will\nLesezugriff auf dein ganzes Supabase-Konto, was nah genug an der Sache ist, vor\nder du dich sorgst, um dich stutzig zu machen.",[10,14,15,16,20],{},"Hier steht, was keine dieser Tool-Seiten laut ausspricht. ",[17,18,19],"strong",{},"Es sind fünf\nPrüfungen, und du kannst jede einzelne selbst ausführen",", ohne Konto, ohne\nInstallation und ohne die Zugangsdaten, deren Weitergabe gefährlich wäre. Zehn\nMinuten im Terminal decken dasselbe ab wie die Tools.",[10,22,23],{},"Die fünf unten sind die, die unser eigener Scanner gegen ein Supabase-Projekt\nlaufen lässt, als Befehle ausgeschrieben. Wenn du mit Lovable, Bolt, v0, Cursor,\nReplit, Windsurf oder Base44 gebaut hast und deine App überhaupt etwas\nspeichert, steht dahinter sehr wahrscheinlich Supabase, und das sind die Fragen,\ndie ein Fremder ihr stellen würde.",[25,26,28],"h2",{"id":27},"was-prüft-ein-supabase-security-checker-eigentlich","Was prüft ein Supabase Security Checker eigentlich?",[10,30,31],{},"Deine veröffentlichte App. Die Einstellungen in deinem Projekt sind Aufgabe\neines anderen Werkzeugs, und Supabase liefert dieses Werkzeug schon mit.",[10,33,34],{},"Der Security Advisor in deinem Dashboard liest den eigenen Katalog deines\nProjekts: welche Tabellen Row Level Security abgeschaltet haben, welche\nFunktionen einen lockeren Search Path führen, welche Extensions im\nPublic-Schema liegen. Er liest, was du konfiguriert hast.",[10,36,37],{},"Ein Checker liest, was deine App einem Fremden aushändigt. Das\nJavaScript-Bundle, das deine Besucher herunterladen, die Antwort einer Tabelle\nauf eine Anfrage ohne Login, den Inhalt eines Storage-Buckets, die Header auf\ndeinen Seiten. Von deiner Konfiguration sieht er nichts und muss es auch nicht,\nweil er auf die Folge davon schaut.",[10,39,40,41,46],{},"Die beiden Hälften gehen häufiger auseinander, als die Namen vermuten lassen.\nEine Tabelle kann den Advisor mit eingeschaltetem Schalter und geschriebener\nPolicy passieren und trotzdem ihre Zeilen an jeden aushändigen, weil die Policy,\ndie geschrieben wurde, alle hereinlässt. Das ist einen eigenen Artikel wert,\nfalls es neu für dich ist:\n",[42,43,45],"a",{"href":44},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","der Schalter ist nicht der Schutz",".",[25,48,50],{"id":49},"prüfung-1-welchen-supabase-schlüssel-liefert-deine-app-aus","Prüfung 1: welchen Supabase-Schlüssel liefert deine App aus?",[10,52,53],{},"Öffne deine App im Browser, drücke F12 und sieh dir eine einzige Anfrage an.",[10,55,56,57,61,62,65],{},"Geh auf den Tab Netzwerk, lade die Seite neu und tippe ",[58,59,60],"code",{},"supabase"," in das\nFilterfeld. Deine App stellt mindestens eine Anfrage an eine Adresse, die auf\n",[58,63,64],{},".supabase.co"," endet. Klick sie an. Zwei Dinge, die du für den Rest dieses\nArtikels brauchst, stehen darin:",[67,68,69,80],"ul",{},[70,71,72,75,76,79],"li",{},[17,73,74],{},"Die Anfrageadresse"," beginnt mit deiner Projekt-URL, etwa\n",[58,77,78],{},"https:\u002F\u002Fabcdefghij.supabase.co",". Prüfung 2 und 3 zielen darauf.",[70,81,82,88],{},[17,83,84,85],{},"Der Request-Header ",[58,86,87],{},"apikey"," trägt den Schlüssel, den deine App jedem\nBesucher aushändigt.",[10,90,91,92,95,96,99,100,103,104,107,108,46],{},"Kopier beides irgendwohin und lies dann den Schlüssel selbst. Einer, der mit\n",[58,93,94],{},"sb_publishable_"," beginnt, gehört in deine App und da ist nichts zu reparieren.\nEiner, der mit ",[58,97,98],{},"sb_secret_"," beginnt, gehört nie dorthin, und ihn zu finden\nbeendet die Liste vorzeitig: rotiere ihn heute, noch vor allem anderen auf\ndieser Seite. Ältere Projekte tragen ein Paar ohne lesbares Präfix, ",[58,101,102],{},"anon"," und\n",[58,105,106],{},"service_role",", und die beiden auseinanderzuhalten heißt,\n",[42,109,111],{"href":110},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","die Rolle im Schlüssel zu lesen",[10,113,114],{},"Der letzte Fall ist selten. Über 30.998 Live-Apps, die wir im August 2026\ngescannt haben, tauchte ein geheimer Supabase-Schlüssel im Browser drei Mal auf.",[10,116,117],{},"Solange der Netzwerk-Tab offen ist: schreib dir die Tabellennamen auf, die du in\ndiesen Anfrageadressen sehen kannst. Die nächste Prüfung braucht sie.",[119,120],"diagram",{"alt":121,"caption":122,"src":123},"Eine Bundle-Fläche in der Mitte, die einen Schlüssel und eine Adresse enthält. Ein Pfeil führt nach links zu einem Browserfenster, markiert mit den Ziffern 4 und 5. Ein zweiter führt nach rechts zu einer Datenbank und einem Storage-Bucket mit der Beschriftung .supabase.co, markiert mit 2 und 3.","Alles Weitere zielt auf eine von zwei Adressen: die deiner App und die deines Projekts. Prüfung 1 ist das, was dir die zweite verschafft.","\u002Fblog\u002Fsupabase-security-checker\u002Ftwo-addresses-1600x680.png",[25,125,127],{"id":126},"prüfung-2-antworten-deine-tabellen-einem-fremden","Prüfung 2: antworten deine Tabellen einem Fremden?",[10,129,130],{},"Frag die Datenbank, wie viele Zeilen sie jemandem ohne Login geben würde, und\nlies die Zahl aus der Antwort.",[132,133,139],"pre",{"className":134,"code":136,"language":137,"meta":138},[135],"language-bash","curl -s -i \\\n  -H \"apikey: DEIN_PUBLISHABLE_KEY\" \\\n  -H \"Prefer: count=exact\" \\\n  -H \"Range: 0-0\" \\\n  \"https:\u002F\u002FDEIN_PROJEKT.supabase.co\u002Frest\u002Fv1\u002Fprofiles?select=count\" \\\n  | grep -i content-range\n","bash","",[58,140,136],{"__ignoreMap":138},[10,142,143,144,147],{},"Setz den Schlüssel und die Projektadresse aus Prüfung 1 ein und schreib deinen\neigenen Tabellennamen dorthin, wo ",[58,145,146],{},"profiles"," steht. curl ist auf macOS, auf\nLinux und auf aktuellem Windows schon installiert, es gibt also vorher nichts zu\nholen.",[10,149,150,151,154,155,158],{},"Diese Anfrage holt keine Zeile. ",[58,152,153],{},"select=count"," fragt nach einer Anzahl,\n",[58,156,157],{},"Range: 0-0"," fragt nach keiner der Zeilen selbst, und die ganze Antwort kommt in\neinem einzigen Header an. Es ist dieselbe Anfrage, die unser Scanner stellt, und\ndeshalb kann er gegen eine fremde Live-App laufen, ohne deren Daten anzufassen.",[10,160,161],{},"Vier Dinge können zurückkommen, und eines davon ist ein Fund:",[163,164,165,178],"table",{},[166,167,168],"thead",{},[169,170,171,175],"tr",{},[172,173,174],"th",{},"Was ausgegeben wird",[172,176,177],{},"Was es bedeutet",[179,180,181,192,202,216],"tbody",{},[169,182,183,189],{},[184,185,186],"td",{},[58,187,188],{},"content-range: *\u002F0",[184,190,191],{},"Ohne Login nichts lesbar. Diese Tabelle tut ihre Arbeit.",[169,193,194,199],{},[184,195,196],{},[58,197,198],{},"content-range: 0-0\u002F128",[184,200,201],{},"128 Zeilen erreichbar für jeden, der den Schlüssel aus deiner Seite hat.",[169,203,204,213],{},[184,205,206,209,210],{},[58,207,208],{},"401"," oder ",[58,211,212],{},"403",[184,214,215],{},"Der Schlüssel wurde abgewiesen, bevor die Tabelle erreicht war. Unbeantwortet, nicht sauber.",[169,217,218,223],{},[184,219,220],{},[58,221,222],{},"404",[184,224,225],{},"Keine Tabelle dieses Namens. Entweder geraten, oder sie heißt anders.",[119,227],{"alt":228,"caption":229,"src":230},"Zwei Antwortflächen nebeneinander. Beide zeigen dieselbe Statuszeile 200. Die linke rahmt einen content-range Header, der auf Schrägstrich null endet, und bekommt einen grünen Haken; die rechte rahmt denselben Header, der auf 128 endet, und bekommt ein rotes Kreuz.","Beide Anfragen waren erfolgreich. Ein Header ist der ganze Unterschied zwischen einer Tabelle, die ihre Arbeit tut, und einer, die jedem Zeilen aushändigt.","\u002Fblog\u002Fsupabase-security-checker\u002Fthe-one-header-1600x700.png",[10,232,233,234,236],{},"Die Abweisung ist die Zeile, bei der Vorsicht gilt. Ein ",[58,235,208],{}," sagt, dass die\nAnfrage stehen blieb, bevor sie die Tabelle je erreicht hat, was dir nichts\ndarüber sagt, ob die Tabelle geschützt ist, und von den vieren lässt sie sich am\nleichtesten zu einem Haken aufrunden.",[10,238,239,240,243,244,246,247,243,250,243,253,243,256,259],{},"Führ den Befehl für jede Tabelle aus, die deine App in Prüfung 1 genannt hat,\ndanach für die gewöhnlichen, die eine App meistens hat: ",[58,241,242],{},"users",", ",[58,245,146],{},",\n",[58,248,249],{},"customers",[58,251,252],{},"orders",[58,254,255],{},"messages",[58,257,258],{},"invoices",". In diesen sechs liegen die Daten\nanderer Leute.",[10,261,262,263,267],{},"Das ist die Prüfung, die am meisten findet. Von den 3.680 Supabase-Apps, bei\ndenen wir sie abschließen konnten, hatten 2.096 mindestens eine Tabelle, die\neiner Anfrage ohne Login antwortete, und bei 394 davon trug die offene Tabelle\neinen Personennamen. Die\n",[42,264,266],{"href":265},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","vollständige Messung und wovon die Zahl ein Anteil ist","\nsteht in einem eigenen Artikel.",[25,269,271],{"id":270},"prüfung-3-listet-ein-storage-bucket-seine-eigenen-dateien-auf","Prüfung 3: listet ein Storage-Bucket seine eigenen Dateien auf?",[10,273,274],{},"Frag einen Bucket nach seinem Inhalt und sieh nach, ob etwas zurückkommt.",[132,276,279],{"className":277,"code":278,"language":137,"meta":138},[135],"curl -s -X POST \\\n  -H \"apikey: DEIN_PUBLISHABLE_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"prefix\":\"\",\"limit\":1}' \\\n  \"https:\u002F\u002FDEIN_PROJEKT.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Flist\u002Favatars\"\n",[58,280,278],{"__ignoreMap":138},[10,282,283,286],{},[17,284,285],{},"Schick den Body mit."," Ein POST an diese Adresse ohne Inhalt kommt für jeden\nBucket in jedem Projekt mit \"Body cannot be empty\" zurück, ganz egal, wie er\nkonfiguriert ist. Wir wissen das, weil unsere eigene Bucket-Prüfung so\nausgeliefert wurde und monatelang munter meldete, dass nichts auflistbar sei.",[10,288,289],{},"Zwei Formen von Antwort:",[67,291,292,298],{},[70,293,294,297],{},[58,295,296],{},"[]"," heißt, der Bucket ist verschlossen, oder es gibt keinen Bucket dieses\nNamens. Von außen kannst du nicht sagen, was von beidem, eine leere Liste ist\nalso kein Beleg für irgendetwas.",[70,299,300],{},"Ein Array mit einer Datei darin heißt, ein Fremder kann dein Projekt nach\neinem Verzeichnis dieses Buckets fragen und bekommt eines.",[10,302,303,304,243,307,243,310,243,313,243,316,243,319,46],{},"Probier die Bucket-Namen, die deine App verwendet hat, danach die gängigen:\n",[58,305,306],{},"avatars",[58,308,309],{},"public",[58,311,312],{},"uploads",[58,314,315],{},"files",[58,317,318],{},"images",[58,320,321],{},"documents",[10,323,324,325,329],{},"Auflistbar und öffentlich sind zwei verschiedene Einstellungen an zwei\nverschiedenen Stellen, und\n",[42,326,328],{"href":327},"\u002Fblog\u002Fsupabase-storage-bucket-public","der Unterschied entscheidet, wie sehr ein öffentlicher Bucket zählt",".\nDie Auflistung ist die, die man schließt, denn sie erspart einem Fremden die\nArbeit, einen Dateinamen zu raten. Von den 27.269 Apps, bei denen wir fragen\nkonnten, antworteten 792 mit einer Liste.",[25,331,333],{"id":332},"prüfung-4-wird-dein-quellcode-neben-deiner-app-veröffentlicht","Prüfung 4: wird dein Quellcode neben deiner App veröffentlicht?",[10,335,336],{},"Lies die letzte Zeile deines JavaScript-Bundles.",[10,338,339,340,343],{},"Zurück im Netzwerk-Tab aus Prüfung 1: such die größte ",[58,341,342],{},".js"," Datei, die deine App\ngeladen hat, und kopier ihre Adresse. Dann:",[132,345,348],{"className":346,"code":347,"language":137,"meta":138},[135],"curl -s \"https:\u002F\u002Fdeine-app.example\u002Fassets\u002Findex-abc123.js\" | tail -c 120\n",[58,349,347],{"__ignoreMap":138},[10,351,352,353,356],{},"Eine letzte Zeile mit ",[58,354,355],{},"\u002F\u002F# sourceMappingURL=index-abc123.js.map"," heißt, dein\nBuild hat eine Source Map geschrieben und Browsern gesagt, wo sie liegt. Ob er\nsie auch veröffentlicht hat, klärt eine weitere Anfrage:",[132,358,361],{"className":359,"code":360,"language":137,"meta":138},[135],"curl -s -o \u002Fdev\u002Fnull -w \"%{http_code}\\n\" \\\n  \"https:\u002F\u002Fdeine-app.example\u002Fassets\u002Findex-abc123.js.map\"\n",[58,362,360],{"__ignoreMap":138},[10,364,365,368,369,46],{},[58,366,367],{},"200"," heißt, jeder kann sie herunterladen. Eine Source Map macht aus dem\nkomprimierten JavaScript wieder deine Originaldateien, mit deiner\nOrdnerstruktur, deinen Kommentaren und deiner Logik. Sie legt deinen Code offen,\nund jeder Schlüssel, den sie zeigt, lag ohnehin schon daneben im Bundle, worum\nes in Prüfung 1 ging. 3.885 der 30.987 prüfbaren Apps veröffentlichen ihre, und\nbei manchen Buildern ist das eine Plattform-Voreinstellung und keine\nEntscheidung, die jemand getroffen hat:\n",[42,370,372],{"href":371},"\u002Fblog\u002Fsource-maps-exposed-in-production","was eine veröffentlichte Map zeigt",[25,374,376],{"id":375},"prüfung-5-was-dein-hoster-mit-jeder-seite-mitschickt","Prüfung 5: was dein Hoster mit jeder Seite mitschickt",[10,378,379],{},"Eine Anfrage an die Adresse deiner App, und lies, was mit ihr zurückkam.",[132,381,384],{"className":382,"code":383,"language":137,"meta":138},[135],"curl -s -i \"https:\u002F\u002Fdeine-app.example\" | grep -i -E \\\n  \"content-security-policy|strict-transport-security|x-frame-options|x-content-type-options|referrer-policy\"\n",[58,385,383],{"__ignoreMap":138},[10,387,388],{},"Fünf Header, und die, die nicht ausgegeben werden, sind die, die dir fehlen. Sie\nsagen einem Browser, er soll die Seite ablehnen, wenn sie in der Seite von\njemand anderem geladen wird, beim nächsten Mal auf einer verschlüsselten\nVerbindung bestehen und aufhören, den Dateityp zu raten.",[10,390,391,392,46],{},"Fast jede App fällt hier durch und fast niemand kann etwas dagegen tun. 30.756\nder 30.981 prüfbaren Apps fehlte mindestens einer, weil die Hosting-Plattform\ndiese Header sendet und Eigentümer auf einer Builder-Subdomain nichts daran\nändern können. Wir zählen es und deckeln es bei mittel:\n",[42,393,395],{"href":394},"\u002Fblog\u002Fmissing-security-headers","was fehlende Header aussagen und was nicht",[25,397,399],{"id":398},"was-du-gefunden-hast-richtig-lesen","Was du gefunden hast, richtig lesen",[10,401,402],{},"Nach Schwere sortiert, und das ist nicht die Reihenfolge, in der du sie\nausgeführt hast.",[10,404,405,408],{},[17,406,407],{},"Ein geheimer Schlüssel im Bundle kommt zuerst."," Er überspringt jede Regel,\ndie du auf jeder Tabelle geschrieben hast, also rotiere ihn, bevor du dir hier\nirgendetwas anderes ansiehst.",[10,410,411,414,415,243,417,243,419,421,422,424,425,428],{},[17,412,413],{},"Eine Tabelle voller Personen, die auf Prüfung 2 antwortet, kommt als\nNächstes."," In ",[58,416,242],{},[58,418,146],{},[58,420,252],{}," und ",[58,423,255],{}," liegen die Daten\nanderer Leute, und sie sind gerade jetzt erreichbar. Eine ",[58,426,427],{},"products"," Tabelle,\ndie genauso antwortet, kann völlig richtig sein, und du bist die einzige Person,\ndie die beiden unterscheiden kann.",[10,430,431,434],{},[17,432,433],{},"Danach ein auflistbarer Bucket, danach Maps und Header",", die meistens die\nVoreinstellungen deiner Plattform sind und nichts, was du gewählt hast.",[10,436,437,438,441,442,444],{},"Eine Sache aus allen fünf. ",[17,439,440],{},"Eine Prüfung ohne Antwort hat nicht bestanden.","\nEin ",[58,443,208],{},", eine Anfrage, die in eine Zeitüberschreitung lief, eine Tabelle,\nderen Namen du falsch geraten hast: jedes davon ist eine offene Frage. Unser\nScanner schreibt \"Konnte nicht geprüft werden\" in diese Zeilen und lässt die\nNote unberührt, und von Hand heißt das, diese Liste selbst zu führen.",[10,446,447],{},"Alles hier beschreibt außerdem die App, die in dem Moment live war, in dem du\ngefragt hast. Row Level Security wird abgeschaltet, damit eine Seite lädt, ein\nBucket wird für einen Upload geöffnet, ein Schlüssel wird eingefügt, damit ein\nFeature heute Abend rausgeht.",[25,449,451],{"id":450},"was-diese-woche-zu-tun-ist","Was diese Woche zu tun ist",[453,454,455],"key-takeaways",{},[67,456,457,471,474,477,480],{},[70,458,459,460,243,462,243,464,243,466,421,468,470],{},"Führ Prüfung 2 gegen jede Tabelle aus, die deine App nennt, danach gegen ",[58,461,242],{},[58,463,146],{},[58,465,249],{},[58,467,252],{},[58,469,255],{},". Dort liegen die Funde.",[70,472,473],{},"Wenn Prüfung 1 einen geheimen Schlüssel zutage gefördert hat, rotiere ihn zuerst. Ihn aus deinem Code zu löschen lässt den alten Wert weiterlaufen für alle, die ihn schon haben.",[70,475,476],{},"Schreib jede Probe auf, die eine Abweisung oder gar keine Antwort bekam. Die sind unbeantwortet, und eine unbeantwortete Frage ist kein sauberes Ergebnis.",[70,478,479],{},"Lass die Tabellen in Ruhe, die öffentlich sein sollen. Eine Produktliste, die einem Fremden antwortet, ist deine App, die richtig arbeitet.",[70,481,482],{},"Führ alle fünf nach einem Deploy erneut aus, und nachdem jemand eine Datenbankregel geändert hat. Keines von beidem meldet sich von selbst.",[119,484],{"alt":485,"caption":486,"src":487},"Ein Reeve-Bericht. Eine große bernsteinfarbene Kachel mit dem Buchstaben C, darunter die Zahl 85 von 100, und rechts neun Zeilen mit je einem Prüfsymbol und einem Balken. Sieben Zeilen tragen einen grünen Haken, die Storage-Zeile ein rotes Kreuz, und die Datenbankzeile ein leeres gestricheltes Feld statt einer Markierung.","Dieselben fünf Prüfungen und vier weitere, zurückgemeldet. Der Punktwert ist 85 und die Note ein C, weil ein hoher Fund den Buchstaben deckelt, was die Rechnung auch sagt. Die gestrichelte Zeile ist die Datenbank, die nie geantwortet hat.","\u002Fblog\u002Fsupabase-security-checker\u002Fgrade-score-and-checks-1600x760.png",[10,489,490,491,495],{},"Unser eigener ",[42,492,494],{"href":493},"\u002Fsecurity-scanner","kostenloser Sicherheitsscanner"," führt diese\nfünf und vier weitere gegen jede Live-URL aus, in etwa zwanzig Sekunden, ohne\nKonto und ohne dass du Zugangsdaten herausgibst. Er liest, schreibt nie, und wo\ner keine Antwort bekommt, schreibt er das in die Zeile.",[10,497,498,499,46],{},"Alle fünf kannst du heute selbst machen. Was dir kein einzelner Durchgang sagen\nkann, ist, ob die Antworten nächsten Monat noch dieselben sind, und dafür haben\nwir Reeve Care gebaut: es führt diese Prüfungen nach Zeitplan erneut aus,\nmailt dir, wenn eine Antwort schlechter wird, und hält geprüfte Backups deiner\nSupabase-Datenbank vor, dazu die Dateien deiner Nutzer, sobald du einen\nStorage-Zugang verbindest.\n",[42,500,502],{"href":501},"\u002F#pricing","Was es beobachtet und was es kostet",[10,504,505,506,510],{},"Wenn ein Terminal nicht der Ort ist, an dem du sein möchtest: die Anleitung in\nklarer Sprache für ",[42,507,509],{"href":508},"\u002Fis-your-supabase-app-safe","Supabase-Apps"," erklärt, wofür\njede dieser Einstellungen da ist und wo du sie im Dashboard findest.",{"title":138,"searchDepth":512,"depth":512,"links":513},3,[514,516,517,518,519,520,521,522],{"id":27,"depth":515,"text":28},2,{"id":49,"depth":515,"text":50},{"id":126,"depth":515,"text":127},{"id":270,"depth":515,"text":271},{"id":332,"depth":515,"text":333},{"id":375,"depth":515,"text":376},{"id":398,"depth":515,"text":399},{"id":450,"depth":515,"text":451},"Sicherheitsgrundlagen","\u002Fblog\u002Fsupabase-security-checker\u002Fcover-1200x630.png","Ein Terminalfenster von vorn, mit fünf kurzen Befehlen unter einem grünen Prompt und einem Cursor, der in der sechsten Zeile wartet.","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.",false,"md",[530,533,536,539,542],{"q":531,"a":532},"Findet der Supabase Security Advisor alles?","In seiner eigenen Hälfte findet er alles. Der Advisor liest die Konfiguration deines Projekts und meldet Tabellen mit abgeschalteter Row Level Security, Funktionen mit lockerem Search Path und ähnliche Einstellungen, die du im Dashboard steuerst. Was er nicht sieht, ist deine veröffentlichte App: welcher Schlüssel im JavaScript deiner Besucher gelandet ist, ob eine geschriebene Policy eine anonyme Anfrage wirklich stoppt, oder welche Header dein Hoster sendet. Lass den Advisor und die fünf Prüfungen aus diesem Artikel laufen, denn sie schauen auf verschiedene Dinge.",{"q":534,"a":535},"Ist es gefahrlos, diese Prüfungen gegen mein eigenes Projekt laufen zu lassen?","Ja. Jeder Befehl hier liest, und keiner schreibt. Die Tabellenprüfung fragt deine Datenbank nach einer Zeilenanzahl und liest die Zahl aus einem Response-Header, es wird also nie eine Zeile geholt. Die Bucket-Prüfung fragt nach einer Auflistung und hört dort auf, ohne eine Datei herunterzuladen. Die letzten beiden sind eine gewöhnliche Seitenanfrage, wie deine Besucher sie den ganzen Tag stellen. Sie gegen ein fremdes Projekt laufen zu lassen ist eine andere Frage, und die Antwort lautet: vorher die Eigentümerin oder den Eigentümer fragen.",{"q":537,"a":538},"Mein anon key steht in meinem Bundle. Ist das ein Problem?","Nein. Der anon key in älteren Projekten und sb_publishable_ in neueren ist dafür gemacht, in dem Code zu stehen, den deine Besucher herunterladen. Er benennt dein Projekt und gewährt für sich genommen nichts; Row Level Security entscheidet, welche Zeilen eine Anfrage zurückbekommt. Der Schlüssel, der dort niemals stehen darf, ist der geheime: service_role in älteren Projekten und sb_secret_ in neueren, weil er jede Regel überspringt, die du geschrieben hast.",{"q":540,"a":541},"Was bedeutet content-range: *\u002F0?","Das ist deine Datenbank, die sagt, dass sie diesem Aufrufer null Zeilen aus dieser Tabelle gibt. Der Stern heißt, dass die Antwort überhaupt keine Zeilen enthält, und die Zahl nach dem Schrägstrich ist die Anzahl, die der Aufrufer sehen darf. *\u002F0 ist also die Antwort, die du von einer Tabelle mit Personendaten willst, und 0-0\u002F128 heißt, dass 128 Zeilen für jeden erreichbar sind, der den Schlüssel aus deiner App hat.",{"q":543,"a":544},"Brauche ich meinen service_role key, um das zu testen?","Nein, und ein Checker, der danach fragt, fragt nach dem Falschen. Jede Prüfung hier nutzt den publishable key, der ohnehin in deiner App steht, denn genau den hätte ein Fremder. Ein Test mit einem geheimen Schlüssel sagt dir, was eine Administratorin erreichen kann, und das stand nie zur Debatte. Gib keinen service_role oder sb_secret_ Schlüssel in irgendeinen Scanner ein, unseren eingeschlossen: nichts, was wir tun, braucht ihn.","\u002Fblog\u002Fsupabase-security-checker\u002Fcard-800x500.png",[547,548,549,550,551,552,553,554,555,556,557,558],"supabase security checker","supabase sicherheit prüfen","supabase rls prüfen","supabase security scanner","supabase sicherheitsaudit","row level security testen supabase","supabase security advisor","supabase tabellen öffentlich","ist meine supabase datenbank öffentlich","supabase anon key sichtbar","supabase storage bucket öffentlich prüfen","supabase datenleck scanner",{},true,"Supabase Security Checker: die fünf Prüfungen","\u002Fblog\u002Fsupabase-security-checker","2026-09-06",{"title":5,"description":526},"blog\u002Fsupabase-security-checker",[567,568,569],"Ein Supabase Security Checker liest deine Live-App so, wie ein Fremder sie liest: das ausgelieferte Bundle, die Antworten deiner Tabellen, deine Storage-Buckets, deine Header.","Der Security Advisor von Supabase liest die andere Hälfte, nämlich die Konfiguration deines Projekts. Keiner von beiden sieht, was der andere sieht.","Fünf Prüfungen decken die Außenansicht ab. Jede davon läuft im Terminal, braucht kein Konto und dauert zusammen etwa zehn Minuten.","qWRETkYVbzyZgHYvPwI82ZfSeLizVkhgYc72j4lbxWk",[572,579,585,591,597,603,609,615,621,627,633,639,645,651,657,663,669,675,676,682,687,693,699,705,711,717,723,729,735,741,747,753,758,764,770,775,779,785,791,796,801,807],{"path":573,"title":574,"description":575,"published":576,"category":577,"image":578,"draft":527},"\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":580,"title":581,"description":582,"published":583,"category":523,"image":584,"draft":527},"\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":586,"title":587,"description":588,"published":589,"category":523,"image":590,"draft":527},"\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":592,"title":593,"description":594,"published":595,"category":523,"image":596,"draft":527},"\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":598,"title":599,"description":600,"published":601,"category":523,"image":602,"draft":527},"\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":604,"title":605,"description":606,"published":607,"category":523,"image":608,"draft":527},"\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":610,"title":611,"description":612,"published":613,"category":523,"image":614,"draft":527},"\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":616,"title":617,"description":618,"published":619,"category":523,"image":620,"draft":527},"\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":622,"title":623,"description":624,"published":625,"category":523,"image":626,"draft":527},"\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":628,"title":629,"description":630,"published":631,"category":577,"image":632,"draft":527},"\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":634,"title":635,"description":636,"published":637,"category":577,"image":638,"draft":527},"\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":640,"title":641,"description":642,"published":643,"category":577,"image":644,"draft":527},"\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":646,"title":647,"description":648,"published":649,"category":523,"image":650,"draft":527},"\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":652,"title":653,"description":654,"published":655,"category":523,"image":656,"draft":527},"\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":658,"title":659,"description":660,"published":661,"category":523,"image":662,"draft":527},"\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":664,"title":665,"description":666,"published":667,"category":523,"image":668,"draft":527},"\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":670,"title":671,"description":672,"published":673,"category":523,"image":674,"draft":527},"\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":562,"title":5,"description":526,"published":563,"category":523,"image":545,"draft":527},{"path":677,"title":678,"description":679,"published":680,"category":523,"image":681,"draft":527},"\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":394,"title":683,"description":684,"published":685,"category":523,"image":686,"draft":527},"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":688,"title":689,"description":690,"published":691,"category":523,"image":692,"draft":527},"\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":694,"title":695,"description":696,"published":697,"category":523,"image":698,"draft":527},"\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":700,"title":701,"description":702,"published":703,"category":577,"image":704,"draft":527},"\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":706,"title":707,"description":708,"published":709,"category":523,"image":710,"draft":527},"\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":712,"title":713,"description":714,"published":715,"category":577,"image":716,"draft":527},"\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":718,"title":719,"description":720,"published":721,"category":523,"image":722,"draft":527},"\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":724,"title":725,"description":726,"published":727,"category":523,"image":728,"draft":527},"\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":730,"title":731,"description":732,"published":733,"category":523,"image":734,"draft":527},"\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":736,"title":737,"description":738,"published":739,"category":523,"image":740,"draft":527},"\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":742,"title":743,"description":744,"published":745,"category":577,"image":746,"draft":527},"\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":748,"title":749,"description":750,"published":751,"category":577,"image":752,"draft":527},"\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":327,"title":754,"description":755,"published":756,"category":523,"image":757,"draft":527},"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":759,"title":760,"description":761,"published":762,"category":523,"image":763,"draft":527},"\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":765,"title":766,"description":767,"published":768,"category":577,"image":769,"draft":527},"\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":265,"title":771,"description":772,"published":773,"category":523,"image":774,"draft":527},"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":371,"title":776,"description":777,"published":773,"category":523,"image":778,"draft":527},"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":780,"title":781,"description":782,"published":783,"category":523,"image":784,"draft":527},"\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":786,"title":787,"description":788,"published":789,"category":577,"image":790,"draft":527},"\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":44,"title":792,"description":793,"published":794,"category":523,"image":795,"draft":527},"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":797,"title":798,"description":799,"published":794,"category":577,"image":800,"draft":527},"\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":802,"title":803,"description":804,"published":805,"category":577,"image":806,"draft":527},"\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":110,"title":808,"description":809,"published":805,"category":523,"image":810,"draft":527},"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]