[{"data":1,"prerenderedAt":919},["ShallowReactive",2],{"blog-de-no-api-key-found-in-request":3,"blog-index-de":566},{"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":554,"navigation":555,"ogTitle":556,"path":557,"published":558,"seo":559,"stem":560,"tldr":561,"updated":558,"__hash__":565},"blog_de\u002Fblog\u002Fno-api-key-found-in-request.md","\"No API key found in request\" in Supabase, und die falsche Lösung",{"type":7,"value":8,"toc":510},"minimark",[9,13,24,27,35,40,43,50,53,56,62,66,69,85,102,108,118,122,128,134,144,152,156,159,162,176,193,196,201,205,208,211,279,282,285,292,299,306,311,318,322,325,334,341,347,359,378,382,385,394,402,406,412,421,437,447,464,468,497],[10,11,12],"p",{},"Gestern lief deine App noch. Heute bleibt eine Liste leer, die sich sonst mit\nZeilen füllt, und wenn du die Browser-Konsole öffnest, steht dort eine kurze\nAntwort von Supabase, wo die Daten sein sollten:",[14,15,20],"pre",{"className":16,"code":18,"language":19},[17],"language-text","{\n  \"message\": \"No API key found in request\",\n  \"hint\": \"No `apikey` request header or url param was found.\"\n}\n","text",[21,22,18],"code",{"__ignoreMap":23},"",[10,25,26],{},"Mehr bekommst du nicht. Es steht nicht da, welche Tabelle du gelesen hast, was du\ngeschickt hast oder was du ändern sollst.",[10,28,29,30,34],{},"Hier ist der Punkt, den Anleitung um Anleitung falsch darstellt: ",[31,32,33],"strong",{},"\"No API key\nfound in request\" handelt von einem fehlenden Header, und die meisten Ratschläge,\ndie du findest, handeln von deinen Datenbankregeln."," Im Diskussionsforum von\nSupabase hat diese Meldung einen eigenen Thread, sechzehn Leute schlagen darin\nacht verschiedene Mittel vor, und drei davon sagen, du sollst eine Regel auf\neiner deiner Tabellen ergänzen oder lockern. Alle, die es probiert haben,\nberichten, dass die Meldung aufhörte. Ob eine Regel jemals die Ursache war, ist\neine andere Frage, und der Thread klärt sie nie. Sicher ist danach nur, dass mehr\nLeute die Tabelle lesen können als vorher.",[36,37,39],"h2",{"id":38},"was-no-api-key-found-in-request-bedeutet","Was \"No API key found in request\" bedeutet",[10,41,42],{},"Supabase hat deine Anfrage an der Haustür abgewiesen, bevor deine Datenbank\nüberhaupt gefragt wurde.",[10,44,45,46,49],{},"Jede Anfrage an dein Projekt landet zuerst an einem Gateway, das Supabase vor\nalles andere stellt. Seine Aufgabe ist in diesem Moment eng: den ",[21,47,48],{},"apikey","-Header\nlesen, den Wert gegen die Schlüssel deines Projekts prüfen und die Anfrage\nweiterreichen. Wenn es keinen Schlüssel zu lesen gibt, hört es dort auf und\nantwortet 401, dem Statuscode für \"Ich weiß nicht, wer du bist\". Die\nGateway-Referenz von Supabase sagt selbst, dass ein fehlender oder ungültiger\nSchlüssel so abgewiesen wird.",[10,51,52],{},"Stell dir das Gateway als Pförtner an der Haustür vor, nicht als Schloss an einem\nAktenschrank. Der Pförtner bittet jeden, der ankommt, um einen Ausweis. Die\nRegeln, die entscheiden, wer welchen Schrank öffnen darf, liegen zwei Stockwerke\nhöher, und hier hat sie niemand zu Rate gezogen, weil nichts am Eingang\nvorbeikam.",[10,54,55],{},"Für einen Fehler ist dieser also mild. Nichts wurde gelesen, nichts geschrieben,\nund deine Daten sind genau so, wie sie waren. Eine Anfrage wurde abgewiesen.",[57,58],"diagram",{"alt":59,"caption":60,"src":61},"Eine Route von links nach rechts, von einer App zu einem hohen Tor. Das Tor trägt einen leeren gestrichelten Schlitz und einen bernsteinfarbenen Riegel, der Pfeil endet dort, und eine kurze gestrichelte Linie auf der anderen Seite führt ins Leere. Weiter rechts stehen ein Vorhängeschloss und eine Tabelle in Grau, in einem gestrichelten Rahmen.","Das Gateway liest den Schlüssel. Die Regeln deiner Tabelle liegen eine Station weiter, und eine abgewiesene Anfrage erreicht sie nie.","\u002Fblog\u002Fno-api-key-found-in-request\u002Fwhere-it-stops-1600x620.png",[36,63,65],{"id":64},"warum-kam-meine-anfrage-ohne-schlüssel-an","Warum kam meine Anfrage ohne Schlüssel an?",[10,67,68],{},"Weil der Wert, den deine App schicken sollte, in der Anfrage fehlte, die dein\nBrowser tatsächlich gestellt hat. Vier Ursachen decken fast alle Fälle ab.",[10,70,71,74,75,78,79,84],{},[31,72,73],{},"Der Schlüssel kam nie in der gebauten App an."," Dein Code liest ihn aus einer\nUmgebungsvariablen, der Build, aus dem deine Live-Seite entstanden ist, hatte\ndiese Variable nicht gesetzt, und ",[21,76,77],{},"createClient"," bekam eine leere Zeichenkette.\nAlles kompiliert, die App lädt, und jede Anfrage geht ohne Schlüssel hinaus. In\neinem Vite- oder Next-Projekt muss die Variable außerdem das Präfix tragen, das\nsie als browsersicher markiert, was\n",[80,81,83],"a",{"href":82},"\u002Fblog\u002Fvite-and-next-public-env-vars","eine eigene Falle ist",".",[10,86,87,90,91,94,95,98,99,101],{},[31,88,89],{},"Du rufst den REST-Pfad von Hand auf."," Ein ",[21,92,93],{},"fetch"," gegen\n",[21,96,97],{},"\u002Frest\u002Fv1\u002Fdeine_tabelle"," schickt die Header, die du getippt hast, und sonst\nnichts. Die Client-Bibliothek von Supabase ergänzt ",[21,100,48],{}," für dich; eine von\nHand geschriebene Anfrage hat das, was du ihr mitgegeben hast.",[10,103,104,107],{},[31,105,106],{},"Etwas dazwischen hat ihn verworfen."," Eine Rewrite-Regel, ein Proxy oder ein\neigenes API-Gateway sitzt zwischen deiner App und Supabase und leitet die Anfrage\nohne den Header weiter.",[10,109,110,113,114,117],{},[31,111,112],{},"Du siehst eine Weiterleitung und keine Datenanfrage."," Wenn die Meldung\nerscheint, nachdem sich jemand angemeldet oder auf einen Bestätigungslink geklickt\nhat, und in der Adressleiste noch deine Supabase-URL steht, ist die Einstellung,\ndie du brauchst, die Site URL unter Auth. Die Antwort mit den meisten Reaktionen\nim ganzen Supabase-Thread kommt von jemandem, der seine Seitenadresse dort ohne\n",[21,115,116],{},"https:\u002F\u002F"," davor eingetragen hatte.",[36,119,121],{"id":120},"die-lösung-in-einer-zeile","Die Lösung, in einer Zeile",[10,123,124,125,127],{},"Schick deinen Publishable Key im ",[21,126,48],{},"-Header.",[14,129,132],{"className":130,"code":131,"language":19},[17],"import { createClient } from '@supabase\u002Fsupabase-js'\n\nexport const supabase = createClient(\n  'https:\u002F\u002Fdein-projekt.supabase.co',\n  'sb_publishable_…',\n)\n",[21,133,131],{"__ignoreMap":23},[10,135,136,137,139,140,143],{},"Legst du den Client so an, setzt die Bibliothek den Schlüssel bei jeder Anfrage in\nden richtigen Header, und du tippst den Header nie selbst. Die Referenz von\nSupabase ist eindeutig, welcher Header das ist: Publishable und Secret Keys reisen\nim ",[21,138,48],{},"-Header statt in ",[21,141,142],{},"Authorization: Bearer",", denn sie sind kurze,\nundurchsichtige Zeichenketten, und alles, was einen davon als JWT prüfen will,\nscheitert.",[10,145,146,147,151],{},"Dieser Schlüssel gehört in deine App. Er sagt, zu welchem Projekt eine Anfrage\ngehört, und was ein Besucher mit ihm erreicht, entscheiden die Regeln auf deinen\nTabellen, weshalb er überhaupt öffentlich sein darf.\n",[80,148,150],{"href":149},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","Welche API-Schlüssel im Frontend sicher sind","\ngeht den Rest der Familie durch.",[36,153,155],{"id":154},"die-lösung-die-alles-schlimmer-macht","Die Lösung, die alles schlimmer macht",[10,157,158],{},"Der geheime Schlüssel passt in denselben Header, und bei einem älteren Projekt\nbeendet er die Meldung und arbeitet weiter.",[10,160,161],{},"Das ist ein einziger Fehlklick. Dein Dashboard listet beide Schlüssel auf\nderselben Seite, und das ältere Paar sieht gleich aus: gleiche Form, gleiche\nLänge, einer unter dem anderen. Wie schlimm der Klick ist, hängt davon ab, welches\nPaar dein Projekt ausgibt.",[10,163,164,167,168,171,172,175],{},[31,165,166],{},"Ein neuerer geheimer Schlüssel wird im Browser abgewiesen."," Supabase blockiert\n",[21,169,170],{},"sb_secret_…"," anhand des ",[21,173,174],{},"User-Agent","-Headers und antwortet 401. Ihn ins Frontend\nzu kopieren beendet den Fehler also nicht, was hier das beste verfügbare Ergebnis\nist.",[10,177,178,185,186,188,189,192],{},[31,179,180,181,184],{},"Ein alter ",[21,182,183],{},"service_role","-Schlüssel hat keine solche Sperre."," Er funktioniert.\nDie Liste füllt sich, die App verhält sich genau wie vorige Woche, und der\nSchlüssel liegt jetzt in einer Datei, die jeder Besucher herunterladen kann. Dort\nignoriert er jede Regel, die du geschrieben hast: ",[21,187,183],{}," trägt das\nPostgres-Attribut ",[21,190,191],{},"BYPASSRLS",", eine Policy gilt für ihn also nie. Jede Zeile in\njeder Tabelle, lesbar und schreibbar für den, der die Datei öffnet.",[10,194,195],{},"Die Anmerkung von Supabase zur Browser-Sperre lohnt zweimal gelesen zu werden.\nDie Sperre antwortet 401, und ein Angreifer kann den Schlüssel trotzdem mit\nanderen Werkzeugen benutzen. Geschützt sind die Anfragen deiner eigenen App;\nderselbe Schlüssel in derselben Datei beantwortet eine Anfrage aus einem Skript.",[57,197],{"alt":198,"caption":199,"src":200},"Ein Schlüssel, zweimal gezeichnet. Oben endet seine Route aus einem Browserfenster an einem massiven bernsteinfarbenen Riegel mit der Zahl 401. Unten verlässt derselbe Schlüssel ein Terminal und geht genau dort hindurch, wo dieser Riegel stünde, hier nur als gestrichelter Umriss, bis zu drei rot gefüllten Tabellenzeilen.","Die Browser-Sperre betrifft den Browser. Derselbe Schlüssel in derselben Datei funktioniert aus allem, was keiner ist.","\u002Fblog\u002Fno-api-key-found-in-request\u002Fthe-browser-block-1600x640.png",[36,202,204],{"id":203},"der-andere-irrweg-und-warum-er-so-naheliegt","Der andere Irrweg, und warum er so naheliegt",[10,206,207],{},"Eine Regel auf der Tabelle zu lockern beendet die Meldung ebenfalls, und es ändert,\nwer deine Zeilen lesen kann.",[10,209,210],{},"Hier ist dieser Supabase-Thread vollständig, gruppiert danach, was die jeweilige\nAntwort dich ändern lässt:",[212,213,214,230],"table",{},[215,216,217],"thead",{},[218,219,220,224,227],"tr",{},[221,222,223],"th",{},"Was geändert werden soll",[221,225,226],{},"Wie viele der acht Antworten",[221,228,229],{},"Was das tatsächlich ändert",[231,232,233,245,256,266],"tbody",{},[218,234,235,239,242],{},[236,237,238],"td",{},"Die Site URL unter Auth",[236,240,241],{},"1",[236,243,244],{},"Wo eine Anmelde-Weiterleitung landet",[218,246,247,250,253],{},[236,248,249],{},"Eine Policy oder ein Grant",[236,251,252],{},"3",[236,254,255],{},"Wer deine Zeilen lesen und schreiben darf",[218,257,258,261,263],{},[236,259,260],{},"Die Abfrage oder die Session",[236,262,252],{},[236,264,265],{},"Dein eigener Code",[218,267,268,274,276],{},[236,269,270,271,273],{},"Der ",[21,272,48],{},"-Header",[236,275,241],{},[236,277,278],{},"Wonach das Gateway gefragt hat",[10,280,281],{},"Die letzte Zeile ist die, die den Hinweis in der Meldung beantwortet. Sie ist der\nunterste Kommentar im Thread und hat eine einzige Stimme.",[10,283,284],{},"Keine der anderen sieben ist in böser Absicht geschrieben, und genau das macht es\nschwer. Eine Meldung erscheint wirklich in mehreren Situationen, die antwortende\nPerson hat ihre eigene App wirklich zum Laufen gebracht, und eine Policy, die\nohnehin fehlte, ist wirklich etwas zu reparieren. Schief geht die Reihenfolge:\nEine Regel wird umgeschrieben, um eine Meldung über einen Header zu beenden, und\ndie Regel ist der Teil dieses Paares, den danach niemand prüft. Deine App läuft so\noder so, also sagt dir nichts, welches von beidem du getan hast.",[10,286,287,288,291],{},"Von außen ist das Ergebnis sichtbar. Unser Scanner liest Live-Apps so, wie ein\nFremder es täte, und von den 31.056 Apps, die er bewertet hat, haben ",[31,289,290],{},"drei","\neinen geheimen Supabase-Schlüssel veröffentlicht. Damit ist es der seltenste\nFund, den wir haben, und der schwerste.",[10,293,294,295,298],{},"Der Reflex daneben ist viel häufiger. Hinter 8.435 dieser Apps haben wir ein\nSupabase-Projekt gefunden. Bei 3.680 davon bekam die Frage \"kann ein Fremder diese\nTabelle lesen\" überhaupt eine brauchbare Antwort, und ",[31,296,297],{},"2.096 antworteten mit ja",":\nMindestens eine Tabelle gab Zeilen an eine Anfrage von außen heraus, bei der\nnirgends ein Konto beteiligt war. Bei 394 davon war die offene Tabelle wie eine\nTabelle mit Menschen benannt.",[10,300,301,302,84],{},"Ein Teil davon ist Absicht. Eine veröffentlichte Speisekarte, eine Seite mit\nAnzeigen und ein öffentliches Changelog stehen alle in Tabellen, die ein Fremder\nlesen soll, und unser Scanner kann sie nicht von einer Kundentabelle\nunterscheiden, die versehentlich geöffnet wurde. Er berichtet, was geantwortet\nhat, und überlässt das Urteil dir, weshalb\n",[80,303,305],{"href":304},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","Row Level Security anzuschalten nicht dasselbe ist wie geschützt zu sein",[57,307],{"alt":308,"caption":309,"src":310},"Drei Balken auf einer Skala, nach unten schmaler werdend. Der erste zeigt alle Apps, bei denen ein Supabase-Projekt gefunden wurde. Der zweite die kleinere Zahl, bei der die Tabellenfrage eine Antwort bekam, wobei der Rest als gestrichelter Umriss mit einem Fragezeichen weiterläuft. Der dritte zeigt die Apps, die mit ja geantwortet haben.","Was ein Fremder lesen kann, über die Apps, die geantwortet haben. Das gestrichelte Band sind die Apps, die nichts geantwortet haben, und das ist etwas anderes als eine App, bei der nichts offen ist.","\u002Fblog\u002Fno-api-key-found-in-request\u002Fwhat-answered-1600x620.png",[10,312,313,314,84],{},"Wenn du deine eigene Antwort lieber sehen als erschließen willst: Unser\nkostenloser Scan liest deine Live-Seite und sagt dir, was er von außen erreicht.\nEr dauert rund 20 Sekunden und braucht kein Konto:\n",[80,315,317],{"href":316},"\u002Fsecurity-scanner","App scannen",[36,319,321],{"id":320},"woran-du-erkennst-welchen-schlüssel-du-eingefügt-hast","Woran du erkennst, welchen Schlüssel du eingefügt hast",[10,323,324],{},"Lies den Anfang der Zeichenkette.",[10,326,327,330,331,333],{},[21,328,329],{},"sb_publishable_…"," gehört in deine App. ",[21,332,170],{}," niemals. Es gibt nichts zu\ndecodieren, denn wofür der Schlüssel da ist, steht vorne drauf.",[10,335,336,337,340],{},"Ein langer Wert, der mit ",[21,338,339],{},"eyJ"," beginnt, ist einer aus dem älteren Paar, und genau\ndort werden die beiden schwer zu unterscheiden. Der mittlere Abschnitt eines\nsolchen Schlüssels ist lesbare Information und keine Verschlüsselung, und er trägt\nein Feld, das die Frage entscheidet:",[14,342,345],{"className":343,"code":344,"language":19},[17],"{\n  \"iss\": \"supabase\",\n  \"role\": \"anon\",          ← das ist das entscheidende\n  \"iat\": 1750000000\n}\n",[21,346,344],{"__ignoreMap":23},[10,348,349,352,353,355,356,358],{},[21,350,351],{},"anon"," ist der veröffentlichbare der beiden. ",[21,354,183],{}," ist der, den du heute\nrotieren solltest. Die Dokumentation von Supabase sagt es deutlicher, als wir es\ntäten: Wenn ein Tutorial oder ein KI-Assistent dir sagt, du sollst einen langen\nSchlüssel kopieren, der mit ",[21,357,339],{}," beginnt, wurde es für die alten Schlüssel\ngeschrieben.",[10,360,361,362,364,365,367,368,372,373,377],{},"Beide Paare können gleichzeitig aktiv sein, und das ist das Detail, über das Leute\nstolpern. Einen Publishable oder Secret Key anzulegen lässt deine ",[21,363,351],{},"- und\n",[21,366,183],{},"-Schlüssel genau dort, wo sie waren, und sie funktionieren weiter,\nbis du sie im Dashboard in einem eigenen Schritt deaktivierst.\n",[80,369,371],{"href":370},"\u002Fblog\u002Fsupabase-new-api-keys","Was sich mit den neueren Schlüsseln geändert hat","\nbehandelt diese Umstellung, und\n",[80,374,376],{"href":375},"\u002Fblog\u002Fwhere-to-find-supabase-api-keys","wo jeder Wert in deinem Dashboard liegt","\nist die Seite, die du öffnest, falls du nie dort warst.",[36,379,381],{"id":380},"wenn-der-geheime-schlüssel-schon-in-deiner-app-steckt","Wenn der geheime Schlüssel schon in deiner App steckt",[10,383,384],{},"Rotiere ihn, bevor du irgendetwas änderst, und arbeite in der Reihenfolge, die\nSupabase vorgibt.",[10,386,387,388,390,391,393],{},"Lege im Dashboard einen neuen geheimen Schlüssel an. Ersetze den alten überall,\nwo dein Projekt ihn benutzt. Prüfe, dass jeder Teil deiner App auf dem neuen\nSchlüssel läuft. Erst dann nimm den alten außer Betrieb, und der letzte Schritt\nunterscheidet sich danach, welches Paar du hältst: Einen Secret Key zu löschen\nlässt sich nicht rückgängig machen, während das Deaktivieren eines alten ",[21,389,351],{},"-\nund ",[21,392,183],{},"-Paares reversibel ist, du kannst sie also wieder anschalten,\nwenn du einen Client übersehen hast.",[10,395,396,397,401],{},"Ob du zuerst rotierst oder zuerst das Leck reparierst, hängt davon ab, ob eine\nKopie schon öffentlich ist.\n",[80,398,400],{"href":399},"\u002Fblog\u002Frotate-supabase-service-role-key","Einen Supabase-service_role-Schlüssel rotieren","\ngeht beide Reihenfolgen durch und sagt, was danach in deinen Logs steht.",[36,403,405],{"id":404},"so-bleibt-es-wenn-die-fehlermeldung-weg-ist","So bleibt es, wenn die Fehlermeldung weg ist",[10,407,408,411],{},[31,409,410],{},"Die Korrektur hält bis zum nächsten Prompt oder zur nächsten Änderung an\ndeinem Supabase-Setup."," Ein einziger Prompt kann einen Schlüssel wieder\nhineinsetzen oder eine Regel wieder lockern, und deine App läuft in beiden\nFällen weiter, also fällt die Änderung erst auf, wenn jemand nachsieht.",[10,413,414],{},[31,415,416,420],{},[80,417,419],{"href":418},"\u002Fpricing","Reeve Monitor"," sieht für dich nach:",[422,423,424,428,431,434],"ul",{},[425,426,427],"li",{},"alle neun Prüfungen stündlich, für bis zu drei Apps",[425,429,430],{},"eine E-Mail an dem Tag, an dem ein erneuter Scan deine App schlechter bewertet als der vorige",[425,432,433],{},"ob die App läuft, alle 60 Sekunden",[425,435,436],{},"ein Monatsbericht über das, was er gesehen hat",[10,438,439],{},[31,440,441,442,446],{},"Ein Schlüssel, der jede Zeile schreiben kann, kann auch jede Tabelle leeren.\n",[80,443,445],{"href":444},"\u002Fsupabase-backups","Reeve Care"," bewahrt eine Kopie deiner Supabase-Datenbank\ndort auf, wo kein Schlüssel aus deiner App hinkommt.",[422,448,449,452,455,458,461],{},[425,450,451],{},"jeden Tag eine verschlüsselte Kopie, aufbewahrt außerhalb deines Supabase-Kontos",[425,453,454],{},"jede Kopie geprüft, bevor sie zählt: Wir zählen die Zeilen jeder Tabelle nach",[425,456,457],{},"eine Wiederherstellung per Klick, die den aktuellen Stand sichert, bevor sie etwas ersetzt",[425,459,460],{},"auch deine hochgeladenen Dateien, sobald du einen Storage-Zugang verbindest",[425,462,463],{},"alles, was Monitor macht",[36,465,467],{"id":466},"was-du-heute-tun-kannst","Was du heute tun kannst",[469,470,471],"key-takeaways",{},[422,472,473,476,482,491,494],{},[425,474,475],{},"Lies die Meldung als Abweisung an der Tür. Deine Zeilen wurden nicht angefasst und es muss nichts wiederhergestellt werden.",[425,477,478,479,481],{},"Schau im Netzwerk-Tab des Browsers die fehlgeschlagene Anfrage an und prüfe, ob überhaupt ein ",[21,480,48],{},"-Header dabei ist. Dieser eine Blick sagt dir, ob es ein Schlüsselproblem oder ein Weiterleitungsproblem ist.",[425,483,484,485,487,488,490],{},"Lege deinen Supabase-Client mit dem Publishable Key an und lass die Bibliothek den Header schicken. ",[21,486,329],{}," bei einem neueren Projekt, der ",[21,489,351],{},"-Schlüssel bei einem älteren.",[425,492,493],{},"Steckt schon ein geheimer Schlüssel in deiner App, rotiere ihn zuerst. Ihn aus dem Code zu löschen schließt die Tür nicht, denn die alte Fassung steht weiter in deiner Versionsgeschichte und in jeder zwischengespeicherten Kopie deiner Seite.",[425,495,496],{},"Setz jede Regel zurück, die du auf der Jagd danach gelockert hast, und prüfe sie dann von außen statt aus der Vorschau deines Builders.",[10,498,499,500,504,505,509],{},"Fang mit der einen Tabelle an, aus der der Fehler kam, und lies danach die\nPolicies jeder Tabelle, die du in derselben Woche angefasst hast. Die\n",[80,501,503],{"href":502},"\u002Fchecklist","10-Minuten-Sicherheitscheckliste"," deckt ab, was in einer frisch\ngestarteten App sonst noch offen bleibt, und der\n",[80,506,508],{"href":507},"\u002Fis-your-supabase-app-safe","Supabase-Sicherheitsleitfaden"," geht den Rest durch,\nwas ein Fremder erreichen kann.",{"title":23,"searchDepth":511,"depth":511,"links":512},3,[513,515,516,517,518,519,520,521,522],{"id":38,"depth":514,"text":39},2,{"id":64,"depth":514,"text":65},{"id":120,"depth":514,"text":121},{"id":154,"depth":514,"text":155},{"id":203,"depth":514,"text":204},{"id":320,"depth":514,"text":321},{"id":380,"depth":514,"text":381},{"id":404,"depth":514,"text":405},{"id":466,"depth":514,"text":467},"Sicherheitsgrundlagen","\u002Fblog\u002Fno-api-key-found-in-request\u002Fcover-1200x630.png","Eine Anfrage trifft auf ein hohes Tor mit leerem Ausweisschlitz und einem Riegel davor, und die Datenbank dahinter, zu der sie wollte, bleibt unberührt.","\"No API key found in request\" heißt, deine Supabase-Anfrage kam ohne Schlüssel an. Die meisten Antworten zeigen stattdessen auf deine Datenbankregeln.",false,"md",[530,533,536,539,542],{"q":531,"a":532},"Was bedeutet \"No API key found in request\"?","Es bedeutet, dass deine Anfrage Supabase ohne apikey-Header erreicht hat, sodass das Gateway vor deinem Projekt sie abgewiesen hat, bevor deine Datenbank beteiligt war. Nichts wurde gelesen, nichts geschrieben, und an deinen Daten hat sich nichts geändert. Die Antwort trägt einen Hinweis, der dasselbe mit anderen Worten sagt: no apikey request header or url param was found.",{"q":534,"a":535},"Welcher Supabase-Schlüssel gehört in den apikey-Header?","Dein Publishable Key, bei einem neueren Projekt also sb_publishable_ und bei einem älteren der anon-Schlüssel. Supabase stellt ihn genau dafür bereit und rechnet damit, dass er in deiner App sichtbar ist. Die Client-Bibliothek setzt ihn bei jeder Anfrage in den Header, also tippst du den Header nie selbst, wenn du den Client mit dem Publishable Key anlegst.",{"q":537,"a":538},"Ist es sicher, meinen anon-Schlüssel im Browser zu haben?","Ja, und er muss dort sein, damit deine App überhaupt mit deinem Projekt sprechen kann. Der anon-Schlüssel sagt nur, zu welchem Projekt eine Anfrage gehört; was ein Besucher mit ihm tatsächlich erreicht, entscheiden die Row-Level-Security-Regeln auf deinen Tabellen. Welche API-Schlüssel im Frontend sicher sind geht die ganze Familie der Schlüssel durch und zeigt, wie man sie liest.",{"q":540,"a":541},"Ich habe den service_role-Schlüssel benutzt und es hat funktioniert. Ist das ein Problem?","Ja, und es ist das, was sich heute zu erledigen lohnt. Ein service_role-Schlüssel trägt das Postgres-Attribut BYPASSRLS, deine Policies gelten für ihn also nie. In deiner App ausgeliefert liegt er in einer Datei, die jeder Besucher herunterladen kann, und wer sie herunterlädt, kann jede Zeile in jeder Tabelle lesen und schreiben. Rotiere den Schlüssel zuerst und verschiebe danach das, wofür er gebraucht wurde, auf einen Server.",{"q":543,"a":544},"Woran erkenne ich, welchen Schlüssel ich eingefügt habe?","Lies den Anfang der Zeichenkette. sb_publishable_ gehört in deine App und sb_secret_ niemals. Ein langer Wert, der mit eyJ beginnt, ist einer aus dem älteren Paar, und die beiden sehen gleich aus, also musst du hineinschauen: Der mittlere Abschnitt decodiert zu lesbaren Daten mit einem role-Feld, und darin steht entweder anon oder service_role.","\u002Fblog\u002Fno-api-key-found-in-request\u002Fcard-800x500.png",[547,548,549,550,551,552,553],"no api key found in request","no api key found in request supabase","supabase kein api key gefunden","supabase apikey header fehlt","401 supabase api key ungültig","supabase api key funktioniert nicht","supabase 401 unauthorized",{},true,"\"No API key found in request\" in Supabase","\u002Fblog\u002Fno-api-key-found-in-request","2026-10-07",{"title":5,"description":526},"blog\u002Fno-api-key-found-in-request",[562,563,564],"\"No API key found in request\" heißt, deine Anfrage hat Supabase ohne apikey-Header erreicht und wurde am Gateway abgewiesen, bevor deine Datenbank überhaupt gefragt wurde.","Die richtige Lösung ist dein Publishable Key in genau diesem Header, also der Schlüssel, der öffentlich sein soll. Die Client-Bibliothek von Supabase schickt ihn bei jeder Anfrage für dich mit.","Die zwei Lösungen, zu denen Leute stattdessen greifen, sind der geheime Schlüssel und eine lockerere Regel auf der Tabelle. Beide beenden die Meldung, und beide machen deine Zeilen für jeden lesbar, der den Schlüssel aus deiner App hat.","v_MEBtHK2H0rvkNWe1MGPcM9kAIRxFI0cl42oMCtQrg",[567,573,579,585,591,592,598,604,610,616,622,628,634,640,647,653,659,664,670,676,682,688,694,700,706,711,717,723,729,735,741,747,753,759,765,770,776,782,788,794,800,806,812,818,824,830,835,841,847,853,859,865,871,877,883,888,893,899,904,909,915],{"path":568,"title":569,"description":570,"published":571,"category":523,"image":572,"draft":527},"\u002Fblog\u002Fstorage-upload-violates-row-level-security","\"Row-level security policy for table objects\" beim Upload","\"New row violates row-level security policy for table objects\" heißt: Deinem Upload fehlt eine insert-Regel. Ein öffentlicher Bucket fügt keine hinzu.","2026-10-11","\u002Fblog\u002Fstorage-upload-violates-row-level-security\u002Fcard-800x500.png",{"path":574,"title":575,"description":576,"published":577,"category":523,"image":578,"draft":527},"\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":580,"title":581,"description":582,"published":583,"category":523,"image":584,"draft":527},"\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":586,"title":587,"description":588,"published":589,"category":523,"image":590,"draft":527},"\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":557,"title":5,"description":526,"published":558,"category":523,"image":545,"draft":527},{"path":593,"title":594,"description":595,"published":596,"category":523,"image":597,"draft":527},"\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":599,"title":600,"description":601,"published":602,"category":523,"image":603,"draft":527},"\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":605,"title":606,"description":607,"published":608,"category":523,"image":609,"draft":527},"\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":611,"title":612,"description":613,"published":614,"category":523,"image":615,"draft":527},"\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":617,"title":618,"description":619,"published":620,"category":523,"image":621,"draft":527},"\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":623,"title":624,"description":625,"published":626,"category":523,"image":627,"draft":527},"\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":629,"title":630,"description":631,"published":632,"category":523,"image":633,"draft":527},"\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":635,"title":636,"description":637,"published":638,"category":523,"image":639,"draft":527},"\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":641,"title":642,"description":643,"published":644,"category":645,"image":646,"draft":527},"\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":648,"title":649,"description":650,"published":651,"category":645,"image":652,"draft":527},"\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":654,"title":655,"description":656,"published":657,"category":645,"image":658,"draft":527},"\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":660,"title":661,"description":662,"published":657,"category":523,"image":663,"draft":527},"\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":665,"title":666,"description":667,"published":668,"category":523,"image":669,"draft":527},"\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":671,"title":672,"description":673,"published":674,"category":523,"image":675,"draft":527},"\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":677,"title":678,"description":679,"published":680,"category":645,"image":681,"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","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":683,"title":684,"description":685,"published":686,"category":523,"image":687,"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":689,"title":690,"description":691,"published":692,"category":523,"image":693,"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":695,"title":696,"description":697,"published":698,"category":523,"image":699,"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":701,"title":702,"description":703,"published":704,"category":523,"image":705,"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":82,"title":707,"description":708,"published":709,"category":523,"image":710,"draft":527},"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":712,"title":713,"description":714,"published":715,"category":523,"image":716,"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":718,"title":719,"description":720,"published":721,"category":523,"image":722,"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":724,"title":725,"description":726,"published":727,"category":523,"image":728,"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":730,"title":731,"description":732,"published":733,"category":645,"image":734,"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":736,"title":737,"description":738,"published":739,"category":645,"image":740,"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":742,"title":743,"description":744,"published":745,"category":645,"image":746,"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":748,"title":749,"description":750,"published":751,"category":523,"image":752,"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":754,"title":755,"description":756,"published":757,"category":523,"image":758,"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":760,"title":761,"description":762,"published":763,"category":523,"image":764,"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":399,"title":766,"description":767,"published":768,"category":523,"image":769,"draft":527},"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":771,"title":772,"description":773,"published":774,"category":523,"image":775,"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":777,"title":778,"description":779,"published":780,"category":523,"image":781,"draft":527},"\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":783,"title":784,"description":785,"published":786,"category":523,"image":787,"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":789,"title":790,"description":791,"published":792,"category":523,"image":793,"draft":527},"\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":795,"title":796,"description":797,"published":798,"category":523,"image":799,"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":801,"title":802,"description":803,"published":804,"category":523,"image":805,"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":807,"title":808,"description":809,"published":810,"category":645,"image":811,"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":813,"title":814,"description":815,"published":816,"category":523,"image":817,"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":819,"title":820,"description":821,"published":822,"category":645,"image":823,"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":825,"title":826,"description":827,"published":828,"category":523,"image":829,"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":375,"title":831,"description":832,"published":833,"category":523,"image":834,"draft":527},"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":836,"title":837,"description":838,"published":839,"category":523,"image":840,"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":842,"title":843,"description":844,"published":845,"category":523,"image":846,"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":848,"title":849,"description":850,"published":851,"category":645,"image":852,"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":854,"title":855,"description":856,"published":857,"category":645,"image":858,"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":860,"title":861,"description":862,"published":863,"category":523,"image":864,"draft":527},"\u002Fblog\u002Fsupabase-storage-bucket-public","Dein Supabase-Storage-Bucket ist öffentlich. Ist das ein Problem?","Ein öffentlicher Supabase-Storage-Bucket heißt: Wer die URL einer Datei hat, kann sie öffnen. Er heißt nicht, dass jemand den Inhalt auflisten darf.","2026-08-23","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcard-800x500.png",{"path":866,"title":867,"description":868,"published":869,"category":523,"image":870,"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":872,"title":873,"description":874,"published":875,"category":645,"image":876,"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":878,"title":879,"description":880,"published":881,"category":523,"image":882,"draft":527},"\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":884,"title":885,"description":886,"published":881,"category":523,"image":887,"draft":527},"\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":370,"title":889,"description":890,"published":891,"category":523,"image":892,"draft":527},"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":894,"title":895,"description":896,"published":897,"category":645,"image":898,"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":304,"title":900,"description":901,"published":902,"category":523,"image":903,"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":905,"title":906,"description":907,"published":902,"category":645,"image":908,"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":910,"title":911,"description":912,"published":913,"category":645,"image":914,"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":149,"title":916,"description":917,"published":913,"category":523,"image":918,"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",1791705957971]