[{"data":1,"prerenderedAt":998},["ShallowReactive",2],{"blog-de-api-key-leaked-what-to-do":3,"blog-index-de":645},{"id":4,"title":5,"body":6,"category":601,"cover":602,"coverAlt":603,"description":604,"draft":605,"extension":606,"faq":607,"image":622,"keywords":623,"meta":632,"navigation":633,"ogTitle":634,"path":635,"published":636,"seo":637,"stem":638,"tldr":639,"updated":636,"__hash__":644},"blog_de\u002Fblog\u002Fapi-key-leaked-what-to-do.md","Dein API-Key wurde geleakt. Die richtige Reihenfolge",{"type":7,"value":8,"toc":587},"minimark",[9,13,16,21,24,32,35,57,65,69,72,79,82,88,94,100,104,267,270,280,302,306,309,363,368,372,375,382,385,388,392,395,404,409,414,424,428,431,434,437,440,445,449,455,463,474,483,501,510,527,538,542,579],[10,11,12],"p",{},"Die Nachricht kommt meistens aus einem Scan-Bericht, von GitHub, das dir\nmitteilt, in einem deiner Repositories sei ein Geheimnis aufgetaucht, oder von\njemandem, der auf deiner Seite F12 gedrückt und dir einen Screenshot geschickt\nhat. Wie auch immer sie dich erreicht hat: du weißt jetzt, dass ein API-Key von\ndir geleakt wurde, und du weißt nicht, was zuerst zu tun ist.",[10,14,15],{},"Hier ist der Teil, den eine Anleitung nach der anderen falsch macht: Sie geben\nfür jeden Key dieselbe Antwort, und die Antwort lautet immer rotieren. Manche\ndieser Keys sollen öffentlich sein und brauchen gar nichts. Von den übrigen\nlassen manche gerade still eine Rechnung wachsen, während du das liest, und\nandere haben ihren ganzen Schaden schon am Tag des Deploys angerichtet. Das sind\ndrei verschiedene Situationen, und der erste Schritt ist in jeder ein anderer.",[17,18,20],"h2",{"id":19},"ist-der-key-überhaupt-ein-geheimnis","Ist der Key überhaupt ein Geheimnis?",[10,22,23],{},"Oft nicht, und die Zahlen sind schief genug, um das klar zu sagen.",[10,25,26,27,31],{},"Wir haben 31.056 live Apps gescannt und das JavaScript gelesen, das jede davon\nan den Browser ausliefert. Die Prüfung, die nach Zugangsdaten sucht, konnte bei\nallen antworten, und 1.332 kamen mit mindestens einem Key zurück, der eine\nMeldung wert war. ",[28,29,30],"strong",{},"1.142 davon waren Google-API-Keys",", und das ist der eine\nTyp darunter, der normalerweise genau dort sitzt, wo er hingehört.",[10,33,34],{},"Ein Google-API-Key in einer Webseite ist das, was Google Maps zum Laufen bringt.\nDer Key sagt, welches Projekt bezahlt, und was Fremde davon abhält, auf deine\nRechnung zu gehen, ist die Einschränkung am Key statt seiner Geheimhaltung.\nGoogles eigene Anleitung ist bei beiden Hälften deutlich: \"Unrestricted API keys\nare insecure\", und \"You are financially responsible for charges caused by abuse\nof unrestricted API keys.\" Die Reparatur für so einen Key besteht darin, ihn in\nder Cloud Console zu öffnen und zwei Einschränkungen zu setzen, eine mit deiner\nWebsite und eine mit den APIs, die du tatsächlich aufrufst. Der Key selbst\nändert sich nie.",[10,36,37,38,42,43,46,47,50,51,56],{},"Die andere Familie, die in den Browser gehört, sind die Publishable Keys. Ein\nStripe-Key ",[39,40,41],"code",{},"pk_live_"," und ein Supabase-Key ",[39,44,45],{},"sb_publishable_"," oder ",[39,48,49],{},"anon"," sind\ndafür gebaut, dass jeder Besucher sie liest.\n",[52,53,55],"a",{"href":54},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","Welche deiner Keys im Frontend sicher sind","\nist die Vier-Zeichen-Version dieses Tests.",[10,58,59,60,64],{},"Wenn du deinen Bundle nicht von Hand durchgehen willst: Unser kostenloser Scan\nliest deine Live-Seite, listet die Keys auf, die er von außen sieht, und sagt\ndir, welcher Art jeder einzelne ist: ",[52,61,63],{"href":62},"\u002Fsecurity-scanner","App scannen",". Das\ndauert rund 20 Sekunden und braucht kein Konto.",[17,66,68],{"id":67},"mein-api-key-wurde-geleakt-was-mache-ich-zuerst","Mein API-Key wurde geleakt. Was mache ich zuerst?",[10,70,71],{},"Klär, ob an dem Key ein Zähler hängt.",[10,73,74,75,78],{},"Ein Key mit Zähler berechnet dir jede Anfrage. Die von Google, von OpenAI, von\nAnthropic, und ein AWS-Key mit den falschen Rechten dahinter, sind alle Zähler:\nDer Verkehr von jemand anderem landet auf deiner Rechnung, in einem Takt, den\ndie Person bestimmt und den du nicht siehst. Ein Key ohne Zähler liest oder\nschreibt stattdessen deine Daten. Ein Supabase-Key ",[39,76,77],{},"service_role"," ist das\nklarste Beispiel, und nichts daran kostet Geld pro Stunde.",[10,80,81],{},"Diese eine Frage legt die Reihenfolge fest.",[10,83,84,87],{},[28,85,86],{},"Hat der Key einen Zähler, stopp ihn jetzt."," Die Funktion, die ihn benutzt\nhat, ist kaputt, bis du den Ersatz deployst, und das ist der richtige Tausch,\ndenn die Rechnung ist der einzige Teil hier, der weiter wächst, während du\nplanst.",[10,89,90,93],{},[28,91,92],{},"Liest der Key Daten und wurde er in deinem Bundle veröffentlicht, ist er\nlängst gelesen worden."," Jeder Besucher, der die Seite geladen hat, hat eine\nKopie, und jeder Crawler, der genau nach dieser Zeichenfolge gesucht hat,\nebenfalls. Es wird nichts schlimmer, während du die richtige Reihenfolge\nherausfindest, und worauf es dabei ankommt, ist, dich unterwegs nicht aus deiner\neigenen App auszusperren.",[95,96],"diagram",{"alt":97,"caption":98,"src":99},"Zwei Spuren, die beide mit demselben Schlüssel beginnen. In der oberen Spur führt der Schlüssel zu einem Zeigerinstrument, dessen Nadel weit herumgewandert ist, und weiter zu einem Stapel Münzen, alles in Bernstein. In der unteren Spur führt der Schlüssel zu einer Tabelle, deren Zeilen alle rot leuchten, und an der Stelle des Instruments steht ein leerer gestrichelter Kreis.","Der obere Schlüssel kostet dich Geld, während du das liest. Der untere hat alles, was er tun konnte, am Tag des Deploys getan.","\u002Fblog\u002Fapi-key-leaked-what-to-do\u002Fdoes-it-have-a-meter-1600x660.png",[17,101,103],{"id":102},"was-jede-art-von-key-tatsächlich-kann","Was jede Art von Key tatsächlich kann",[105,106,107,129],"table",{},[108,109,110],"thead",{},[111,112,113,117,120,123,126],"tr",{},[114,115,116],"th",{},"Key",[114,118,119],{},"Gibt Geld aus",[114,121,122],{},"Liest deine Daten",[114,124,125],{},"Lässt er sich stattdessen einschränken?",[114,127,128],{},"Geht die App vom Ersetzen kaputt?",[130,131,132,154,169,188,205,227,248],"tbody",{},[111,133,134,142,145,148,151],{},[135,136,137,138,46,140],"td",{},"Supabase ",[39,139,45],{},[39,141,49],{},[135,143,144],{},"Nein",[135,146,147],{},"Nur die Zeilen, die deine Regeln erlauben",[135,149,150],{},"Gehört in den Browser",[135,152,153],{},"Nicht zutreffend",[111,155,156,161,163,165,167],{},[135,157,158,159],{},"Stripe ",[39,160,41],{},[135,162,144],{},[135,164,144],{},[135,166,150],{},[135,168,153],{},[111,170,171,177,180,182,185],{},[135,172,173,174],{},"Google ",[39,175,176],{},"AIza…",[135,178,179],{},"Ja, auf deiner Cloud-Rechnung",[135,181,144],{},[135,183,184],{},"Ja, und Google sagt, das zuerst zu versuchen",[135,186,187],{},"Einschränken nicht. Rotieren schon.",[111,189,190,193,196,199,202],{},[135,191,192],{},"OpenAI- oder Anthropic-Key",[135,194,195],{},"Ja, im Takt eines Fremden",[135,197,198],{},"Dateien und Assistants im Projekt",[135,200,201],{},"Es gibt keine Publishable-Variante",[135,203,204],{},"Ja, bis ein Server von dir ihn hält",[111,206,207,215,218,221,224],{},[135,208,158,209,46,212],{},[39,210,211],{},"sk_live_",[39,213,214],{},"rk_live_",[135,216,217],{},"Ja",[135,219,220],{},"Ja, Kunden- und Zahlungsdaten",[135,222,223],{},"Ein Restricted Key ist die enge Version",[135,225,226],{},"Nein, es gibt ein Fenster von sieben Tagen",[111,228,229,236,239,242,245],{},[135,230,231,232,235],{},"AWS ",[39,233,234],{},"AKIA…"," samt geheimer Hälfte",[135,237,238],{},"Ja, auch Rechenzeit pro Stunde",[135,240,241],{},"Deine S3-Buckets",[135,243,244],{},"Deactivate, und das ist umkehrbar",[135,246,247],{},"Nein, du darfst zwei Keys gleichzeitig halten",[111,249,250,257,259,262,264],{},[135,251,137,252,46,255],{},[39,253,254],{},"sb_secret_",[39,256,77],{},[135,258,144],{},[135,260,261],{},"Jede Zeile in jeder Tabelle",[135,263,144],{},[135,265,266],{},"Ja, bei einem älteren Projekt",[10,268,269],{},"Zwei Anmerkungen zu dieser Tabelle, denn beide ändern, was du als Nächstes tust.",[10,271,272,273,276,277,279],{},"Ein AWS Access Key besteht aus zwei Zeichenfolgen, einer Kennung, die mit ",[39,274,275],{},"AKIA","\nbeginnt, und einer geheimen Hälfte, und AWS verlangt beide zusammen, um eine\nAnfrage zu signieren. Eine ",[39,278,275],{},"-Zeichenfolge allein in einem Bundle ist also\nnicht benutzbar, und der Grund, sie trotzdem als dringend zu behandeln, ist,\ndass die beiden Hälften fast immer gemeinsam eingefügt werden. Öffne die Datei\nund such nach der zweiten, bevor du entscheidest, in welchem Fall du bist.",[10,281,282,283,287,288,287,292,296,297,301],{},"Die Details pro Anbieter stehen beim jeweiligen Anbieter:\n",[52,284,286],{"href":285},"\u002Fblog\u002Fopenai-api-key-exposed-in-frontend","ein OpenAI-Key",",\n",[52,289,291],{"href":290},"\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend","ein Google-API-Key",[52,293,295],{"href":294},"\u002Fblog\u002Fstripe-secret-key-in-frontend","ein geheimer Stripe-Key"," und\n",[52,298,300],{"href":299},"\u002Fblog\u002Frotate-supabase-service-role-key","ein Supabase-service_role-Key",", der als\neinziger ein eigenes Verfahren hat.",[17,303,305],{"id":304},"den-key-stoppen-und-den-key-ersetzen-sind-zwei-verschiedene-knöpfe","Den Key stoppen und den Key ersetzen sind zwei verschiedene Knöpfe",[10,307,308],{},"Jeder Anbieter in dieser Tabelle gibt dir beide, und wer in Panik ist, greift\nnach dem zweiten.",[310,311,312,319,338,347],"ul",{},[313,314,315,318],"li",{},[28,316,317],{},"Google."," Einen Key einzuschränken ändert die Zeichenfolge nicht, deine App\nläuft also weiter. Ihre Sicherheitsanleitung stellt das vor alles andere:\n\"First try to restrict your API keys\", und Rotieren ist die dritte Option von\noben, für den Fall, dass eine Einschränkung nicht möglich ist.",[313,320,321,324,325,328,329,333,334,337],{},[28,322,323],{},"Stripe."," ",[28,326,327],{},"Expire key"," stoppt einen Key für sich allein, ganz ohne Ersatz.\nIhre Haltung dazu, wann man das tut, enthält kein Zögern: \"If a restricted or\nsecret API key is exposed or compromised, rotate it immediately even if you\naren't sure anyone saw it.\" Sie trennen außerdem die beiden Wörter, die alle\ndurcheinander benutzen. ",[330,331,332],"em",{},"Exposure"," ist, dass der Key irgendwo sichtbar wurde,\nwo er nicht hätte sein sollen. ",[330,335,336],{},"Compromise"," ist der Nachweis, dass ihn jemand\nbenutzt hat.",[313,339,340,324,343,346],{},[28,341,342],{},"AWS.",[28,344,345],{},"Deactivate"," ist der Schalter, und das Nützliche daran ist, dass er\nsich zurücknehmen lässt. AWS sagt, du sollst den alten Key gar nicht löschen,\nsolange du noch prüfst: \"we recommend that you do not immediately delete the\nfirst access key. Instead, choose Actions and then choose Deactivate.\" Wenn\nsich herausstellt, dass irgendetwas Vergessenes ihn noch braucht, schaltest du\nihn wieder ein.",[313,348,349,352,353,355,356,358,359,362],{},[28,350,351],{},"Supabase, bei einem älteren Projekt."," Es gibt einen Schalter, und der\nerfasst beide Legacy-Keys. ",[39,354,49],{}," und ",[39,357,77],{}," sind mit demselben\nGeheimnis signiert, wer also den einen abschaltet, den er loswerden will,\nstoppt damit auch den, den sein Frontend benutzt.\n",[52,360,361],{"href":299},"Die vier Schritte, die das vermeiden","\nliest man besser vor dem Umlegen des Schalters als danach.",[95,364],{"alt":365,"caption":366,"src":367},"Ein Schaltkasten mit zwei Schaltern. Der linke ist nach unten gelegt und bernsteinfarben gezeichnet, daneben ein durchgestrichener Schlüssel. Der rechte steht oben und ist türkis, daneben ein Schlüssel und ein Pfeil, der zu einem funktionierenden App-Fenster führt.","Zwei Schalter, und nur der linke schließt das Loch. Zu welchem du zuerst greifst, ist die Entscheidung, um die es in diesem Artikel geht.","\u002Fblog\u002Fapi-key-leaked-what-to-do\u002Ftwo-switches-1600x600.png",[17,369,371],{"id":370},"das-log-für-den-zeitraum-lesen-in-dem-der-key-draußen-war","Das Log für den Zeitraum lesen, in dem der Key draußen war",[10,373,374],{},"Das Fenster öffnet sich mit dem Deploy, der den Key zuerst ausgeliefert hat, und\nschließt sich, als du ihn gestoppt hast. Auf diesen Zeitraum filterst du das Log\ndes Anbieters.",[10,376,377,378,381],{},"Jeder Anbieter in der Tabelle führt eines. Stripe zeigt Request-Logs für einen\neinzelnen Key, über das Überlaufmenü neben diesem Key auf der Seite mit den API\nKeys. AWS setzt ohne jede Einrichtung ein Datum der letzten Nutzung an jeden\nAccess Key in der IAM-Konsole und protokolliert die Aufrufe selbst in CloudTrail.\nGoogle zeichnet die Nutzung pro Key in der Cloud Console auf, und genau das sagt\nihre eigene Anleitung dir auch, bevor du irgendetwas an einem Key änderst.\nSupabase führt API- und Datenbank-Logs für das Projekt, und\n",[52,379,380],{"href":299},"wie man das Fenster bei einem Supabase-Key eingrenzt","\nsagt, wonach man darin sucht.",[10,383,384],{},"Du suchst nach Verkehr, den du nicht erklären kannst: Anfragen an Tabellen oder\nEndpunkte, die deine App nie anfasst, Volumen zu Zeiten, in denen niemand sie\nbenutzt hat, Löschungen, die niemand gemacht hat. Danach schau dir die Daten\nselbst an, denn eine Supportnachricht über einen Datensatz, der sich von allein\ngeändert hat, ist die Art, wie das meiste davon tatsächlich entdeckt wird, und\nsie trifft Wochen später ein.",[10,386,387],{},"Oft kannst du es nicht mit Sicherheit sagen, und Stripe sagt dasselbe über die\neigene Erkennung: \"Stripe doesn't guarantee detection of all exposed or\ncompromised keys.\" Also ist \"nichts im Log\" ein Ergebnis, und es lohnt sich, es\nmit dem Zeitraum daneben aufzuschreiben.",[17,389,391],{"id":390},"rotieren-ohne-die-app-lahmzulegen","Rotieren, ohne die App lahmzulegen",[10,393,394],{},"Drei der vier Anbieter oben geben dir ein Fenster, in dem der alte und der neue\nKey beide funktionieren, und genau das verhindert einen Ausfall.",[10,396,397,399,400,403],{},[28,398,323],{}," \"When you rotate a key in the Dashboard, both the old and new keys\nwork for up to 7 days.\" Der Dialog hat außerdem eine Option ",[28,401,402],{},"Now",", und ihre\nDokumentation ist eindeutig: Wer sie wählt, bei dem wird der alte Key gelöscht.\nDas ist der Knopf für den Notfall mit Zähler statt für eine saubere Migration.\nIhr Rat, wann man den alten gehen lässt, ist eine Messung statt eines Datums:\nPrüf seine Request-Logs und lass ihn erst auslaufen, wenn sein Anfragevolumen\nein paar Stunden oder Tage lang bei null lag.",[10,405,406,408],{},[28,407,317],{}," Beim Rotieren entsteht der neue Key mit allen Einschränkungen des\nalten, und in ihren Worten: \"both the old and new key are accepted\", solange du\ndeine Apps hinüberziehst. Wenn du den alten zu früh löschst und etwas kaputt\ngeht, gibt es einen Weg zurück: Ein gelöschter Google-API-Key lässt sich\ninnerhalb von 30 Tagen wiederherstellen.",[10,410,411,413],{},[28,412,342],{}," Die Reihenfolge steht in ihrer Dokumentation und sie beginnt beim neuen\nKey: Leg den zweiten Access Key an, solange der erste noch aktiv ist, zieh jede\nAnwendung darauf um, prüf das Datum der letzten Nutzung am alten, deaktiviere\nihn, und lösch ihn erst dann. Eine Obergrenze, mit der du planen musst: Ein\nIAM-Benutzer darf höchstens zwei Access Keys halten, eine dritte Anwendung auf\neinem alten Key hat also keinen Platz.",[10,415,416,418,419,355,421,423],{},[28,417,351],{}," Kein Fenster. Das direkte Rotieren der\nLegacy-Keys ",[39,420,49],{},[39,422,77],{}," wird nicht mehr unterstützt, einen davon\nungültig zu machen ist also eine Migration auf das neue Key-Paar, und die\nReihenfolge der vier Schritte ist das, was die App am Laufen hält.",[17,425,427],{"id":426},"er-steht-immer-noch-in-deiner-git-historie","Er steht immer noch in deiner Git-Historie",[10,429,430],{},"Das tut er, und die GitHub-Dokumentation dazu beginnt damit, dich zu etwas\nanderem zu schicken.",[10,432,433],{},"Ihre Seite zum Entfernen sensibler Daten verweist dich zurück auf den Key: \"if\nthe sensitive data you need to remove is a secret (e.g.\npassword\u002Ftoken\u002Fcredential), as is often the case, then as a first step you need\nto revoke and\u002For rotate that secret\", und dann: \"Once the secret is revoked or\nrotated, it can no longer be used for access, and that may be sufficient to\nsolve your problem. Going through the extra steps to rewrite the history and\nremove the secret may not be warranted.\"",[10,435,436],{},"Der Grund dafür ist das, was ein Force Push nicht erreicht. Nachdem du deine\nHistorie umgeschrieben hast, stehen die alten Commits immer noch \"In any clones\nor forks of your repository\" und \"Directly via their SHA-1 hashes in cached\nviews on GitHub\". Der Support kann die Cache-Ansichten und die Verweise in Pull\nRequests löschen, wenn du fragst, und zieht dabei seine eigene Grenze: Er \"will\nonly assist in the removal of sensitive data in cases where we determine that\nthe risk can't be mitigated by rotating affected credentials.\" Ein Fork behält\nseine Kopie so oder so, und GitHub kann dir die Kontaktdaten seines Besitzers\nnicht geben.",[10,438,439],{},"Die Reihenfolge, die sie beschreiben, ist also die praktische: den Key\nwiderrufen und danach entscheiden, ob das Umschreiben der Historie die\nNebenwirkungen wert ist. Widerrufen erreicht Kopien, die ein Umschreiben nicht\nerreicht, darunter die in einem Clone, von dem du nichts weißt, und die in einem\nScreenshot, den jemand behalten hat.",[95,441],{"alt":442,"caption":443,"src":444},"Drei gleiche, blasse Dokumente, ein Fork, der Clone von jemandem und eine Cache-Ansicht, und jedes hält immer noch denselben bernsteinfarbenen Schlüssel. Eine einzige türkise Linie läuft quer durch das Bild und streicht alle drei Schlüssel durch.","Derselbe Schlüssel, in drei Kopien, die du nicht löschen kannst. Ihn zu widerrufen streicht alle drei auf einmal durch.","\u002Fblog\u002Fapi-key-leaked-what-to-do\u002Fone-line-covers-every-copy-1600x520.png",[17,446,448],{"id":447},"wie-der-nächste-gar-nicht-erst-in-den-bundle-kommt","Wie der nächste gar nicht erst in den Bundle kommt",[10,450,451,454],{},[28,452,453],{},"Ein Key kommt über einen Deploy in deinen Bundle, und Deploys hören nicht\nauf."," Jeder davon ist eine weitere Gelegenheit, dass ein Wert, den du in ein\nSecrets-Feld eingetragen hast, in einer Datei landet, die der Browser\nherunterlädt. Deshalb beschreibt eine Prüfung von letztem Monat die App von\nletztem Monat.",[10,456,457],{},[28,458,459,462],{},[52,460,461],{"href":62},"Unser kostenloser Scan"," beantwortet die Frage, mit der du\nhergekommen bist.",[310,464,465,468,471],{},[313,466,467],{},"die neun Prüfungen gegen deine Live-URL, in rund 20 Sekunden",[313,469,470],{},"jeder Key, den er von außen sieht, jeweils eingeordnet statt nur gefunden",[313,472,473],{},"eine Note und die Funde, ohne Konto",[10,475,476],{},[28,477,478,482],{},[52,479,481],{"href":480},"\u002Fpricing","Reeve Monitor"," führt diese Prüfungen erneut aus, ohne dass du\nfragst.",[310,484,485,488,495,498],{},[313,486,487],{},"alle neun Prüfungen jede Stunde, für bis zu drei Apps",[313,489,490,491,494],{},"eine Nachricht, wenn sich ein Ergebnis ",[28,492,493],{},"ändert",", damit der Key aus dem\nDeploy von letzter Nacht nicht darauf wartet, dass du nachsiehst",[313,496,497],{},"ob die App erreichbar ist, alle 60 Sekunden",[313,499,500],{},"ein monatlicher Bericht darüber, was er gesehen hat",[10,502,503],{},[28,504,505,509],{},[52,506,508],{"href":507},"\u002Fsupabase-backups","Reeve Care"," hält eine Kopie deiner Supabase-Datenbank\nbereit, für die Keys, die schreiben können.",[310,511,512,515,518,521,524],{},[313,513,514],{},"jede Nacht eine verschlüsselte Kopie, verwahrt dort, wo dein Projekt nicht\nhinkommt",[313,516,517],{},"jede Kopie wird geprüft, bevor sie zählt, indem die Zeilen jeder Tabelle\ngezählt werden",[313,519,520],{},"eine Wiederherstellung mit einem Klick, wenn du sie brauchst",[313,522,523],{},"auch deine hochgeladenen Dateien, sobald du eine Storage-Zugangsberechtigung\nverbindest",[313,525,526],{},"alles, was Monitor tut",[10,528,529,530,532,533,537],{},"Ein geleakter Key, der nur lesen kann, lässt deine Daten dort, wo sie waren. Ein\n",[39,531,77],{},"-Key oder ein AWS-Key mit Schreibrechten kann eine Tabelle leeren,\nund kein noch so gründliches Rotieren danach bringt die Zeilen zurück.\n",[52,534,536],{"href":535},"\u002Fblog\u002Fai-agent-deleted-my-database","Der Tag, an dem ein KI-Agent eine Produktionsdatenbank gelöscht hat","\nzeigt, wie sich das von innen anfühlt.",[17,539,541],{"id":540},"was-du-jetzt-tun-solltest","Was du jetzt tun solltest",[543,544,545],"key-takeaways",{},[310,546,547,558,561,570,573,576],{},[313,548,549,550,46,552,554,555,557],{},"Erkenn den Key, bevor du ihn anfasst. Ein Supabase-Key ",[39,551,49],{},[39,553,45],{}," und ein Stripe-Key ",[39,556,41],{}," gehören dorthin, wo sie sind, und von den 1.332 Apps, bei denen wir einen meldenswerten Key gefunden haben, hatten 1.142 einen Google-API-Key, der eine Einschränkung statt einer Rotation braucht.",[313,559,560],{},"Frag, ob ein Zähler daran hängt. Wenn die Anfragen von jemand anderem auf deiner Rechnung landen, stopp den Key jetzt und lass die Funktion kaputtgehen.",[313,562,563,564,566,567,569],{},"Benutz den Stopp-Schalter genauso wie den Ersatz-Schalter: ",[28,565,327],{}," bei Stripe, ",[28,568,345],{}," bei AWS, eine Website- und API-Einschränkung bei Google.",[313,571,572],{},"Ersetz ihn dann innerhalb des Fensters, das der Anbieter gibt. Stripe gibt dir sieben Tage mit beiden Keys live, Google akzeptiert beide, solange du migrierst, und AWS lässt dich zwei Access Keys gleichzeitig halten.",[313,574,575],{},"Lies das Log des Anbieters für den Zeitraum zwischen dem Deploy und dem Stopp und schreib auf, was du gefunden hast, auch wenn es \"nichts\" ist.",[313,577,578],{},"Lass die Git-Historie bis zum Schluss. Sobald der Key widerrufen ist, sagt GitHubs eigene Anleitung, dass sich das Umschreiben der Historie womöglich gar nicht lohnt.",[10,580,581,582,586],{},"Wenn du das Ganze lieber als Liste durchgehst: Die\n",[52,583,585],{"href":584},"\u002Fchecklist","Sicherheits-Checkliste in 10 Minuten"," deckt das hier und die\nanderen Dinge ab, die man in einer frisch gestarteten App abschalten sollte.",{"title":588,"searchDepth":589,"depth":589,"links":590},"",3,[591,593,594,595,596,597,598,599,600],{"id":19,"depth":592,"text":20},2,{"id":67,"depth":592,"text":68},{"id":102,"depth":592,"text":103},{"id":304,"depth":592,"text":305},{"id":370,"depth":592,"text":371},{"id":390,"depth":592,"text":391},{"id":426,"depth":592,"text":427},{"id":447,"depth":592,"text":448},{"id":540,"depth":592,"text":541},"Sicherheitsgrundlagen","\u002Fblog\u002Fapi-key-leaked-what-to-do\u002Fcover-1200x630.png","Eine Zugangskarte mit einem Schlüssel darauf, vor einem Schaltkasten, dessen erster Schalter nach unten in die Aus-Stellung gelegt ist.","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.",false,"md",[608,610,613,616,619],{"q":68,"a":609},"Klär, ob der Key Geld ausgeben kann. Ein Key, der dir pro Anfrage etwas berechnet, kostet dich genau jetzt etwas, also stopp ihn sofort und nimm in Kauf, dass die Funktion dahinter ein paar Minuten lang kaputt ist. Ein Key, der nur Daten liest, ist längst gelesen worden, wenn er öffentlich war. Dann nimm dir die Zeit, den Austausch in einer Reihenfolge zu machen, die dich nicht aus deiner eigenen App aussperrt.",{"q":611,"a":612},"Zuerst widerrufen oder zuerst rotieren?","Zuerst widerrufen, wenn an dem Key ein Zähler hängt. Den alten Key stoppen und einen neuen ausstellen sind bei jedem Anbieter zwei getrennte Schalter, und nur der erste schließt das Loch. Die Ausnahme ist ein Key, den du stattdessen einschränken kannst: Google sagt dir, du sollst es bei einem Google-API-Key erst mit einer Website- und einer API-Einschränkung versuchen, bevor du ihn überhaupt rotierst.",{"q":614,"a":615},"Wie erkenne ich, ob jemand meinen Key benutzt hat?","Grenz das Fenster auf die Zeit zwischen dem Deploy, der den Key ausgeliefert hat, und dem Moment ein, in dem du ihn gestoppt hast, und lies das Log des Anbieters für diesen Zeitraum. Stripe zeigt Request-Logs pro Key, AWS zeigt ein Datum der letzten Nutzung am Access Key und protokolliert die Aufrufe in CloudTrail, Google zeichnet die Nutzung pro Key auf, und Supabase führt API- und Datenbank-Logs. Du suchst nach Anfragen an Dinge, die deine App nie anfasst, und nach Verkehr zu Zeiten, in denen niemand die App benutzt hat. Oft kannst du es nicht mit Sicherheit sagen, und das ist ein normales Ergebnis.",{"q":617,"a":618},"Geht meine App kaputt, wenn ich den Key rotiere?","Meistens nicht, wenn du das Fenster nutzt, das der Anbieter dir gibt. Bei Stripe funktionieren alter und neuer Key bis zu sieben Tage lang gemeinsam. Google stellt den neuen Key mit den Einschränkungen des alten aus und akzeptiert beide, solange du migrierst. Bei AWS darfst du zwei Access Keys gleichzeitig halten, der neue ist also schon live, bevor der alte geht. Die Ausnahme ist ein älteres Supabase-Projekt: dort nimmt der Schalter, der die Legacy-Keys abschaltet, deinen Frontend-Key mit.",{"q":620,"a":621},"Der Key steht in meiner Git-Historie. Reicht es, die Datei zu löschen?","Nein, und die Historie umzuschreiben ist wahrscheinlich auch nicht die Antwort. Die GitHub-Dokumentation sagt, du sollst das Geheimnis zuerst widerrufen oder rotieren, und dass sich der zusätzliche Aufwand, die Historie umzuschreiben, danach oft nicht mehr lohnt. Ein Force Push erreicht die Kopien in Forks und Clones nicht und die über den Commit-Hash erreichbaren Cache-Ansichten auch nicht. Den Key unbrauchbar zu machen deckt jede Kopie auf einmal ab.","\u002Fblog\u002Fapi-key-leaked-what-to-do\u002Fcard-800x500.png",[624,625,626,627,628,629,630,631],"api key geleakt was tun","api key geleakt","api key öffentlich","api key kompromittiert","api key rotieren","api key auf github gefunden","api key im frontend gefunden","was kann jemand mit meinem api key machen",{},true,"API-Key geleakt. Was zuerst zu tun ist","\u002Fblog\u002Fapi-key-leaked-what-to-do","2026-10-09",{"title":5,"description":604},"blog\u002Fapi-key-leaked-what-to-do",[640,641,642,643],"Wenn ein API-Key geleakt wurde, hängt der erste Schritt davon ab, welcher Key es ist. Publishable Keys gehören in dein Frontend und brauchen gar nichts.","Bei einem echten Geheimnis klär zuerst, ob der Key Geld ausgeben kann. Das ist der einzige Teil hier, an dem eine Uhr läuft.","Einen Key stoppen und einen Key ersetzen sind bei jedem Anbieter zwei verschiedene Schalter, und die meisten geben dir ein Fenster, in dem beide Keys funktionieren.","Danach liest du das Log des Anbieters für den Zeitraum, in dem der Key draußen war, und lässt deine Git-Historie in Ruhe, bis der Key tot ist.","ocW1bqIE6Fnv7i3FaaFXFirbB1f8KSr9rUELXmWYkic",[646,652,658,659,665,671,677,683,689,695,701,707,713,719,726,732,738,743,749,755,761,767,773,779,784,790,796,802,808,814,820,826,832,838,844,849,855,861,867,873,878,884,890,896,902,908,914,920,926,932,938,944,949,954,960,965,971,977,983,988,994],{"path":647,"title":648,"description":649,"published":650,"category":601,"image":651,"draft":605},"\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":653,"title":654,"description":655,"published":656,"category":601,"image":657,"draft":605},"\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":635,"title":5,"description":604,"published":636,"category":601,"image":622,"draft":605},{"path":660,"title":661,"description":662,"published":663,"category":601,"image":664,"draft":605},"\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":666,"title":667,"description":668,"published":669,"category":601,"image":670,"draft":605},"\u002Fblog\u002Fno-api-key-found-in-request","\"No API key found in request\" in Supabase, und die falsche Lösung","\"No API key found in request\" heißt, deine Supabase-Anfrage kam ohne Schlüssel an. Die meisten Antworten zeigen stattdessen auf deine Datenbankregeln.","2026-10-07","\u002Fblog\u002Fno-api-key-found-in-request\u002Fcard-800x500.png",{"path":672,"title":673,"description":674,"published":675,"category":601,"image":676,"draft":605},"\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":678,"title":679,"description":680,"published":681,"category":601,"image":682,"draft":605},"\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":684,"title":685,"description":686,"published":687,"category":601,"image":688,"draft":605},"\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":690,"title":691,"description":692,"published":693,"category":601,"image":694,"draft":605},"\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":696,"title":697,"description":698,"published":699,"category":601,"image":700,"draft":605},"\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":702,"title":703,"description":704,"published":705,"category":601,"image":706,"draft":605},"\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":708,"title":709,"description":710,"published":711,"category":601,"image":712,"draft":605},"\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":714,"title":715,"description":716,"published":717,"category":601,"image":718,"draft":605},"\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":720,"title":721,"description":722,"published":723,"category":724,"image":725,"draft":605},"\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":727,"title":728,"description":729,"published":730,"category":724,"image":731,"draft":605},"\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":733,"title":734,"description":735,"published":736,"category":724,"image":737,"draft":605},"\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":739,"title":740,"description":741,"published":736,"category":601,"image":742,"draft":605},"\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":744,"title":745,"description":746,"published":747,"category":601,"image":748,"draft":605},"\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":750,"title":751,"description":752,"published":753,"category":601,"image":754,"draft":605},"\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":756,"title":757,"description":758,"published":759,"category":724,"image":760,"draft":605},"\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":762,"title":763,"description":764,"published":765,"category":601,"image":766,"draft":605},"\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":768,"title":769,"description":770,"published":771,"category":601,"image":772,"draft":605},"\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":774,"title":775,"description":776,"published":777,"category":601,"image":778,"draft":605},"\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":294,"title":780,"description":781,"published":782,"category":601,"image":783,"draft":605},"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":785,"title":786,"description":787,"published":788,"category":601,"image":789,"draft":605},"\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":791,"title":792,"description":793,"published":794,"category":601,"image":795,"draft":605},"\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":797,"title":798,"description":799,"published":800,"category":601,"image":801,"draft":605},"\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":803,"title":804,"description":805,"published":806,"category":601,"image":807,"draft":605},"\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":809,"title":810,"description":811,"published":812,"category":724,"image":813,"draft":605},"\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":815,"title":816,"description":817,"published":818,"category":724,"image":819,"draft":605},"\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":821,"title":822,"description":823,"published":824,"category":724,"image":825,"draft":605},"\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":827,"title":828,"description":829,"published":830,"category":601,"image":831,"draft":605},"\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":833,"title":834,"description":835,"published":836,"category":601,"image":837,"draft":605},"\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":839,"title":840,"description":841,"published":842,"category":601,"image":843,"draft":605},"\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":299,"title":845,"description":846,"published":847,"category":601,"image":848,"draft":605},"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":850,"title":851,"description":852,"published":853,"category":601,"image":854,"draft":605},"\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":856,"title":857,"description":858,"published":859,"category":601,"image":860,"draft":605},"\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":862,"title":863,"description":864,"published":865,"category":601,"image":866,"draft":605},"\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":868,"title":869,"description":870,"published":871,"category":601,"image":872,"draft":605},"\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":285,"title":874,"description":875,"published":876,"category":601,"image":877,"draft":605},"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":879,"title":880,"description":881,"published":882,"category":601,"image":883,"draft":605},"\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":885,"title":886,"description":887,"published":888,"category":724,"image":889,"draft":605},"\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":891,"title":892,"description":893,"published":894,"category":601,"image":895,"draft":605},"\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":897,"title":898,"description":899,"published":900,"category":724,"image":901,"draft":605},"\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":903,"title":904,"description":905,"published":906,"category":601,"image":907,"draft":605},"\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":909,"title":910,"description":911,"published":912,"category":601,"image":913,"draft":605},"\u002Fblog\u002Fwhere-to-find-supabase-api-keys","Wo du deine Supabase API-Keys findest: anon, service_role, URL","Projekt-URL, anon-Schlüssel und service_role-Schlüssel liegen auf einer Seite im Dashboard. Wo sie ist, und welcher der vier Werte in deine App gehört.","2026-08-28","\u002Fblog\u002Fwhere-to-find-supabase-api-keys\u002Fcard-800x500.png",{"path":915,"title":916,"description":917,"published":918,"category":601,"image":919,"draft":605},"\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":921,"title":922,"description":923,"published":924,"category":601,"image":925,"draft":605},"\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":927,"title":928,"description":929,"published":930,"category":724,"image":931,"draft":605},"\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":933,"title":934,"description":935,"published":936,"category":724,"image":937,"draft":605},"\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":939,"title":940,"description":941,"published":942,"category":601,"image":943,"draft":605},"\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":290,"title":945,"description":946,"published":947,"category":601,"image":948,"draft":605},"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":535,"title":950,"description":951,"published":952,"category":724,"image":953,"draft":605},"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":955,"title":956,"description":957,"published":958,"category":601,"image":959,"draft":605},"\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":961,"title":962,"description":963,"published":958,"category":601,"image":964,"draft":605},"\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":966,"title":967,"description":968,"published":969,"category":601,"image":970,"draft":605},"\u002Fblog\u002Fsupabase-new-api-keys","Supabases neue API-Schlüssel: welcher gehört in deine App?","Supabase hat anon und service_role durch öffentliche und geheime Schlüssel ersetzt. Welcher gehört in deine App, und welcher nie?","2026-08-12","\u002Fblog\u002Fsupabase-new-api-keys\u002Fcard-800x500.png",{"path":972,"title":973,"description":974,"published":975,"category":724,"image":976,"draft":605},"\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":978,"title":979,"description":980,"published":981,"category":601,"image":982,"draft":605},"\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":984,"title":985,"description":986,"published":981,"category":724,"image":987,"draft":605},"\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":989,"title":990,"description":991,"published":992,"category":724,"image":993,"draft":605},"\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":54,"title":995,"description":996,"published":992,"category":601,"image":997,"draft":605},"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]