[{"data":1,"prerenderedAt":1131},["ShallowReactive",2],{"blog-de-supabase-invalid-jwt":3,"blog-index-de":605},{"id":4,"title":5,"body":6,"category":563,"cover":564,"coverAlt":565,"description":566,"draft":567,"extension":568,"faq":569,"image":585,"keywords":586,"meta":594,"navigation":595,"ogTitle":5,"path":596,"published":597,"seo":598,"stem":599,"tldr":600,"updated":597,"__hash__":604},"blog_de\u002Fblog\u002Fsupabase-invalid-jwt.md","Supabase invalid JWT: Welcher Schlüssel streikt hier?",{"type":7,"value":8,"toc":550},"minimark",[9,13,24,27,39,44,47,50,53,56,62,66,73,87,167,172,179,200,207,211,221,233,236,264,269,272,284,295,299,302,314,330,334,337,369,373,376,398,401,408,412,415,431,434,442,445,449,455,464,478,488,505,509,538],[10,11,12],"p",{},"Gestern lief Ihre App. Heute Morgen kommt auf jede Anfrage eine 401 zurück, an\nIhrem Code hat sich nichts geändert, und in der Antwort steht etwas von einem\nJWT, das Sie nie irgendwo eingetippt haben.",[14,15,20],"pre",{"className":16,"code":18,"language":19},[17],"language-text","{\n  \"code\": \"PGRST301\",\n  \"message\": \"JWT cryptographic operation failed\"\n}\n","text",[21,22,18],"code",{"__ignoreMap":23},"",[10,25,26],{},"Ein Supabase invalid JWT ist der Fehler, der auftaucht, nachdem Sie alles richtig\ngemacht haben. Sie haben einen Schlüssel gewechselt, weil eine Anleitung das\ngeraten hat, oder Ihr Projekt auf die neueren Schlüssel umgestellt, und dann war\nRuhe.",[10,28,29,30,34,35,38],{},"Und hier liegen fast alle Anleitungen daneben: ",[31,32,33],"strong",{},"der Schlüssel in dieser Meldung\nist oft nicht der, den Sie gerade gewechselt haben."," Suchen Sie den Fehler, und\nman schickt Sie zu Ihrem ",[21,36,37],{},"anon","-Schlüssel. In einem Projekt, das auf Publishable\nund Secret Keys umgestellt hat, ist der API-Schlüssel überhaupt kein signiertes\nToken, also ist das Geprüfte etwas anderes in Ihrer Anfrage gewesen.",[40,41,43],"h2",{"id":42},"was-bedeutet-ein-supabase-invalid-jwt","Was bedeutet ein Supabase invalid JWT?",[10,45,46],{},"Irgendetwas in Ihrer Anfrage war ein signiertes Token, und die Signatur hat nicht\ngepasst.",[10,48,49],{},"Ein Passwort ist ein Wort, das jemand auf einer Liste nachschlägt. Ein JWT ist\ndas nicht. Es ist ein Brief, der mit einem Wachssiegel verschlossen wurde: der\nMensch an der Tür sucht Sie nirgends heraus, er hält einen Siegelstempel in der\nHand und prüft, ob das Siegel auf Ihrem Brief damit gemacht wurde. Wenn ja,\ngehen Sie durch, und niemand liest eine Liste.",[10,51,52],{},"Ein Brief mit dem falschen Siegel wird abgewiesen, obwohl jedes Wort darin\nstimmt. Und sobald die Tür ihren Siegelstempel wechselt, lässt sich kein einziger\nBrief mehr öffnen, der schon unterwegs ist, ohne dass jemand die Briefe angefasst\nhätte.",[10,54,55],{},"Ihre Anfrage ist der Brief. Ihr Supabase-Projekt hält den Siegelstempel. Eine 401\nheißt hier, dass die beiden nicht zusammenpassten.",[57,58],"diagram",{"alt":59,"caption":60,"src":61},"Zwei Spuren, auf denen je ein gesiegelter Brief zum selben Siegelstempel läuft, der eine dreistrahlige Gravur trägt. Oben trägt das Siegel des Briefes dieselbe Gravur, der Brief geht durch, die Tabelle dahinter zeigt drei helle Zeilen und die Antwort ist 200. Unten trägt das Siegel einen Punkt im Kasten, ein gelber Balken hält den Brief auf, die Tabelle dahinter ist ein leerer gestrichelter Umriss und die Antwort ist 401.","Es wird nichts nachgeschlagen. Das Siegel auf dem Token wird mit dem Siegelstempel verglichen, den Ihr Projekt hält, und ein Brief, dessen Siegel von etwas anderem stammt, wird abgewiesen, egal was darin steht.","\u002Fblog\u002Fsupabase-invalid-jwt\u002Fhow-the-check-works-1600x660.png",[40,63,65],{"id":64},"in-postgrest-13-hat-sich-die-meldung-geändert-der-code-nicht","In PostgREST 13 hat sich die Meldung geändert, der Code nicht",[10,67,68,69,72],{},"Prüfen Sie auf ",[21,70,71],{},"PGRST301",". Welcher Satz danebensteht, hängt davon ab, welche\nPostgREST-Version Ihr Projekt fährt, und die neueren geben Ihnen eine kurze Liste\ndavon.",[10,74,75,76,78,79,82,83,86],{},"Die Fehlerreferenz von PostgREST beschreibt ",[21,77,71],{}," sowohl in Version 13 als\nauch in Version 14 als ein mitgeschicktes JWT, das nicht dekodiert werden konnte\noder ungültig ist, bei HTTP 401. Dieser Satz ist die Beschreibung in der\nDokumentationstabelle. Er ist nicht das, was in Ihrem ",[21,80,81],{},"message","-Feld landet. In\n",[21,84,85],{},"Error.hs"," auf dem main-Branch von PostgREST steht, dass dieses Feld einen dieser\nSätze trägt:",[88,89,90,103],"table",{},[91,92,93],"thead",{},[94,95,96,100],"tr",{},[97,98,99],"th",{},"Was in der Meldung steht",[97,101,102],{},"Was Ihnen das sagt",[104,105,106,117,127,137,147,157],"tbody",{},[94,107,108,114],{},[109,110,111],"td",{},[21,112,113],{},"Empty JWT is sent in Authorization header",[109,115,116],{},"Der Header wurde mitgeschickt und war leer.",[94,118,119,124],{},[109,120,121],{},[21,122,123],{},"Expected 3 parts in JWT; got 1",[109,125,126],{},"Was da ankam, ist kein JWT. Ein JWT besteht aus drei durch Punkte getrennten Blöcken.",[94,128,129,134],{},[109,130,131],{},[21,132,133],{},"No suitable key or wrong key type",[109,135,136],{},"Der Server hat keinen Schlüssel, mit dem sich ein Token dieser Art prüfen ließe.",[94,138,139,144],{},[109,140,141],{},[21,142,143],{},"Wrong or unsupported encoding algorithm",[109,145,146],{},"Das Token nennt ein Signaturverfahren, das der Server nicht verwendet.",[94,148,149,154],{},[109,150,151],{},[21,152,153],{},"JWT cryptographic operation failed",[109,155,156],{},"Das Token ist korrekt aufgebaut und die Signatur passt nicht.",[94,158,159,164],{},[109,160,161],{},[21,162,163],{},"Unsupported token type",[109,165,166],{},"Das Token hat eine Form, die PostgREST nicht liest.",[10,168,169,171],{},[21,170,153],{}," ist der Satz, der einen veralteten Schlüssel\nmeint. Das Token wurde korrekt gebaut und mit etwas signiert, das das Projekt\nnicht mehr hat, und genau das bleibt nach einem Schlüsselwechsel zurück.",[10,173,174,175,178],{},"Ältere Projekte sehen etwas ganz anderes, und daher stammt die eine Zeichenkette,\ndie überall in den Suchergebnissen steht. Vor Version 13 hat PostgREST genau das\nausgegeben, was seine JWT-Bibliothek gesagt hat, Wort für Wort. Daher kommt\n",[21,176,177],{},"JWSError JWSInvalidSignature",": das ist ein ausgegebener Bibliothekswert und kein\nSatz, den jemand für Sie geschrieben hat. Das Changelog von PostgREST zu 13.0.0\nnennt die Änderung diagnostische Fehlermeldungen statt offengelegter Interna.",[180,181,183],"callout",{"type":182},"warn",[10,184,185,188,189,192,193,195,196,199],{},[31,186,187],{},"Wenn Ihr eigener Code auf den Meldungstext prüft, prüfen Sie stattdessen auf\nden Code."," Ein Vergleich von ",[21,190,191],{},"error.message"," mit ",[21,194,177],{},"\nfunktioniert heute und hört an dem Tag auf, an dem Ihr Projekt auf ein neueres\nPostgREST wechselt, ohne dass Sie dazwischen etwas deployt hätten. Supabase sagt\nin seiner eigenen Fehlerdokumentation dasselbe: ",[21,197,198],{},"error.code"," verwenden und nicht\nauf Fehlermeldungen als Text vergleichen.",[10,201,202,203,206],{},"Ein Nachbarcode lohnt sich hier noch. ",[21,204,205],{},"PGRST303",", ebenfalls 401, bekommen Sie,\nwenn die Signatur in Ordnung war und der Inhalt des Tokens abgelehnt wurde:\nabgelaufen, noch nicht gültig oder mit der falschen Audience. Wenn das Ihr Code\nist, hören Sie auf, die Schlüssel anzusehen, und schauen Sie auf die Uhr und auf\ndie Sitzung.",[40,208,210],{"id":209},"welcher-schlüssel-ist-es-ihr-api-schlüssel-oder-das-token-ihres-nutzers","Welcher Schlüssel ist es: Ihr API-Schlüssel oder das Token Ihres Nutzers?",[10,212,213,214,216,217,220],{},"Das hängt davon ab, ob Ihr Projekt noch ",[21,215,37],{}," und ",[21,218,219],{},"service_role"," verwendet.",[10,222,223,224,216,226,228,229,232],{},"Die Dokumentation von Supabase zu den API-Schlüsseln sagt den Unterschied\ndeutlich. Die alten Schlüssel ",[21,225,37],{},[21,227,219],{}," sind langlebige JWTs, und\ndeshalb beginnen sie mit ",[21,230,231],{},"eyJ",". Die neueren Publishable und Secret Keys sind\nkurze Zeichenketten und überhaupt keine JWTs.",[10,234,235],{},"Diese eine Tatsache teilt den Fehler in zwei Hälften:",[237,238,239,251],"ul",{},[240,241,242,250],"li",{},[31,243,244,245,216,247,249],{},"Ihr Projekt verwendet noch ",[21,246,37],{},[21,248,219],{},"."," Der API-Schlüssel in\nIhrer Anfrage ist selbst ein signiertes Token. Ein Schlüssel aus einem anderen\nProjekt, einer von vor dem Wechsel oder eine abgeschnittene Kopie fallen damit\ngenauso bei der Signaturprüfung durch wie eine kaputte Sitzung. Beide Tokens in\nder Anfrage kommen infrage.",[240,252,253,263],{},[31,254,255,256,216,259,262],{},"Ihr Projekt ist auf ",[21,257,258],{},"sb_publishable_",[21,260,261],{},"sb_secret_"," umgestiegen."," Der\nAPI-Schlüssel ist damit kein Token mehr, es gibt also keine Signatur daran, die\nirgendetwas ablehnen könnte. Zu prüfen bleibt das Access Token Ihres\nangemeldeten Nutzers, das Supabase Auth getrennt vom API-Schlüssel ausstellt.",[57,265],{"alt":266,"caption":267,"src":268},"Zwei Reihen, die jeweils an einem Siegelstempel enden. In der oberen Reihe laufen ein gesiegelter Brief mit der Beschriftung anon und ein zweiter gesiegelter Brief neben einer Person beide zum Siegelstempel. In der unteren Reihe trägt eine schlichte Karte mit der Beschriftung sb_publishable_ kein Siegel und keine Linie, und nur der gesiegelte Brief neben der Person läuft zum Siegelstempel.","In einem alten Projekt kommen zwei gesiegelte Briefe an, und jeder von beiden kann der abgewiesene sein. Nach dem Umstieg auf die neueren Schlüssel trägt der API-Schlüssel kein Siegel mehr, und die Sitzung Ihres angemeldeten Nutzers ist das Einzige, woran noch eine Signatur hängt.","\u002Fblog\u002Fsupabase-invalid-jwt\u002Ftwo-things-called-your-key-1600x820.png",[10,270,271],{},"Praktisch heißt das: die erste Frage ist nicht, welcher Schlüssel falsch ist. Sie\nlautet, ob jemand angemeldet war, als die Anfrage scheiterte. Wenn eine Seite\nohne Anmeldung funktioniert und eine mit Anmeldung nicht, geht es um Sitzungen.\nWenn alles scheitert, auch eine Seite, die nichts Persönliches abfragt, geht es\num den API-Schlüssel, und Ihr Projekt ist ein altes.",[10,273,274,275,278,279,249],{},"Geht es um Sitzungen und steht in Ihrem Auth-Log außerdem\n",[21,276,277],{},"Invalid Refresh Token",", werden Ihre Nutzer abgemeldet, weil\n",[280,281,283],"a",{"href":282},"\u002Fblog\u002Fsupabase-users-logged-out","die Sitzung hinter ihrem Token geendet hat",[10,285,286,287,290,291,249],{},"Kam die Antwort von Supabase Auth und lautet sie ",[21,288,289],{},"invalid claim: missing sub claim",", hat das Token seine Signaturprüfung bestanden und niemanden genannt. Dann\nwurde ein Schlüssel dort geschickt, wo das Token einer Person hingehört, und\n",[280,292,294],{"href":293},"\u002Fblog\u002Finvalid-claim-missing-sub-claim","diese Meldung hat einen eigenen Beitrag",[40,296,298],{"id":297},"invalid-jwt-ist-nicht-no-api-key-found-in-request","Invalid JWT ist nicht \"No API key found in request\"",[10,300,301],{},"Das sind zwei verschiedene Meldungen mit zwei verschiedenen Ursachen, und die\nLösungen haben nichts gemeinsam.",[10,303,304,305,309,310,313],{},"Invalid JWT heißt, ein Token kam an und die Signatur passte nicht. ",[280,306,308],{"href":307},"\u002Fblog\u002Fno-api-key-found-in-request","\"No API key\nfound in request\""," heißt, dass gar kein\n",[21,311,312],{},"apikey","-Header ankam, die Anfrage also am Gateway abgewiesen wurde, bevor Ihre\nDatenbank überhaupt gefragt wurde.",[10,315,316,317,319,320,323,324,326,327,329],{},"Die Antwort selbst klärt, was Sie vor sich haben. Ein fehlender Schlüssel wird\nvom Gateway vor Ihrem Projekt abgewiesen, der Body trägt also ein ",[21,318,81],{}," und\neinen ",[21,321,322],{},"hint"," und überhaupt keinen ",[21,325,21],{},". Ein invalid JWT ist weit genug\ngekommen, um von PostgREST gelesen zu werden, und deshalb steht ",[21,328,71],{}," darauf.",[40,331,333],{"id":332},"wo-der-alte-schlüssel-noch-liegt-der-reihe-nach","Wo der alte Schlüssel noch liegt, der Reihe nach",[10,335,336],{},"Vier Stellen, und sie sind in dieser Reihenfolge zu prüfen, weil das ungefähr\nder Häufigkeit entspricht, mit der sie die Antwort sind.",[338,339,340,346,357,363],"ol",{},[240,341,342,345],{},[31,343,344],{},"Die Projekteinstellungen Ihres Baukastens."," Lovable, Bolt, v0 und Replit\nführen jeweils eigene Umgebungsvariablen, und wenn Sie mit Cursor oder Claude\nCode gebaut haben, liegen dieselben Werte dort, wo Sie deployen. Das ist die\nKopie, die die meisten Leute ändern, und die einzige, die die meisten Leute\nändern.",[240,347,348,351,352,356],{},[31,349,350],{},"Ein direkt in den Code geschriebener Schlüssel."," Er liegt in dem\nJavaScript, das Ihre Besucher herunterladen, eine Änderung im Dashboard ändert\nalso nichts, bis die Datei bearbeitet und die Seite neu gebaut wurde. ",[280,353,355],{"href":354},"\u002Fblog\u002Fwhere-to-find-supabase-api-keys","Wo diese\nSeite ist und was jeder Wert darauf\nbedeutet",", falls Sie sie noch nicht\ngeöffnet haben.",[240,358,359,362],{},[31,360,361],{},"Edge-Function-Secrets."," Eine Function hat ihren eigenen Satz, getrennt von\ndem Ihres Frontends, und verwendet den alten Schlüssel weiter, wenn alles\nandere längst umgezogen ist. Supabase weist außerdem darauf hin, dass eine\nFunction mit eingeschalteter Einstellung Verify JWT beim Rotieren eines\nSigning Key kaputtgehen kann.",[240,364,365,368],{},[31,366,367],{},"Ein Deployment, das niemand neu gebaut hat."," Der Schlüssel wurde beim\nletzten Build fest eingebacken, die laufende Kopie schickt ihn also weiter,\nbis irgendetwas einen neuen Build auslöst. Ihr Dashboard zeigt dabei die ganze\nZeit den neuen Schlüssel, und das macht diesen Fall so schwer zu sehen: die\nStelle, an der Sie nachsehen, ist die eine, die schon stimmt.",[40,370,372],{"id":371},"welchen-schlüssel-ihre-live-app-wirklich-verschickt","Welchen Schlüssel Ihre Live-App wirklich verschickt",[10,374,375],{},"Öffnen Sie die veröffentlichte Seite statt der Vorschau und lesen Sie, was die\nSeite mitschickt.",[10,377,378,379,381,382,384,385,387,388,392,393,397],{},"Ein alter Supabase-Schlüssel ist eine lange Zeichenkette, die mit ",[21,380,231],{}," beginnt.\nDie neueren sagen es in ihren ersten Zeichen: ",[21,383,258],{}," gehört in Ihre\nApp und ",[21,386,261],{}," niemals. Wenn Sie den zweiten auf einer Seite finden, die\nein Besucher laden kann, hören Sie hier auf zu lesen und\n",[280,389,391],{"href":390},"\u002Fblog\u002Frotate-supabase-service-role-key","wechseln Sie ihn",", bevor Sie irgendetwas\nanderes tun. Welchen der beiden Sie haben und\n",[280,394,396],{"href":395},"\u002Fblog\u002Fsupabase-new-api-keys","was sich geändert hat, als Supabase sie umbenannt\nhat",", sollten Sie klären, bevor Sie anfangen, Werte\nzu tauschen.",[10,399,400],{},"Um zu sehen, was Ihr Projekt derzeit ausstellt: alle Schlüssel liegen inzwischen\nan einer Stelle im Dashboard, unter Settings und dann API Keys, die alten\neingeschlossen.",[10,402,403,404,249],{},"Wenn Sie lieber kein minifiziertes Bundle lesen möchten: unser kostenloser Scan\nliest Ihre Live-App so, wie ein Fremder sie sieht, und nennt die Schlüssel, die\nvon außen sichtbar sind. Das dauert etwa 20 Sekunden und braucht kein Konto:\n",[280,405,407],{"href":406},"\u002Fsecurity-scanner","App scannen",[40,409,411],{"id":410},"einen-signing-key-rotieren-ohne-alle-abzumelden","Einen Signing Key rotieren, ohne alle abzumelden",[10,413,414],{},"Auf welchem der beiden Wege Sie unterwegs sind, entscheidet, ob Ihre Nutzer etwas\ndavon merken.",[10,416,417,418,421,422,216,424,426,427,430],{},"Die Supabase-Dokumentation zu Signing Keys stellt beide nebeneinander. Wer das\n",[31,419,420],{},"alte JWT-Secret"," rotiert, meldet alle gerade aktiven Nutzer sofort ab, und\n",[21,423,37],{},[21,425,219],{}," müssen gleichzeitig rotiert werden. Die neueren ",[31,428,429],{},"JWT\nSigning Keys"," funktionieren anders: ein neuer Schlüssel startet als Standby, mit\ndem Rotieren wird er der aktuelle, und der abgelöste wird zum zuvor verwendeten.\nSolange das so ist, werden Signaturen von beiden Schlüsseln weiter akzeptiert,\nletzte Woche gesiegelte Briefe lassen sich also noch öffnen. Erst das Widerrufen\ndes alten Schlüssels ist der Schritt, der das beendet.",[10,432,433],{},"Zwei Warnungen in derselben Dokumentation sind die, über die Leute stolpern:",[237,435,436,439],{},[240,437,438],{},"Eine Komponente, die Tokens selbst gegen das alte JWT-Secret prüft, etwa mit\neiner Bibliothek wie jose oder jsonwebtoken, bleibt beim Rotieren stehen. Sie\nhält den alten Siegelstempel und niemand hat ihr gesagt, dass sie ihn wechseln\nsoll.",[240,440,441],{},"Eine Edge Function mit eingeschalteter Einstellung Verify JWT kann aus\ndemselben Grund kaputtgehen.",[10,443,444],{},"Publishable und Secret Keys anzulegen widerruft Ihre alten Schlüssel ebenfalls\nnicht. Sie funktionieren weiter, bis Sie sie deaktivieren, was die Dokumentation\nals eigenen Schritt ausweist. Eine App, die nur die Hälfte ihrer Kopien\numgestellt hat, läuft deshalb wochenlang weiter, und an dem Tag, an dem jemand\ndie alten Schlüssel abschaltet, fängt die andere Hälfte an, 401 zu antworten.",[40,446,448],{"id":447},"eine-app-im-blick-behalten-die-anfängt-401-zu-antworten","Eine App im Blick behalten, die anfängt, 401 zu antworten",[10,450,451,454],{},[31,452,453],{},"Eine App, die auf jede Anfrage 401 zurückgibt, ist weiterhin erreichbar,\nliefert weiterhin eine Seite aus und beantwortet weiterhin jeden Healthcheck.","\nIn Ihrem Dashboard wird nichts rot. Sie erfahren es, wenn Ihnen jemand schreibt.",[10,456,457],{},[31,458,459,463],{},[280,460,462],{"href":461},"\u002Fwebsite-monitoring","Reeve Monitor"," erfährt es zuerst:",[237,465,466,469,472,475],{},[240,467,468],{},"alle neun Prüfungen jede Stunde, für bis zu drei Apps",[240,470,471],{},"eine E-Mail an dem Tag, an dem ein erneuter Scan Ihre App schlechter bewertet als der vorige",[240,473,474],{},"ob die App erreichbar ist, alle 60 Sekunden",[240,476,477],{},"ein Monatsbericht über das Gesehene",[10,479,480],{},[31,481,482,483,487],{},"Ein Schlüssel, den Sie in Eile wechseln mussten, war meist ein Schlüssel, der\nirgendwo lag, wo er nicht hingehörte, und von hier aus sehen Sie nicht, was damit\ngelesen oder geändert wurde, solange er draußen war. ",[280,484,486],{"href":485},"\u002Fsupabase-backups","Reeve\nCare"," hält eine Kopie Ihrer Supabase-Datenbank von davor\nbereit.",[237,489,490,493,496,499,502],{},[240,491,492],{},"eine verschlüsselte Kopie nach Zeitplan, auf Reeves eigenem Speicher in der EU, außerhalb Ihres Supabase-Kontos",[240,494,495],{},"jede Kopie wird geprüft, bevor sie zählt, indem die Zeilen jeder Tabelle gezählt werden",[240,497,498],{},"eine Wiederherstellung per Klick, die den aktuellen Stand sichert, bevor sie ihn ersetzt",[240,500,501],{},"auf Wunsch auch Ihre hochgeladenen Dateien, sobald Sie eine Storage-Zugangsberechtigung hinterlegen",[240,503,504],{},"alles, was Monitor kann",[40,506,508],{"id":507},"was-heute-zu-tun-ist","Was heute zu tun ist",[510,511,512],"key-takeaways",{},[237,513,514,526,529,532,535],{},[240,515,516,517,519,520,522,523,525],{},"Lesen Sie das Feld ",[21,518,21],{},", nicht den Satz. ",[21,521,71],{}," ist eine Signatur, die nicht passte, ",[21,524,205],{}," ein Token, dessen Inhalt abgelehnt wurde, etwa ein abgelaufenes.",[240,527,528],{},"Klären Sie, welches Token durchgefallen ist, bevor Sie einen Schlüssel ändern. Wenn Seiten ohne Anmeldung laufen und Seiten mit Anmeldung nicht, ist es eine Sitzung und nicht Ihr API-Schlüssel.",[240,530,531],{},"Prüfen Sie alle vier Stellen, an denen der alte Schlüssel liegt: Baukasteneinstellungen, der Code selbst, Edge-Function-Secrets und ein Deployment, das niemand neu gebaut hat.",[240,533,534],{},"Ziehen Sie einen Wechsel in einem Zug durch. Jede zurückgelassene Kopie ist eine App, die halb läuft, und die laufende Seite schickt den alten Schlüssel weiter, bis sie neu gebaut wird.",[240,536,537],{},"Bei den neueren Signing Keys ist das Widerrufen der Schritt, der die alten Signaturen wirklich beendet. Rotieren allein lässt sie gültig.",[10,539,540,541,544,545,549],{},"Fangen Sie mit der Frage an, ob eine Seite ohne Anmeldung noch lädt, denn diese\neine Antwort entscheidet, welche Hälfte dieses Artikels für Sie gilt. Falls ein\nSecret Key offen herumlag, beschreibt\n",[280,542,543],{"href":390},"ihn zu wechseln"," die richtige\nReihenfolge, und\n",[280,546,548],{"href":547},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","welche Schlüssel je sicher auslieferbar\nwaren"," erklärt, warum sich die\nbeiden überhaupt so ähnlich sehen.",{"title":23,"searchDepth":551,"depth":551,"links":552},3,[553,555,556,557,558,559,560,561,562],{"id":42,"depth":554,"text":43},2,{"id":64,"depth":554,"text":65},{"id":209,"depth":554,"text":210},{"id":297,"depth":554,"text":298},{"id":332,"depth":554,"text":333},{"id":371,"depth":554,"text":372},{"id":410,"depth":554,"text":411},{"id":447,"depth":554,"text":448},{"id":507,"depth":554,"text":508},"Sicherheitsgrundlagen","\u002Fblog\u002Fsupabase-invalid-jwt\u002Fcover-1200x630.png","Ein gesiegelter Brief vor einem Siegelstempel, dessen Gravur nicht zum Siegel passt, dahinter weitere Briefe hinter einem gelben Balken.","Ein Supabase invalid JWT ist PGRST301: ein signiertes Token hat die Prüfung nicht bestanden. In neueren Projekten ist das die Sitzung, nicht der API-Schlüssel.",false,"md",[570,573,576,579,582],{"q":571,"a":572},"Was bedeutet PGRST301?","PGRST301 ist die Antwort von PostgREST mit HTTP 401, weil ein signiertes Token in Ihrer Anfrage nicht verifiziert werden konnte. PostgREST ist der Server, der Ihre Supabase-Tabellen in die HTTP-API verwandelt, mit der Ihre App spricht. Seine eigene Fehlerreferenz beschreibt den Code als ein mitgeschicktes JWT, das nicht dekodiert werden konnte oder ungültig ist, und ab Version 13 steht im Feld message ein genauerer Satz dazu, welcher Teil der Prüfung fehlgeschlagen ist.",{"q":574,"a":575},"Warum bekomme ich 401, nachdem ich meinen Supabase-Schlüssel gewechselt habe?","Weil irgendwo noch eine Kopie des alten Schlüssels verschickt wird. Die üblichen Stellen sind die Projekteinstellungen Ihres Baukastens, ein direkt in den Code geschriebener Schlüssel, ein Edge-Function-Secret und ein Deployment, das vor der Änderung gebaut und seitdem nicht neu gebaut wurde. Ein Token, das mit einem Schlüssel signiert ist, den der Server nicht mehr akzeptiert, besteht die Prüfung nicht, und das kommt bei Ihnen als 401 auf jede Anfrage an statt als Hinweis auf den Schlüssel.",{"q":577,"a":578},"Was ist der Unterschied zwischen invalid JWT und No API key found in request?","Das sind zwei verschiedene Meldungen mit verschiedenen Ursachen. No API key found in request bedeutet, dass die Anfrage ganz ohne apikey-Header ankam und am Gateway abgewiesen wurde, bevor Ihre Datenbank überhaupt gefragt wurde. Invalid JWT bedeutet, dass ein Token da war und seine Signatur nicht gepasst hat. Das eine ist eine Anfrage ohne Adresse, das andere eine Anfrage mit dem falschen Siegel.",{"q":580,"a":581},"Muss ich meine Edge Functions auch anpassen?","Ja, und das ist die Kopie, die am häufigsten vergessen wird, denn eine Edge Function hat ihre eigenen Secrets, getrennt von denen Ihres Frontends. Supabase weist außerdem darauf hin, dass eine Function mit eingeschalteter Einstellung Verify JWT beim Rotieren eines Signing Key kaputtgehen kann, und dass jede Komponente, die Tokens selbst gegen das alte JWT-Secret prüft, aus demselben Grund stehen bleibt.",{"q":583,"a":584},"Wie sehe ich, welchen Schlüssel meine Live-App wirklich verschickt?","Öffnen Sie Ihre veröffentlichte Seite, nicht die Vorschau, und schauen Sie, was die Seite tatsächlich mitschickt. Ein alter Supabase-Schlüssel ist eine lange Zeichenkette, die mit eyJ beginnt, die neueren beginnen mit sb_publishable_ oder sb_secret_. Unser kostenloser Scan liest eine Live-App so, wie ein Fremder sie sieht, und nennt die Schlüssel, die von außen sichtbar sind. Damit sehen Sie auch, ob noch ein alter mitgeschickt wird.","\u002Fblog\u002Fsupabase-invalid-jwt\u002Fcard-800x500.png",[587,588,589,590,591,592,593],"supabase invalid jwt","pgrst301","bad_jwt supabase","supabase 401 nach schlüsselwechsel","jwsinvalidsignature supabase","supabase legacy key funktioniert nicht mehr","provided jwt could not be decoded",{},true,"\u002Fblog\u002Fsupabase-invalid-jwt","2026-10-16",{"title":5,"description":566},"blog\u002Fsupabase-invalid-jwt",[601,602,603],"Ein Supabase invalid JWT kommt als PGRST301 mit HTTP 401 an, und es bedeutet, dass die Signatur des mitgeschickten Tokens nicht geprüft werden konnte. Es wurde nichts nachgeschlagen und abgelehnt.","Publishable und Secret Keys sind kurze Zeichenketten ohne Signatur. In einem Projekt, das darauf umgestellt hat, geht es bei diesem Fehler also um Ihren angemeldeten Nutzer und nie um den API-Schlüssel.","PostgREST 13 hat einen vagen Satz durch eine kurze Liste konkreter Sätze ersetzt. Lesen Sie die Meldung, die Sie tatsächlich bekommen haben: jede schließt etwas anderes aus.","iygIHnV4N88nJONJfbXvhiG5Q-oy2TbZzJ5LeP66WP4",[606,612,618,624,630,636,641,647,653,659,665,672,678,684,690,696,702,708,714,720,726,732,737,743,749,750,756,762,768,774,780,786,792,798,803,809,815,821,827,833,839,845,851,857,863,869,874,880,886,892,898,904,910,916,922,928,934,940,946,952,958,964,970,976,981,987,993,999,1005,1011,1017,1023,1029,1035,1041,1046,1052,1058,1064,1070,1076,1082,1088,1094,1099,1104,1110,1116,1121,1127],{"path":607,"title":608,"description":609,"published":610,"category":563,"image":611,"draft":567},"\u002Fblog\u002Fmax-client-connections-reached","Supabase \"max client connections reached\" erklärt","Supabase \"max client connections reached\": Der Pooler hat keinen Platz für noch einen Client. Der Port in deinem Connection String setzt das Limit.","2026-11-09","\u002Fblog\u002Fmax-client-connections-reached\u002Fcard-800x500.png",{"path":613,"title":614,"description":615,"published":616,"category":563,"image":617,"draft":567},"\u002Fblog\u002Funsupported-provider-provider-is-not-enabled","Supabase-Fehler: \"Unsupported provider: provider is not enabled\"","\"Unsupported provider: provider is not enabled\" heißt: Google-Login ist in deinem Supabase-Projekt aus. Die Lösung, und was bei redirect_uri_mismatch hilft.","2026-11-08","\u002Fblog\u002Funsupported-provider-provider-is-not-enabled\u002Fcard-800x500.png",{"path":619,"title":620,"description":621,"published":622,"category":563,"image":623,"draft":567},"\u002Fblog\u002Fviolates-foreign-key-constraint","Supabase-Fehler \"violates foreign key constraint\" beim Einfügen","Supabase \"insert or update on table violates foreign key constraint\": Deine Zeile zeigt auf eine, die es nicht gibt. Welche, warum, und die Lösung.","2026-11-07","\u002Fblog\u002Fviolates-foreign-key-constraint\u002Fcard-800x500.png",{"path":625,"title":626,"description":627,"published":628,"category":563,"image":629,"draft":567},"\u002Fblog\u002Fnull-value-violates-not-null-constraint","Supabase-Fehler \"null value in column violates not-null constraint\"","Supabase \"null value in column violates not-null constraint\": Eine Pflichtspalte kam leer an. Woher die Null kommt, und die Lösung.","2026-11-06","\u002Fblog\u002Fnull-value-violates-not-null-constraint\u002Fcard-800x500.png",{"path":631,"title":632,"description":633,"published":634,"category":563,"image":635,"draft":567},"\u002Fblog\u002Fauth-session-missing","Supabase \"Auth session missing!\": wo die Sitzung geblieben ist","\"Auth session missing!\" heißt: supabase-js fand keine angemeldete Sitzung und fragte Supabase gar nicht erst. Wo die Sitzung blieb, und die Lösung je Fall.","2026-11-05","\u002Fblog\u002Fauth-session-missing\u002Fcard-800x500.png",{"path":293,"title":637,"description":638,"published":639,"category":563,"image":640,"draft":567},"Supabase \"invalid claim: missing sub claim\": niemand ist angemeldet","\"invalid claim: missing sub claim\" heißt: Supabase Auth bekam ein echtes Token ohne Nutzer darin, deinen Projektschlüssel statt einer Sitzung.","2026-11-04","\u002Fblog\u002Finvalid-claim-missing-sub-claim\u002Fcard-800x500.png",{"path":642,"title":643,"description":644,"published":645,"category":563,"image":646,"draft":567},"\u002Fblog\u002Ffailed-to-send-a-request-to-the-edge-function","\"Failed to send a request to the Edge Function\": der echte Grund","\"Failed to send a request to the Edge Function\" heißt: Der Browser hat keine lesbare Antwort bekommen. Seine Konsole sagt, warum, und ob deine Funktion lief.","2026-11-03","\u002Fblog\u002Ffailed-to-send-a-request-to-the-edge-function\u002Fcard-800x500.png",{"path":648,"title":649,"description":650,"published":651,"category":563,"image":652,"draft":567},"\u002Fblog\u002Fsupabase-auth-redirects-to-localhost","Warum Supabase-E-Mail-Links auf localhost:3000 weiterleiten","Leitet Supabase auf localhost:3000 um, ist die Site URL unverändert, oder deine Adresse fehlt in Redirect URLs. Die Lösung und der Platzhalter, den du meidest.","2026-11-02","\u002Fblog\u002Fsupabase-auth-redirects-to-localhost\u002Fcard-800x500.png",{"path":654,"title":655,"description":656,"published":657,"category":563,"image":658,"draft":567},"\u002Fblog\u002Femail-link-is-invalid-or-has-expired","Supabase \"Email link is invalid or has expired\" bei einem neuen Link","Bei einem Link von vor einer Minute heißt Supabases \"Email link is invalid or has expired\" meist: Ein Mailfilter hat ihn zuerst benutzt. Prüfen und beheben.","2026-11-01","\u002Fblog\u002Femail-link-is-invalid-or-has-expired\u002Fcard-800x500.png",{"path":660,"title":661,"description":662,"published":663,"category":563,"image":664,"draft":567},"\u002Fblog\u002Fcanceling-statement-due-to-statement-timeout","Supabase \"canceling statement due to statement timeout\" erklärt","Supabase \"canceling statement due to statement timeout\": Eine Abfrage lief länger als ihre Rolle darf, 3 Sekunden für Besucher. Prüf zuerst die RLS-Regel.","2026-10-31","\u002Fblog\u002Fcanceling-statement-due-to-statement-timeout\u002Fcard-800x500.png",{"path":666,"title":667,"description":668,"published":669,"category":670,"image":671,"draft":567},"\u002Fblog\u002Fdatabase-error-deleting-user","\"Database error deleting user\" in Supabase und was mitgelöscht wird","\"Database error deleting user\" in Supabase heißt: Deine Datenbank hat das Löschen abgelehnt. Der Grund steht im Log, die Lösung entscheidet, was mitgeht.","2026-10-30","Backups","\u002Fblog\u002Fdatabase-error-deleting-user\u002Fcard-800x500.png",{"path":673,"title":674,"description":675,"published":676,"category":563,"image":677,"draft":567},"\u002Fblog\u002Fstripe-webhook-no-signatures-found","\"No signatures found matching the expected signature\" bei Supabase","Ein Stripe-Webhook in einer Supabase Edge Function meldet \"No signatures found matching the expected signature\"? Zwei Ursachen. Prüfe weiter.","2026-10-29","\u002Fblog\u002Fstripe-webhook-no-signatures-found\u002Fcard-800x500.png",{"path":679,"title":680,"description":681,"published":682,"category":563,"image":683,"draft":567},"\u002Fblog\u002Fsupabase-invalid-login","\"Invalid login credentials\" in Supabase: die drei Ursachen","Supabase sagt \"Invalid login credentials\" bei falschem Passwort, unbekannter E-Mail und Google-Konto. So erkennst du, welcher Fall es ist.","2026-10-28","\u002Fblog\u002Fsupabase-invalid-login\u002Fcard-800x500.png",{"path":685,"title":686,"description":687,"published":688,"category":563,"image":689,"draft":567},"\u002Fblog\u002Fedge-function-returned-a-non-2xx-status-code","\"Edge Function returned a non-2xx status code\": der echte Fehler","\"Edge Function returned a non-2xx status code\" heißt: Deine Supabase-Funktion hat mit einem Fehler geantwortet. So liest du den echten.","2026-10-27","\u002Fblog\u002Fedge-function-returned-a-non-2xx-status-code\u002Fcard-800x500.png",{"path":691,"title":692,"description":693,"published":694,"category":563,"image":695,"draft":567},"\u002Fblog\u002Fcertificate-not-trusted","Zertifikat nicht vertrauenswürdig: drei Ursachen außer Ablauf","Zertifikat nicht vertrauenswürdig, obwohl das Datum stimmt? Es nennt eine andere Adresse, hat sich selbst signiert oder seiner Kette fehlt ein Glied.","2026-10-26","\u002Fblog\u002Fcertificate-not-trusted\u002Fcard-800x500.png",{"path":697,"title":698,"description":699,"published":700,"category":563,"image":701,"draft":567},"\u002Fblog\u002Finvalid-input-syntax-for-type-uuid","Supabase \"invalid input syntax for type uuid\": was im Zitat steht","Supabase \"invalid input syntax for type uuid\" heißt: Deine App hat etwas geschickt, das keine ID ist. Zitat lesen, Abfrage zurückhalten, Spalte behalten.","2026-10-25","\u002Fblog\u002Finvalid-input-syntax-for-type-uuid\u002Fcard-800x500.png",{"path":703,"title":704,"description":705,"published":706,"category":563,"image":707,"draft":567},"\u002Fblog\u002Fduplicate-key-value-violates-unique-constraint","Supabase \"duplicate key value violates unique constraint\" erklärt","Supabase \"duplicate key value violates unique constraint\" heißt: Der Wert ist schon vergeben. Spalte finden, Lösung wählen, Wert vom Bildschirm fernhalten.","2026-10-24","\u002Fblog\u002Fduplicate-key-value-violates-unique-constraint\u002Fcard-800x500.png",{"path":709,"title":710,"description":711,"published":712,"category":563,"image":713,"draft":567},"\u002Fblog\u002Fsupabase-relation-does-not-exist","Supabase \"relation does not exist\", obwohl die Tabelle da ist","Supabase \"relation does not exist\" oder PGRST205: Keine Tabelle passt zu Name und Schema deiner Abfrage. Vier Prüfungen, und was eine Freigabe öffnet.","2026-10-23","\u002Fblog\u002Fsupabase-relation-does-not-exist\u002Fcard-800x500.png",{"path":715,"title":716,"description":717,"published":718,"category":563,"image":719,"draft":567},"\u002Fblog\u002Fsupabase-function-not-found","Supabase PGRST202: \"Could not find the function in the schema cache\"","Supabase \"Could not find the function in the schema cache\" nennt die Argumente, die deine App geschickt hat. Vergleich sie mit der Funktion.","2026-10-22","\u002Fblog\u002Fsupabase-function-not-found\u002Fcard-800x500.png",{"path":721,"title":722,"description":723,"published":724,"category":563,"image":725,"draft":567},"\u002Fblog\u002Fsupabase-schema-cache-column-error","Supabase PGRST204: \"Could not find the column in the schema cache\"","Supabase \"Could not find the column in the schema cache\" heißt meist: Der Name passt nicht. Vier Prüfungen und der Einzeiler zum Neuladen.","2026-10-21","\u002Fblog\u002Fsupabase-schema-cache-column-error\u002Fcard-800x500.png",{"path":727,"title":728,"description":729,"published":730,"category":563,"image":731,"draft":567},"\u002Fblog\u002Fsupabase-email-rate-limit-exceeded","Supabase \"Email Rate Limit Exceeded\": zwei Limits, ein Fehlercode","Supabase \"Email Rate Limit Exceeded\" begrenzt jede E-Mail deines Projekts: 2 pro Stunde beim eingebauten Absender. Was zählt und wie du es anhebst.","2026-10-20","\u002Fblog\u002Fsupabase-email-rate-limit-exceeded\u002Fcard-800x500.png",{"path":282,"title":733,"description":734,"published":735,"category":563,"image":736,"draft":567},"Supabase \"Invalid Refresh Token: Refresh Token Not Found\": 3 Ursachen","Supabase \"Invalid Refresh Token: Refresh Token Not Found\" meldet deine Nutzer ab. Drei Ursachen, und wie das Auth-Log sie trennt.","2026-10-19","\u002Fblog\u002Fsupabase-users-logged-out\u002Fcard-800x500.png",{"path":738,"title":739,"description":740,"published":741,"category":563,"image":742,"draft":567},"\u002Fblog\u002Fpermission-denied-for-schema-public","Supabase \"permission denied for schema public\": drei Ursachen","Supabase \"permission denied for schema public\" heißt: Ein Grant auf das Schema fehlt. Was ihn entfernt hat und welche Zeile ihn zurückbringt.","2026-10-18","\u002Fblog\u002Fpermission-denied-for-schema-public\u002Fcard-800x500.png",{"path":744,"title":745,"description":746,"published":747,"category":563,"image":748,"draft":567},"\u002Fblog\u002Fsupabase-bucket-not-found","Supabase \"Bucket not found\": die drei Dinge, die es bedeutet","Supabase \"Bucket not found\" ist eins von drei Dingen: ein öffentlicher Link zu einem privaten Bucket, ein ungenauer Name oder das falsche Projekt.","2026-10-17","\u002Fblog\u002Fsupabase-bucket-not-found\u002Fcard-800x500.png",{"path":596,"title":5,"description":566,"published":597,"category":563,"image":585,"draft":567},{"path":751,"title":752,"description":753,"published":754,"category":563,"image":755,"draft":567},"\u002Fblog\u002Fsupabase-single-row-error","Supabase \"multiple (or no) rows returned\" heißt meist: keine Zeilen","Supabase gibt PGRST116 zurück, \"JSON object requested, multiple (or no) rows returned\", wenn die Abfrage nichts fand. Versteckte Zeilen wirken fehlend.","2026-10-15","\u002Fblog\u002Fsupabase-single-row-error\u002Fcard-800x500.png",{"path":757,"title":758,"description":759,"published":760,"category":563,"image":761,"draft":567},"\u002Fblog\u002Fdatabase-error-saving-new-user","\"Database error saving new user\" in Supabase: wo du nachsiehst","\"Database error saving new user\" heißt: etwas an deiner Supabase-Registrierung ist fehlgeschlagen. Der echte Fehler steht in deinen Logs.","2026-10-14","\u002Fblog\u002Fdatabase-error-saving-new-user\u002Fcard-800x500.png",{"path":763,"title":764,"description":765,"published":766,"category":563,"image":767,"draft":567},"\u002Fblog\u002Fwhat-is-supabase","Was ist Supabase? Die Datenbank, die dein Builder ausgesucht hat","Was ist Supabase: die Datenbank, der Login und der Dateispeicher hinter deiner App. Supabase betreibt die Server, die Regeln zu deinen Zeilen gehören dir.","2026-10-13","\u002Fblog\u002Fwhat-is-supabase\u002Fcard-800x500.png",{"path":769,"title":770,"description":771,"published":772,"category":563,"image":773,"draft":567},"\u002Fblog\u002Faws-access-key-exposed-in-frontend","Ein offengelegter AWS-Schlüssel im Frontend ist kein OpenAI-Key","Ein im Frontend offengelegter AWS-Zugriffsschlüssel liest und schreibt deinen Speicher. Die Lösung ist meist eine presigned URL, kein neuer Schlüssel.","2026-10-12","\u002Fblog\u002Faws-access-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":775,"title":776,"description":777,"published":778,"category":563,"image":779,"draft":567},"\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":781,"title":782,"description":783,"published":784,"category":563,"image":785,"draft":567},"\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":787,"title":788,"description":789,"published":790,"category":563,"image":791,"draft":567},"\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":793,"title":794,"description":795,"published":796,"category":563,"image":797,"draft":567},"\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":307,"title":799,"description":800,"published":801,"category":563,"image":802,"draft":567},"\"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":804,"title":805,"description":806,"published":807,"category":563,"image":808,"draft":567},"\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":810,"title":811,"description":812,"published":813,"category":563,"image":814,"draft":567},"\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":816,"title":817,"description":818,"published":819,"category":563,"image":820,"draft":567},"\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":822,"title":823,"description":824,"published":825,"category":563,"image":826,"draft":567},"\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":828,"title":829,"description":830,"published":831,"category":563,"image":832,"draft":567},"\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":834,"title":835,"description":836,"published":837,"category":563,"image":838,"draft":567},"\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":840,"title":841,"description":842,"published":843,"category":563,"image":844,"draft":567},"\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":846,"title":847,"description":848,"published":849,"category":563,"image":850,"draft":567},"\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":852,"title":853,"description":854,"published":855,"category":670,"image":856,"draft":567},"\u002Fblog\u002Ftest-your-supabase-backup","Teste dein Supabase-Backup, bevor du es brauchst","So testest du dein Supabase-Backup: in ein Übungsprojekt einspielen, Zeilen zählen, anmelden und die Zeile suchen, die einer abgeschnittenen Datei fehlt.","2026-09-28","\u002Fblog\u002Ftest-your-supabase-backup\u002Fcard-800x500.png",{"path":858,"title":859,"description":860,"published":861,"category":670,"image":862,"draft":567},"\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":864,"title":865,"description":866,"published":867,"category":670,"image":868,"draft":567},"\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":870,"title":871,"description":872,"published":867,"category":563,"image":873,"draft":567},"\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":875,"title":876,"description":877,"published":878,"category":563,"image":879,"draft":567},"\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":881,"title":882,"description":883,"published":884,"category":563,"image":885,"draft":567},"\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":887,"title":888,"description":889,"published":890,"category":670,"image":891,"draft":567},"\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":893,"title":894,"description":895,"published":896,"category":563,"image":897,"draft":567},"\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":899,"title":900,"description":901,"published":902,"category":563,"image":903,"draft":567},"\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":905,"title":906,"description":907,"published":908,"category":563,"image":909,"draft":567},"\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":911,"title":912,"description":913,"published":914,"category":563,"image":915,"draft":567},"\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":917,"title":918,"description":919,"published":920,"category":563,"image":921,"draft":567},"\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":923,"title":924,"description":925,"published":926,"category":563,"image":927,"draft":567},"\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":929,"title":930,"description":931,"published":932,"category":563,"image":933,"draft":567},"\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":935,"title":936,"description":937,"published":938,"category":563,"image":939,"draft":567},"\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":941,"title":942,"description":943,"published":944,"category":670,"image":945,"draft":567},"\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":947,"title":948,"description":949,"published":950,"category":670,"image":951,"draft":567},"\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":953,"title":954,"description":955,"published":956,"category":670,"image":957,"draft":567},"\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":959,"title":960,"description":961,"published":962,"category":563,"image":963,"draft":567},"\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":965,"title":966,"description":967,"published":968,"category":563,"image":969,"draft":567},"\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":971,"title":972,"description":973,"published":974,"category":563,"image":975,"draft":567},"\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":390,"title":977,"description":978,"published":979,"category":563,"image":980,"draft":567},"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":982,"title":983,"description":984,"published":985,"category":563,"image":986,"draft":567},"\u002Fblog\u002Fvibe-coding-security-scanners-compared","Vibe-Coding-Security-Scanner im Vergleich, unserer eingeschlossen","Der beste Vibe-Coding-Security-Scanner hängt an drei Fragen, die keine Funktionsliste beantwortet. Acht Tools im Vergleich, mit Preisen und unseren Lücken.","2026-09-07","\u002Fblog\u002Fvibe-coding-security-scanners-compared\u002Fcard-800x500.png",{"path":988,"title":989,"description":990,"published":991,"category":563,"image":992,"draft":567},"\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":994,"title":995,"description":996,"published":997,"category":563,"image":998,"draft":567},"\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":1000,"title":1001,"description":1002,"published":1003,"category":563,"image":1004,"draft":567},"\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":1006,"title":1007,"description":1008,"published":1009,"category":563,"image":1010,"draft":567},"\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":1012,"title":1013,"description":1014,"published":1015,"category":563,"image":1016,"draft":567},"\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":1018,"title":1019,"description":1020,"published":1021,"category":670,"image":1022,"draft":567},"\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":1024,"title":1025,"description":1026,"published":1027,"category":563,"image":1028,"draft":567},"\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":1030,"title":1031,"description":1032,"published":1033,"category":670,"image":1034,"draft":567},"\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":1036,"title":1037,"description":1038,"published":1039,"category":563,"image":1040,"draft":567},"\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":354,"title":1042,"description":1043,"published":1044,"category":563,"image":1045,"draft":567},"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":1047,"title":1048,"description":1049,"published":1050,"category":563,"image":1051,"draft":567},"\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":1053,"title":1054,"description":1055,"published":1056,"category":563,"image":1057,"draft":567},"\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":1059,"title":1060,"description":1061,"published":1062,"category":670,"image":1063,"draft":567},"\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":1065,"title":1066,"description":1067,"published":1068,"category":670,"image":1069,"draft":567},"\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":1071,"title":1072,"description":1073,"published":1074,"category":563,"image":1075,"draft":567},"\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":1077,"title":1078,"description":1079,"published":1080,"category":563,"image":1081,"draft":567},"\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":1083,"title":1084,"description":1085,"published":1086,"category":670,"image":1087,"draft":567},"\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":1089,"title":1090,"description":1091,"published":1092,"category":563,"image":1093,"draft":567},"\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":1095,"title":1096,"description":1097,"published":1092,"category":563,"image":1098,"draft":567},"\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":395,"title":1100,"description":1101,"published":1102,"category":563,"image":1103,"draft":567},"Supabase publishable key: ist er derselbe wie der anon key?","Supabase hat anon und service_role durch öffentliche und geheime Schlüssel ersetzt. Welcher gehört in deine App, und welcher nie?","2026-08-12","\u002Fblog\u002Fsupabase-new-api-keys\u002Fcard-800x500.png",{"path":1105,"title":1106,"description":1107,"published":1108,"category":670,"image":1109,"draft":567},"\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":1111,"title":1112,"description":1113,"published":1114,"category":563,"image":1115,"draft":567},"\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":1117,"title":1118,"description":1119,"published":1114,"category":670,"image":1120,"draft":567},"\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":1122,"title":1123,"description":1124,"published":1125,"category":670,"image":1126,"draft":567},"\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":547,"title":1128,"description":1129,"published":1125,"category":563,"image":1130,"draft":567},"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",1794213638778]