[{"data":1,"prerenderedAt":963},["ShallowReactive",2],{"blog-de-storage-upload-violates-row-level-security":3,"blog-index-de":606},{"id":4,"title":5,"body":6,"category":562,"cover":563,"coverAlt":564,"description":565,"draft":566,"extension":567,"faq":568,"image":584,"keywords":585,"meta":593,"navigation":594,"ogTitle":595,"path":596,"published":597,"seo":598,"stem":599,"tldr":600,"updated":597,"__hash__":605},"blog_de\u002Fblog\u002Fstorage-upload-violates-row-level-security.md","\"Row-level security policy for table objects\" beim Upload",{"type":7,"value":8,"toc":549},"minimark",[9,13,24,31,39,44,51,57,70,74,77,87,99,105,109,112,118,121,129,133,136,142,154,157,174,181,263,266,271,275,278,281,287,293,296,302,316,323,330,334,337,343,352,359,366,369,375,388,393,399,403,406,409,412,422,426,429,438,458,467,484,487,491,536],[10,11,12],"p",{},"Deine App lädt eine Datei hoch. In der Vorschau deines Builders ging es, oder\nletzte Woche ging es, und jetzt kommt bei jedem Versuch ein Satz über Row Level\nSecurity zurück:",[14,15,20],"pre",{"className":16,"code":18,"language":19},[17],"language-text","new row violates row-level security policy for table \"objects\"\n","text",[21,22,18],"code",{"__ignoreMap":23},"",[10,25,26,27,30],{},"Das meiste an diesem Satz kommt dir bekannt vor, wenn du das schon einmal auf\neiner eigenen Tabelle durchgemacht hast. Anders ist das letzte Wort, denn\n",[21,28,29],{},"objects"," ist keine Tabelle, die du angelegt hast.",[10,32,33,34,38],{},"Das ist der Punkt, den Anleitung für Anleitung falsch darstellt: ",[35,36,37],"strong",{},"Die erste\nLösung, die du finden wirst, ist, den Bucket öffentlich zu machen, und sie tut\nfür Uploads nichts."," Supabases eigene Dokumentation sagt genau das in einer\nZeile. Dieser Schalter lässt den Upload abgelehnt und öffnet die Dateien, die\nohnehin schon drin lagen.",[40,41,43],"h2",{"id":42},"was-new-row-violates-row-level-security-policy-for-table-objects-bedeutet","Was \"new row violates row-level security policy for table objects\" bedeutet",[10,45,46,47,50],{},"Dein Upload ist bei Supabase Storage angekommen, Storage hat die Regeln auf\neiner Tabelle namens ",[21,48,49],{},"storage.objects"," gefragt, ob diese Datei hinein darf,\nkeine gefunden, die ja sagt, und abgelehnt.",[10,52,53,54,56],{},"Die Zeile in der Meldung gibt es wirklich. Storage hält für jede Datei genau\neine Zeile in ",[21,55,49],{},", mit dem Namen der Datei, dem Bucket, in dem sie\nliegt, und wer sie abgelegt hat. Eine Datei zu schreiben heißt, diese Zeile zu\nschreiben, also entscheiden die Regeln auf dieser Tabelle, ob der Upload\nüberhaupt stattfindet. Verloren ist nichts: Es wurde keine Datei gespeichert,\nund der Rest des Buckets liegt genau so da wie vor einer Minute.",[10,58,59,60,63,64,69],{},"Die Formulierung kommt von Postgres, der Datenbank unter Supabase, und deshalb\nliest sie sich wie Maschinerie. Sie trägt den Code ",[21,61,62],{},"42501",", denselben Code wie\n",[65,66,68],"a",{"href":67},"\u002Fblog\u002Fnew-row-violates-row-level-security-policy","ein abgelehntes Speichern in einer deiner eigenen Tabellen",".",[40,71,73],{"id":72},"warum-die-meldung-objects-nennt-und-nicht-deinen-bucket","Warum die Meldung \"objects\" nennt und nicht deinen Bucket",[10,75,76],{},"Weil Storage die Regeln für jeden Bucket deines Projekts auf dieser einen\nTabelle hält.",[10,78,79,80,82,83,86],{},"Ein Bucket ordnet Dateien. Eigene Regeln hat er nicht, und es hängt auch kein\nPolicy-Editor an ihm. ",[21,81,49],{}," ist der Ort, an dem die Regeln liegen,\nfür alle deine Buckets zugleich, und ",[21,84,85],{},"bucket_id"," ist eine Spalte darauf. Eine\nRegel, die \"nur im Bucket avatars\" sagt, wird also als Bedingung auf dieser\nSpalte geschrieben.",[10,88,89,90,93,94,96,97,69],{},"Das ist auch der Grund, warum die Tabellenregel von letzter Woche nicht geholfen\nhat. Eine Regel auf ",[21,91,92],{},"profiles"," ist eine Regel über Zeilen in ",[21,95,92],{},", und\neine Datei ist eine Zeile in ",[21,98,49],{},[100,101],"diagram",{"alt":102,"caption":103,"src":104},"Drei Buckets nebeneinander, von jedem führt ein Pfeil nach unten in eine breite Fläche mit der Beschriftung storage.objects, die drei Policy-Chips und einen Spaltennamen trägt. Links davon, hinter einer gestrichelten Trennlinie, steht eine blassere Karte mit der Beschriftung profiles mit eigenen Zeilen und einem eigenen insert-Chip, ohne Verbindung zu irgendetwas.","Jeder Bucket deines Projekts wird von derselben Tabelle regiert. Die Regeln auf deinen eigenen Tabellen stehen jenseits dieser Trennlinie und treffen nie auf eine Datei.","\u002Fblog\u002Fstorage-upload-violates-row-level-security\u002Fone-table-every-bucket-1600x720.png",[40,106,108],{"id":107},"muss-ich-den-bucket-öffentlich-machen-damit-der-upload-geht","Muss ich den Bucket öffentlich machen, damit der Upload geht?",[10,110,111],{},"Nein. Hinter einem Bucket stecken zwei verschiedene Fragen, und der Schalter\nbeantwortet nur eine davon. Wer eine Datei herausholen darf, entscheidet\nöffentlich. Wer eine Datei hineinlegen darf, ist das Thema deiner Fehlermeldung,\nund Supabases Dokumentation ist eindeutig, dass die Einstellung dort nicht\nhinreicht. Von der Seite über die zwei Arten von Bucket, gelesen am\n11. Oktober 2026:",[113,114,115],"blockquote",{},[10,116,117],{},"Die Zugriffskontrolle gilt weiterhin für andere Arten von Vorgängen,\neinschließlich Hochladen, Löschen, Verschieben und Kopieren.",[10,119,120],{},"Was öffentlich tatsächlich tut, steht auf derselben Seite genauso klar: Wer die\nAdresse einer Datei hat, kann sie ohne Anmeldung öffnen. Mehr ist die\nEinstellung nicht.",[10,122,123,124,128],{},"Umlegen bringt dich also in den einen Zustand, den niemand will. Der Upload wird\nweiter abgelehnt, weil Hochladen nie das war, was die Einstellung steuerte, und\ndie Dateien, die schon im Bucket lagen, lassen sich jetzt von jedem öffnen, der\nihre Adressen hat. ",[65,125,127],{"href":126},"\u002Fblog\u002Fsupabase-storage-bucket-public","Was ein öffentlicher Bucket dich wirklich kostet",",\nist eine andere Frage als dieser Fehler und lohnt sich, bevor du den Schalter\nanfasst.",[40,130,132],{"id":131},"was-ein-bucket-beim-upload-wirklich-prüft","Was ein Bucket beim Upload wirklich prüft",[10,134,135],{},"Eine Regel, und sie heißt insert.",[10,137,138,139,141],{},"Supabases Seite zur Zugriffskontrolle nennt den Standard klar: Storage erlaubt\nohne Policies keine Uploads in Buckets, und du erlaubst Vorgänge gezielt, indem\ndu sie auf ",[21,140,49],{}," schreibst. Dann benennt sie die, die du brauchst:",[113,143,144],{},[10,145,146,147,150,151,153],{},"Die einzige RLS-Policy, die zum Hochladen von Objekten nötig ist, ist\nbeispielsweise, die Berechtigung ",[21,148,149],{},"INSERT"," auf der Tabelle ",[21,152,49],{},"\nzu erteilen.",[10,155,156],{},"Dazu gibt es eine zweite Hälfte, und sie ist der häufigste Grund, warum eine\ninsert-Regel den Fehler nicht abstellt:",[113,158,159],{},[10,160,161,162,165,166,169,170,173],{},"Um das Überschreiben von Dateien über die ",[21,163,164],{},"upsert","-Funktion zu erlauben,\nmusst du zusätzlich die Berechtigungen ",[21,167,168],{},"SELECT"," und ",[21,171,172],{},"UPDATE"," erteilen.",[10,175,176,177,180],{},"Wenn dein Upload ",[21,178,179],{},"upsert: true"," mitschickt, was Storage auffordert, eine Datei\ngleichen Namens zu ersetzen, falls schon eine da ist, dann reicht eine\ninsert-Regel allein nicht. Eine Datei zu ersetzen sind drei Fragen statt einer:\nDarfst du diese Zeile anlegen, darfst du die vorhandene sehen, und darfst du sie\nändern.",[182,183,184,200],"table",{},[185,186,187],"thead",{},[188,189,190,194],"tr",{},[191,192,193],"th",{},"Was deine App von Storage will",[191,195,196,197,199],{},"Was sie auf ",[21,198,49],{}," braucht",[201,202,203,216,235,244,253],"tbody",{},[188,204,205,209],{},[206,207,208],"td",{},"eine neue Datei hochladen",[206,210,211,212,215],{},"eine ",[21,213,214],{},"insert","-Regel",[188,217,218,224],{},[206,219,220,221,223],{},"eine Datei gleichen Namens ersetzen (",[21,222,164],{},")",[206,225,226,228,229,169,232],{},[21,227,214],{},", dazu ",[21,230,231],{},"select",[21,233,234],{},"update",[188,236,237,240],{},[206,238,239],{},"eine Datei in einem privaten Bucket öffnen",[206,241,211,242,215],{},[21,243,231],{},[188,245,246,249],{},[206,247,248],{},"auflisten, was in einem Bucket liegt",[206,250,211,251,215],{},[21,252,231],{},[188,254,255,258],{},[206,256,257],{},"eine Datei löschen",[206,259,211,260,215],{},[21,261,262],{},"delete",[10,264,265],{},"Du musst nicht alle fünf schreiben. Schreib die, die deine App tatsächlich tut,\nbei den meisten Uploads also die erste Zeile und manchmal die zweite.",[100,267],{"alt":268,"caption":269,"src":270},"Ein Lager voller Dateien mit Deckel und zwei Öffnungen in der rechten Wand. Vor der oberen Öffnung liegt ein Riegel, und ein von außen ankommendes Dokument wird von einem Kreuz zurückgewiesen. Bei der unteren Öffnung ist der Riegel hochgezogen, und eine Datei geht hindurch zu einer wartenden Figur neben einem Haken. Ein Schalter darunter ist mit einer einzigen Linie an die untere Öffnung angeschlossen und sonst an nichts.","Ein Lager, zwei Öffnungen. Der Schalter hängt an der unteren. Ein Upload kommt an der oberen an, wo eine Regel, die noch niemand geschrieben hat, über den Einlass entscheidet.","\u002Fblog\u002Fstorage-upload-violates-row-level-security\u002Ftwo-counters-1600x720.png",[40,272,274],{"id":273},"die-regel-die-deine-app-hochladen-lässt-und-nur-deine-app","Die Regel, die deine App hochladen lässt, und nur deine App",[10,276,277],{},"Nenne den Bucket, und sag, für wen die Regel gilt.",[10,279,280],{},"Der Ausgangspunkt der Dokumentation beschränkt einen Upload auf einen Bucket und\nauf angemeldete Besucher:",[14,282,285],{"className":283,"code":284,"language":19},[17],"create policy \"Allow authenticated uploads\"\non storage.objects\nfor insert\nto authenticated\nwith check (bucket_id = 'my_bucket_id');\n",[21,286,284],{"__ignoreMap":23},[10,288,289,292],{},[21,290,291],{},"to authenticated"," ist der Teil, den du nicht überspringen solltest. Er\nbedeutet, dass die Regel für angemeldete Besucher gilt; lass ihn weg, und sie\ngilt für alle, Fremde eingeschlossen.",[10,294,295],{},"Für alles, was einer bestimmten Person gehört, legt die von Supabase\nveröffentlichte Fassung die Dateien jeder Person in einen nach ihr benannten\nOrdner:",[14,297,300],{"className":298,"code":299,"language":19},[17],"create policy \"Allow authenticated uploads\"\non storage.objects\nfor insert\nto authenticated\nwith check (\n  bucket_id = 'my_bucket_id' and\n  (storage.foldername(name))[1] = (select auth.jwt()->>'sub')\n);\n",[21,301,299],{"__ignoreMap":23},[10,303,304,307,308,311,312,315],{},[21,305,306],{},"storage.foldername(name)"," zerlegt den Pfad einer gespeicherten Datei in ihre\nOrdner, ",[21,309,310],{},"[1]"," ist also der erste davon. ",[21,313,314],{},"auth.jwt()->>'sub'"," ist die Id\ndesjenigen, der angemeldet ist und die Anfrage stellt. Zusammen gelesen sagen\ndie zwei Zeilen, dass du eine Datei in den nach dir benannten Ordner legen\ndarfst, in diesem Bucket, und sonst nirgends.",[10,317,318,319,322],{},"Beides sind Supabases Beispiele und nicht unsere, gelesen am 11. Oktober 2026,\nmit ",[21,320,321],{},"my_bucket_id"," genau dort, wo sie es gelassen haben, damit du siehst, welcher\nTeil der Name deines eigenen Buckets ist.",[10,324,325,326,69],{},"Wenn du das Ergebnis lieber von außen sehen willst: Unser kostenloser Scan fragt\ndein Live-Projekt, welche deiner Buckets ihren Inhalt an einen Fremden\nherausgeben. Er dauert etwa 20 Sekunden und braucht kein Konto:\n",[65,327,329],{"href":328},"\u002Fsecurity-scanner","Scanne deine App",[40,331,333],{"id":332},"was-eine-leseregel-ungefragt-mit-herausgibt","Was eine Leseregel ungefragt mit herausgibt",[10,335,336],{},"Einen Bucket aufzulisten und daraus herunterzuladen ist dasselbe Recht, also\nmacht eine Regel, die deine Downloads zum Laufen bringt, auch den Inhalt des\nBuckets auflistbar.",[10,338,339,340,342],{},"Supabases Seite zu den Hilfsfunktionen sagt es direkt: Ein einzelnes SQL-Recht\nwie ",[21,341,168],{}," wird von mehreren Storage-Aktionen benutzt. Die Seite zur\nZugriffskontrolle warnt dann vor dem konkreten Fall, unter einem Beispiel, das\neinen Bucket mit Avataren für alle öffnet:",[113,344,345],{},[10,346,347,348,351],{},"Der Filter ",[21,349,350],{},"allow_any_operation()"," ist hier entscheidend, denn ohne ihn\nkönnten Benutzer den Inhalt des Buckets auflisten.",[10,353,354,355,358],{},"Das ist die Lücke, die wir von außen messen. Wir haben 8.435 lebende Apps\ngescannt, die ein Supabase-Projekt nennen. Bei 4.703 davon hat die\nBucket-Prüfung eine Antwort bekommen, und ",[35,356,357],{},"792 von diesen haben auf unsere\nAuflistungsanfrage mit den Namen dessen geantwortet, was darin lag",", ohne dass\njemand angemeldet war. Das ist etwa jede sechste der Apps, die wir fragen\nkonnten.",[10,360,361,362,365],{},"Ein Name reicht oft schon, denn ein Bucket, der auflistet, erspart einem Fremden\ndas Raten von Dateinamen. ",[21,363,364],{},"invoice-2026-03-hannah.pdf"," sagt, wem die Datei\ngehört, bevor sie jemand öffnet.",[10,367,368],{},"Die Lösung, die Supabase dokumentiert, ist zu sagen, für welche Storage-Aktion\ndie Regel gilt:",[14,370,373],{"className":371,"code":372,"language":19},[17],"create policy \"Allow users to list their own objects\"\non storage.objects\nfor select\nto authenticated\nusing (\n  storage.allow_only_operation('object.list')\n  and owner_id = (select auth.uid()::text)\n);\n",[21,374,372],{"__ignoreMap":23},[10,376,377,380,381,384,385,387],{},[21,378,379],{},"storage.allow_only_operation"," und die Schwesterfunktion\n",[21,382,383],{},"storage.allow_any_operation"," sind die Art, wie eine ",[21,386,231],{},"-Regel sich auf\neine der Aktionen verengt, die sich das Recht teilen. Ohne eine von beiden ist\neine Regel, die du geschrieben hast, damit deine App ein Bild zeigen kann, auch\neine Regel, die alles im Bucket vorliest.",[100,389],{"alt":390,"caption":391,"src":392},"Ein Kasten mit der Beschriftung select, von dem zwei Zweige ausgehen. Der obere Zweig erreicht ein einzelnes Dokument, das an eine Figur neben einem Haken weitergereicht wird. Der untere Zweig läuft durch eine schmale Platte, die als gestrichelter Umriss gezeichnet ist, und erreicht einen Stapel aus sechs beleuchteten Zeilen, markiert mit einem Kreuz.","Eine Regel, zwei verschiedene Storage-Aktionen. Die Platte auf dem unteren Weg ist der Aktionsfilter, und die Striche sind, wie es aussieht, wenn niemand einen geschrieben hat.","\u002Fblog\u002Fstorage-upload-violates-row-level-security\u002Fone-rule-two-actions-1600x700.png",[10,394,395,398],{},[65,396,397],{"href":126},"Ob ein auflistbarer Bucket für deine App ein Problem ist",",\nhängt davon ab, was drin liegt, und das kann dir ein Scanergebnis nicht\nbeantworten.",[40,400,402],{"id":401},"wann-öffentlich-die-richtige-antwort-ist","Wann öffentlich die richtige Antwort ist",[10,404,405],{},"Wenn die Dateien von jedem gesehen werden sollen, der fragt, und das ist eine\nechte Kategorie, zu der Supabase eigene Beispiele nennt.",[10,407,408],{},"Supabases eigene Beispielfälle für einen öffentlichen Bucket sind Profilbilder,\nöffentliche Medien und Inhalte von Blogbeiträgen. Das sind Dateien, die deine\nApp einem nicht angemeldeten Besucher zeigt, und sie aus einem öffentlichen\nBucket auszuliefern ist außerdem schneller, weil die zwei Arten von Bucket\nunterschiedlich zwischengespeichert werden.",[10,410,411],{},"Für die andere Art nennt die Dokumentation zwei Wege, eine Datei aus einem\nprivaten Bucket zu bekommen: ein Download mit dem Token der angemeldeten Person,\noder ein signierter Link, der eine begrenzte Zeit funktioniert. Beide lassen die\nEntscheidung bei deinen Regeln statt bei dem, der die Adresse gefunden hat.",[413,414,416],"callout",{"type":415},"warn",[10,417,418,421],{},[35,419,420],{},"Buckets sind standardmäßig privat."," Ein Bucket, den du angelegt und dann nie\nwieder angeschaut hast, steht schon im strengeren der zwei Zustände, und damit\nist der Fehler, den du liest, der Standard, der sich so verhält wie geplant.\nSchreib die Regel und der Upload geht durch; der Schalter hat in dieser Frage so\noder so nichts zu sagen.",[40,423,425],{"id":424},"wie-der-bucket-nach-heute-richtig-bleibt","Wie der Bucket nach heute richtig bleibt",[10,427,428],{},"Nach korrekten Regeln bewegen sich zwei Dinge: Jemand legt den Schalter um,\nwährend er einem ganz anderen Fehler nachgeht, und eine Datei verschwindet.",[10,430,431],{},[35,432,433,437],{},[65,434,436],{"href":435},"\u002Fpricing","Reeve Monitor"," führt die neun Prüfungen von außen für dich erneut aus:",[439,440,441,445,448,455],"ul",{},[442,443,444],"li",{},"alle neun Prüfungen jede Stunde, auf bis zu drei Apps, die Bucket-Auflistung eingeschlossen",[442,446,447],{},"ob die App erreichbar ist, alle 60 Sekunden",[442,449,450,451,454],{},"eine Nachricht, wenn sich ein Ergebnis ",[35,452,453],{},"ändert",", damit ein Bucket, der heute Nacht aufgegangen ist, nicht wartet, bis du hinschaust",[442,456,457],{},"ein Monatsbericht über das Gesehene",[10,459,460],{},[35,461,462,466],{},[65,463,465],{"href":464},"\u002Fsupabase-backups","Reeve Care"," hält eine Kopie von dem, was drin liegt:",[439,468,469,472,475,478,481],{},[442,470,471],{},"jede Nacht eine verschlüsselte Kopie deiner Supabase-Datenbank, dort abgelegt, wo dein Projekt nicht hinreicht",[442,473,474],{},"jede Kopie geprüft, bevor sie zählt, durch Zählen der Zeilen in jeder Tabelle",[442,476,477],{},"auch deine hochgeladenen Dateien, sobald du einen Storage-Zugang verbindest",[442,479,480],{},"eine Wiederherstellung auf Knopfdruck, wenn du sie brauchst",[442,482,483],{},"alles, was Monitor tut",[10,485,486],{},"Beide stehen auf der Preisseite, die manchmal unter der Listenangabe hier liegt\nund nie darüber.",[40,488,490],{"id":489},"was-heute-zu-tun-ist","Was heute zu tun ist",[492,493,494],"key-takeaways",{},[439,495,496,499,515,525,528],{},[442,497,498],{},"Lies die Meldung als Ablehnung. Die Datei wurde nicht gespeichert, der Bucket ist unverändert, und es ist nichts wiederherzustellen.",[442,500,501,502,504,505,507,508,510,511,514],{},"Leg eine ",[21,503,214],{},"-Regel auf ",[21,506,49],{}," an, die deinen Bucket in ",[21,509,85],{}," nennt und die ",[21,512,513],{},"TO","-Klausel trägt, die du gemeint hast.",[442,516,176,517,519,520,169,522,524],{},[21,518,179],{}," mitschickt, nimm ",[21,521,231],{},[21,523,234],{}," dazu, sonst stellt die insert-Regel allein den Fehler nicht ab.",[442,526,527],{},"Lass den Öffentlich-Schalter dabei in Ruhe. Über Uploads hat er nichts zu sagen, und darüber, wer das schon Gespeicherte öffnen kann, hat er sehr wohl etwas zu sagen.",[442,529,530,531,504,533,535],{},"Lies jede ",[21,532,231],{},[21,534,49],{}," und frag, was sie außer dem Download erlaubt, für den du sie geschrieben hast. Das Auflisten teilt sich dieses Recht.",[10,537,538,539,543,544,548],{},"Fang mit dem Bucket an, aus dem der Fehler kam, und sieh dir dann die anderen\nBuckets im selben Projekt an, denn eine einmal breit geschriebene Regel ist\nmeistens zweimal eingefügt worden. Die\n",[65,540,542],{"href":541},"\u002Fchecklist","10-Minuten-Sicherheitscheckliste"," deckt ab, was in einer frisch\ngestarteten App sonst offen bleibt, und der\n",[65,545,547],{"href":546},"\u002Fis-your-supabase-app-safe","Supabase-Sicherheitsleitfaden"," geht den Rest\ndessen durch, was ein Fremder erreichen kann.",{"title":23,"searchDepth":550,"depth":550,"links":551},3,[552,554,555,556,557,558,559,560,561],{"id":42,"depth":553,"text":43},2,{"id":72,"depth":553,"text":73},{"id":107,"depth":553,"text":108},{"id":131,"depth":553,"text":132},{"id":273,"depth":553,"text":274},{"id":332,"depth":553,"text":333},{"id":401,"depth":553,"text":402},{"id":424,"depth":553,"text":425},{"id":489,"depth":553,"text":490},"Sicherheitsgrundlagen","\u002Fblog\u002Fstorage-upload-violates-row-level-security\u002Fcover-1200x630.png","Eine verriegelte Annahmeklappe mit einem Dokument davor, dahinter ein Regal voller Dateien mit einem Deckel über der Oberkante.","\"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.",false,"md",[569,572,575,578,581],{"q":570,"a":571},"Warum scheitert mein Supabase-Upload an einem Row-Level-Security-Fehler?","Weil Supabase Storage die Regeln auf einer Tabelle namens storage.objects gefragt hat, ob deine Datei hinein darf, und keine Regel gefunden hat, die ja sagt. Storage schreibt für jede Datei, die es hält, genau eine Zeile in diese Tabelle, und Row Level Security gilt für diese Zeile genauso wie für eine Zeile in jeder anderen Tabelle. Es wurde keine Datei gespeichert, und an dem, was schon im Bucket lag, hat sich nichts geändert. Die Meldung trägt den Postgres-Code 42501, denselben Code wie beim abgelehnten Speichern in einer eigenen Tabelle.",{"q":573,"a":574},"Muss ich meinen Bucket öffentlich machen, damit der Upload geht?","Nein, und es hilft auch nicht. Supabase dokumentiert, dass die Zugriffskontrolle für Hochladen, Löschen, Verschieben und Kopieren weiterhin gilt, egal auf welcher Einstellung der Bucket steht. Öffentlich ändert eine einzige Sache: ob jemand mit einer Dateiadresse diese Datei ohne Anmeldung öffnen kann. Der Schalter lässt deinen Upload also abgelehnt und macht die Dateien, die schon drin liegen, für jeden mit ihrer Adresse lesbar.",{"q":576,"a":577},"Welche Policies braucht ein Bucket?","Ein Upload braucht eine insert-Regel auf storage.objects. Wenn dein Code Dateien gleichen Namens ersetzt, also upsert benutzt, braucht er laut Supabase zusätzlich select und update. Eine Datei aus einem privaten Bucket zu öffnen braucht eine select-Regel, und das Auflisten des Bucket-Inhalts ebenso, weil diese beiden Storage-Aktionen auf demselben SQL-Recht laufen. Löschen braucht eine delete-Regel. Du musst nicht alle vier schreiben, nur die, die deine App tatsächlich ausführt.",{"q":579,"a":580},"Ist ein öffentlicher Bucket gefährlich?","Das hängt ganz davon ab, was drin liegt. Öffentlich ist die richtige Einstellung für Profilbilder, Logos und alles andere, was deine App einem nicht angemeldeten Besucher zeigt, und genau das führt Supabase als eigene Beispielfälle auf. Für Rechnungen, Exporte oder irgendetwas, das einer bestimmten Person gehört, ist sie falsch, und dafür willst du einen privaten Bucket mit einem signierten Link. Die Frage war nie, ob öffentlich schlecht ist.",{"q":582,"a":583},"Wie prüfe ich, ob mein Bucket auflistbar ist?","Frag ihn von außen, ohne angemeldetes Konto, genau so wie ein Fremder es täte. Das Auflisten wird von einer select-Regel erlaubt und nicht vom Öffentlich-Schalter, deshalb beantwortet weder der Schalter im Dashboard noch ein Blick auf deine Policy-Liste diese Frage. Unser kostenloser Scan macht das auf deinem Live-Projekt und sagt dir, welche deiner Buckets mit den Namen ihres Inhalts geantwortet haben.","\u002Fblog\u002Fstorage-upload-violates-row-level-security\u002Fcard-800x500.png",[586,587,588,589,590,591,592],"new row violates row-level security policy for table objects","supabase storage upload rls fehler","supabase storage policy upload","supabase bucket upload 403","storage objects rls supabase","supabase upload keine berechtigung","supabase storage policy beispiel",{},true,"\"Row-level security policy for table objects\"","\u002Fblog\u002Fstorage-upload-violates-row-level-security","2026-10-11",{"title":5,"description":565},"blog\u002Fstorage-upload-violates-row-level-security",[601,602,603,604],"\"New row violates row-level security policy for table objects\" heißt, dass dein Upload bei Supabase Storage angekommen ist und keine Regel auf storage.objects ihn hineingelassen hat. Die Datei wurde nicht gespeichert, und der Rest des Buckets ist unberührt.","Storage hält seine Regeln für jeden Bucket deines Projekts auf einer einzigen Tabelle, und darum nennt die Meldung eine Tabelle, die du nie angelegt hast.","Den Bucket öffentlich zu machen behebt es nicht. Supabase prüft Uploads so oder so, und öffentlich entscheidet nur, wer eine Datei öffnen darf, deren Adresse er schon hat.","Ein Upload braucht eine insert-Regel auf storage.objects. Wenn dein Code mit upsert speichert, braucht er zusätzlich select und update.","whuGgN_hFmUEt2hsf8Ov64-C5Pf6r6YKQkLrQXlQDRY",[607,608,614,620,626,632,638,644,650,656,662,668,674,680,687,693,699,704,710,716,722,728,734,740,746,752,758,764,770,776,782,788,794,800,806,812,818,824,830,836,842,848,854,860,866,872,878,883,889,895,901,906,912,918,924,929,935,941,947,952,958],{"path":596,"title":5,"description":565,"published":597,"category":562,"image":584,"draft":566},{"path":609,"title":610,"description":611,"published":612,"category":562,"image":613,"draft":566},"\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":615,"title":616,"description":617,"published":618,"category":562,"image":619,"draft":566},"\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":621,"title":622,"description":623,"published":624,"category":562,"image":625,"draft":566},"\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":627,"title":628,"description":629,"published":630,"category":562,"image":631,"draft":566},"\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":633,"title":634,"description":635,"published":636,"category":562,"image":637,"draft":566},"\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":639,"title":640,"description":641,"published":642,"category":562,"image":643,"draft":566},"\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":645,"title":646,"description":647,"published":648,"category":562,"image":649,"draft":566},"\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":651,"title":652,"description":653,"published":654,"category":562,"image":655,"draft":566},"\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":657,"title":658,"description":659,"published":660,"category":562,"image":661,"draft":566},"\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":663,"title":664,"description":665,"published":666,"category":562,"image":667,"draft":566},"\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":669,"title":670,"description":671,"published":672,"category":562,"image":673,"draft":566},"\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":675,"title":676,"description":677,"published":678,"category":562,"image":679,"draft":566},"\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":681,"title":682,"description":683,"published":684,"category":685,"image":686,"draft":566},"\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","Backups","\u002Fblog\u002Ftest-your-supabase-backup\u002Fcard-800x500.png",{"path":688,"title":689,"description":690,"published":691,"category":685,"image":692,"draft":566},"\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":694,"title":695,"description":696,"published":697,"category":685,"image":698,"draft":566},"\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":700,"title":701,"description":702,"published":697,"category":562,"image":703,"draft":566},"\u002Fblog\u002Fsupabase-permission-denied-for-table","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":705,"title":706,"description":707,"published":708,"category":562,"image":709,"draft":566},"\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":711,"title":712,"description":713,"published":714,"category":562,"image":715,"draft":566},"\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":717,"title":718,"description":719,"published":720,"category":685,"image":721,"draft":566},"\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":723,"title":724,"description":725,"published":726,"category":562,"image":727,"draft":566},"\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":729,"title":730,"description":731,"published":732,"category":562,"image":733,"draft":566},"\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":735,"title":736,"description":737,"published":738,"category":562,"image":739,"draft":566},"\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":741,"title":742,"description":743,"published":744,"category":562,"image":745,"draft":566},"\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":747,"title":748,"description":749,"published":750,"category":562,"image":751,"draft":566},"\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":753,"title":754,"description":755,"published":756,"category":562,"image":757,"draft":566},"\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":759,"title":760,"description":761,"published":762,"category":562,"image":763,"draft":566},"\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":765,"title":766,"description":767,"published":768,"category":562,"image":769,"draft":566},"\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":771,"title":772,"description":773,"published":774,"category":685,"image":775,"draft":566},"\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":777,"title":778,"description":779,"published":780,"category":685,"image":781,"draft":566},"\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":783,"title":784,"description":785,"published":786,"category":685,"image":787,"draft":566},"\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":789,"title":790,"description":791,"published":792,"category":562,"image":793,"draft":566},"\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":795,"title":796,"description":797,"published":798,"category":562,"image":799,"draft":566},"\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":801,"title":802,"description":803,"published":804,"category":562,"image":805,"draft":566},"\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":807,"title":808,"description":809,"published":810,"category":562,"image":811,"draft":566},"\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":813,"title":814,"description":815,"published":816,"category":562,"image":817,"draft":566},"\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":819,"title":820,"description":821,"published":822,"category":562,"image":823,"draft":566},"\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":825,"title":826,"description":827,"published":828,"category":562,"image":829,"draft":566},"\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":831,"title":832,"description":833,"published":834,"category":562,"image":835,"draft":566},"\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":837,"title":838,"description":839,"published":840,"category":562,"image":841,"draft":566},"\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":843,"title":844,"description":845,"published":846,"category":562,"image":847,"draft":566},"\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":849,"title":850,"description":851,"published":852,"category":685,"image":853,"draft":566},"\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":855,"title":856,"description":857,"published":858,"category":562,"image":859,"draft":566},"\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":861,"title":862,"description":863,"published":864,"category":685,"image":865,"draft":566},"\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":867,"title":868,"description":869,"published":870,"category":562,"image":871,"draft":566},"\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":873,"title":874,"description":875,"published":876,"category":562,"image":877,"draft":566},"\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":67,"title":879,"description":880,"published":881,"category":562,"image":882,"draft":566},"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":884,"title":885,"description":886,"published":887,"category":562,"image":888,"draft":566},"\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":890,"title":891,"description":892,"published":893,"category":685,"image":894,"draft":566},"\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":896,"title":897,"description":898,"published":899,"category":685,"image":900,"draft":566},"\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":126,"title":902,"description":903,"published":904,"category":562,"image":905,"draft":566},"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":907,"title":908,"description":909,"published":910,"category":562,"image":911,"draft":566},"\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":913,"title":914,"description":915,"published":916,"category":685,"image":917,"draft":566},"\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":919,"title":920,"description":921,"published":922,"category":562,"image":923,"draft":566},"\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":925,"title":926,"description":927,"published":922,"category":562,"image":928,"draft":566},"\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":930,"title":931,"description":932,"published":933,"category":562,"image":934,"draft":566},"\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":936,"title":937,"description":938,"published":939,"category":685,"image":940,"draft":566},"\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":942,"title":943,"description":944,"published":945,"category":562,"image":946,"draft":566},"\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":948,"title":949,"description":950,"published":945,"category":685,"image":951,"draft":566},"\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":953,"title":954,"description":955,"published":956,"category":685,"image":957,"draft":566},"\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":959,"title":960,"description":961,"published":956,"category":562,"image":962,"draft":566},"\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",1791705957971]