[{"data":1,"prerenderedAt":663},["ShallowReactive",2],{"blog-de-what-secrets-leak-from-vibe-coded-apps":3,"blog-index-de":422},{"id":4,"title":5,"body":6,"category":381,"cover":382,"coverAlt":383,"description":384,"draft":385,"extension":386,"faq":387,"image":403,"keywords":404,"meta":410,"navigation":411,"ogTitle":412,"path":413,"published":414,"seo":415,"stem":416,"tldr":417,"updated":414,"__hash__":421},"blog_de\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps.md","API-Schlüssel im Frontend: was 30.998 Apps wirklich ausliefern",{"type":7,"value":8,"toc":369},"minimark",[9,13,16,21,24,33,45,49,52,59,69,75,86,90,93,180,183,189,200,208,212,218,238,243,249,253,256,270,278,282,300,309,312,327,331,357],[10,11,12],"p",{},"Jemand öffnet deine App, drückt F12 und sagt dir, dass ein API-Schlüssel in\ndeinem Frontend offenliegt. Das Wort dafür ist meistens „geleakt\". Welcher\nSchlüssel es ist, sagt kaum jemand dazu, und die Ratgeber, die du danach\nfindest, behandeln alle als denselben Notfall.",[10,14,15],{},"Es ist nicht derselbe Notfall, und wir können den Abstand inzwischen beziffern.\nZwischen dem 12. und 14. August 2026 haben wir neun externe Prüfungen über\n30.998 live erreichbare Apps laufen lassen, gebaut mit Lovable, Bolt, v0, Replit\nund Base44, und das JavaScript gelesen, das jede davon an einen Browser\nausliefert. Das war darin.",[17,18,20],"h2",{"id":19},"ist-ein-api-schlüssel-im-frontend-wirklich-ein-problem","Ist ein API-Schlüssel im Frontend wirklich ein Problem?",[10,22,23],{},"Meistens nicht, und die Verteilung dieses „meistens\" ist schiefer, als wir\nerwartet hatten.",[10,25,26,27,32],{},"Wir fanden einen nennenswerten Schlüssel in 1.332 der 30.998 Apps. In 1.080\ndavon war das Einzige, was wir fanden, ein Google-API-Schlüssel, also genau die\nZugangsdaten, die\n",[28,29,31],"a",{"href":30},"\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend","in deiner Seite stehen sollen",". Was\ndiesen einen schützt, ist eine Einstellung auf Googles Seite, und Verstecken war\nnie Teil der Abmachung.",[10,34,35,36,40,41,44],{},"Die übrigen 29.666 Apps lieferten nichts aus, was unsere Geheimnis-Prüfung als\nProblem behandelt. Diese Zahl braucht eine Einschränkung, um ehrlich zu sein.\nVeröffentlichbare Schlüssel sind darin nicht enthalten: Ein Supabase-",[37,38,39],"code",{},"anon","- oder\nein Stripe-",[37,42,43],{},"pk_","-Schlüssel gehört in den Browser, wir markieren ihn also als\netwas, das du richtig gemacht hast, und er geht in diese Zählung nie ein.",[17,46,48],{"id":47},"was-wir-gezählt-haben-und-was-nicht","Was wir gezählt haben und was nicht",[10,50,51],{},"Wir haben jede App so geladen, wie ein Besucher es tut, in einem echten Browser,\nund das heruntergeladene JavaScript gelesen. Alles Folgende ist eine Form, die in\ndiesem Code stand.",[10,53,54,58],{},[55,56,57],"strong",{},"Wir erkennen Schlüsselformate, die wir kennen."," Stripe, OpenAI, Anthropic,\nAWS, Google und Supabase haben erkennbare Präfixe, und ein Supabase-JWT nennt\nseine eigene Rolle im mittleren Abschnitt als lesbaren Text. Zugangsdaten in\neinem Format, das wir nicht kennen, stehen nicht in diesen Zahlen, lies sie also\nals Untergrenze.",[10,60,61,64,65,68],{},[55,62,63],{},"Wir haben keinen gefundenen Schlüssel benutzt."," Kein einziges Mal, bei keiner\nApp. Wir haben den Typ und einen maskierten Hinweis der Form ",[37,66,67],{},"sk_live_…a1b2","\nnotiert, und der echte Wert wurde nirgends aufgeschrieben.",[10,70,71,74],{},[55,72,73],{},"Keine App wird genannt."," Nicht hier, nicht im Datensatz, nirgends, wo wir\nveröffentlichen.",[10,76,77,80,81,85],{},[55,78,79],{},"Fast alle davon sind Apps auf der Publish-Domain eines Builders."," Die\nvollständige Methode, die Stichprobe und jede Zahl hinter diesem Artikel stehen\nin ",[28,82,84],{"href":83},"\u002Fresearch\u002Fvibe-coded-app-security-2026","unserem Scan-Bericht",",\neinschließlich dessen, was wir nicht messen konnten.",[17,87,89],{"id":88},"was-die-30998-apps-tatsächlich-auslieferten","Was die 30.998 Apps tatsächlich auslieferten",[10,91,92],{},"Eine Tabelle, sortiert danach, wie oft wir das Jeweilige gesehen haben. Die\nGeheimnis-Prüfung wurde bei allen 30.998 Apps abgeschlossen, jede Zahl unten\nbezieht sich also auf alle.",[94,95,96,109],"table",{},[97,98,99],"thead",{},[100,101,102,106],"tr",{},[103,104,105],"th",{},"Was wir im Browser-Code gefunden haben",[103,107,108],{},"Apps",[110,111,112,121,129,137,145,153,165,172],"tbody",{},[100,113,114,118],{},[115,116,117],"td",{},"Google-API-Schlüssel",[115,119,120],{},"1.142",[100,122,123,126],{},[115,124,125],{},"Ein Wert mit hoher Entropie neben einem Namen wie „secret\"",[115,127,128],{},"204",[100,130,131,134],{},[115,132,133],{},"OpenAI-Schlüssel",[115,135,136],{},"33",[100,138,139,142],{},[115,140,141],{},"AWS-Zugriffsschlüssel",[115,143,144],{},"9",[100,146,147,150],{},[115,148,149],{},"Anthropic-Schlüssel",[115,151,152],{},"5",[100,154,155,162],{},[115,156,157,158,161],{},"Supabase-",[37,159,160],{},"service_role","-Schlüssel",[115,163,164],{},"3",[100,166,167,170],{},[115,168,169],{},"Geheimer Stripe-Schlüssel",[115,171,164],{},[100,173,174,177],{},[115,175,176],{},"Eingeschränkter Stripe-Schlüssel",[115,178,179],{},"2",[10,181,182],{},"Die Zeilen ergeben zusammen mehr als 1.332, weil eine App zwei davon tragen\nkann. Sortiert man dieselben 1.332 Apps in Gruppen, die sich nicht überschneiden,\nwird das Bild noch deutlicher: 1.080 hatten einen Google-Schlüssel und sonst\nnichts, 198 hatten einen Wert mit hoher Entropie, der echte Zugangsdaten sein\nkann oder auch nicht, und 54 hatten einen Schlüssel, der schon seiner Form nach\nein echtes Geheimnis ist.",[184,185],"diagram",{"alt":186,"caption":187,"src":188},"Ein einzelner breiter Balken für die 1.332 Apps, in denen ein Schlüssel gefunden wurde, in drei Teile geteilt: ein langer türkiser Abschnitt mit 1.080, ein kürzerer bernsteinfarbener mit 198 und ein schmaler roter mit 54 am rechten Ende.","Jede App, in der wir überhaupt einen Schlüssel fanden, sortiert in drei Gruppen ohne Überschneidung. Der rote Abschnitt ist der, um den es in den Warnungen geht.","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps\u002Fwhat-we-found-1600x620.png",[10,190,191,192,195,196,199],{},"Die zweite Gruppe verdient eine genaue Beschreibung. Ein Wert mit hoher Entropie\nneben einem Wort wie ",[37,193,194],{},"secret"," oder ",[37,197,198],{},"password"," kann echte Zugangsdaten sein, er\nkann aber auch eine Sitzungskennung sein, ein Build-Hash oder ein öffentliches\nToken mit einem unglücklichen Namen. Wir melden das als nachsehenswert, und von\naußen kann niemand dir sagen, was davon es ist.",[10,201,202,203,207],{},"Die 54 in der dritten Gruppe sind die echte Sache. Alle bis auf zwei bekamen die\nNote D oder F, weil ein einziger kritischer Fund die Note bei D deckelt, egal\nwas die App sonst richtig gemacht hat. Die größte einzelne Gruppe darin ist der\nOpenAI-Schlüssel mit 33, und für den\n",[28,204,206],{"href":205},"\u002Fblog\u002Fopenai-api-key-exposed-in-frontend","gibt es keine Einstellung, die ihn im Browser unbedenklich machen würde",".",[17,209,211],{"id":210},"der-schlüssel-vor-dem-alle-warnen-war-der-seltenste-fund","Der Schlüssel, vor dem alle warnen, war der seltenste Fund",[10,213,214,215,217],{},"Drei Apps. So viele lieferten einen Supabase-",[37,216,160],{},"-Schlüssel aus, also\nden, der an jeder Tabellenregel vorbeigeht, die du geschrieben hast. Ein geheimer\nStripe-Schlüssel tauchte ebenfalls dreimal auf.",[10,219,220,221,223,224,227,228,227,231,234,235,207],{},"Stell das neben die andere Hälfte desselben Durchlaufs. Von den gescannten Apps\nnannten 8.429 ein Supabase-Projekt, und beide Funde liegen innerhalb dieser einen\nGruppe. Drei davon lieferten den ",[37,222,160],{},"-Schlüssel aus. In 2.096 davon\nantwortete mindestens eine Tabelle auf eine Anfrage ganz ohne Login, und in 394\ntrug diese Tabelle einen Namen für Menschen: ",[37,225,226],{},"users",", ",[37,229,230],{},"profiles",[37,232,233],{},"customers",",\n",[37,236,237],{},"orders",[184,239],{"alt":240,"caption":241,"src":242},"Zwei Zeilen im selben Maßstab. Die obere, mit einem Schlüssel markiert, ist ein so dünner roter Streifen, dass er einen gestrichelten Ring braucht, um sichtbar zu sein, beschriftet mit 3. Die untere, mit einer Tabelle markiert, ist ein türkises Band über fast die ganze Breite, beschriftet mit 2.096.","Beide Zahlen stammen aus denselben 8.429 Supabase-Apps. Die obere Zeile ist der Fund, vor dem Betreiber gewarnt werden.","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps\u002Fwarned-about-vs-found-1600x680.png",[10,244,245,246,248],{},"Die 2.096 sind eine Untergrenze. 4.749 der 8.429 haben unsere Datenbankprüfung\nnie beantwortet, aus Gründen, die wir von außen nicht sehen, und die notieren wir\nals unbekannt statt als sauber. Die drei ",[37,247,160],{},"-Schlüssel sind eine\nexakte Zahl, weil ein Schlüssel aus Code gelesen wird, den jede App herausgibt.",[17,250,252],{"id":251},"warum-die-warnungen-auf-den-falschen-schlüssel-zeigen","Warum die Warnungen auf den falschen Schlüssel zeigen",[10,254,255],{},"Wir sehen nur die Außenseite dieser Apps, wir können dir also nicht sagen, warum.\nZeigen können wir, welcher Fehler überlebt.",[10,257,258,259,261,262,264,265,269],{},"Den falschen Supabase-Schlüssel zu kopieren ist wirklich leicht. In einem älteren\nProjekt stehen ",[37,260,39],{}," und ",[37,263,160],{}," nebeneinander im selben\nDashboard-Bereich, sie sind gleich lang und gleich geformt, und\n",[28,266,268],{"href":267},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","es geht nichts kaputt, wenn du den falschen nimmst",".\nTrotzdem passierte es nur dreimal in 30.998 Apps, weil dich nichts dorthin\ndrängt. Beide Schlüssel bringen die App zum Laufen.",[10,271,272,273,277],{},"Hinter der offenen Tabelle steht eine Kraft. Row Level Security wird\nangeschaltet, die App zeigt keine Daten mehr, eine Policy, die alle erlaubt, wird\ngeschrieben, damit es wieder geht, und von diesem Moment an meldet das Dashboard\ndie Tabelle als geschützt. Anschalten\n",[28,274,276],{"href":275},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","ist nicht dasselbe wie geschützt sein",".\nUnser Scan bewertet diese Tabelle als kritischen Fund an einem Tag, an dem dein\nDashboard dir den Schalter auf an und eine vorhandene Policy zeigt.",[17,279,281],{"id":280},"wie-du-einen-offenliegenden-api-schlüssel-kostenlos-findest","Wie du einen offenliegenden API-Schlüssel kostenlos findest",[10,283,284,285,288,289,292,293,295,296,299],{},"Fang von Hand an, das kostet fünf Minuten und braucht nichts Installiertes.\nÖffne deine Live-Seite, sieh dir den Seitenquelltext an und suche nach vier\nZeichenfolgen: ",[37,286,287],{},"AIza"," für einen Google-Schlüssel, ",[37,290,291],{},"sk_"," für ein Stripe- oder\nModellanbieter-Geheimnis, ",[37,294,160],{}," für den Supabase-Schlüssel, der deine\nRegeln ignoriert, und ",[37,297,298],{},"eyJ"," für jedes Supabase-Token. Alles, was zurückkommt,\nliegt bereits in den Händen jedes Besuchers, den du hast.",[10,301,302,303,305,306,308],{},"Damit hast du die Seite selbst. Was dabei fehlt, ist das JavaScript, das die\nSeite danach nachlädt, und genau deshalb öffnet unser eigener Scanner eine App in\neinem echten Browser und liest die Bundles statt des HTML. Die Suche von Hand\nkann dir außerdem nicht sagen, ob das gefundene ",[37,304,298],{},"-Token der ",[37,307,39],{},"-Schlüssel\noder der geheime ist, denn die beiden sind gleich lang und gleich geformt.",[10,310,311],{},"Unser kostenloser Scan deckt beides ab. Er lädt deine App in einem echten\nBrowser, liest den Code, der tatsächlich ankommt, dekodiert jedes\nSupabase-Token und meldet die darin geschriebene Rolle, sodass ein\nveröffentlichbarer Schlüssel als korrekt markiert zurückkommt und nicht in einer\nWand aus Rot verschwindet. Note, Punktzahl und die Anzahlen stehen nach etwa 20\nSekunden ohne Konto auf dem Bildschirm. Gib eine E-Mail-Adresse an, und du\nbekommst zusätzlich die ausführliche Liste, mit einer Lösung für deinen Builder,\ndie du direkt einfügen kannst.",[10,313,314,315,317,318,322,323,207],{},"Drei Dinge tut er nicht, und das sind die Gründe, warum er auf einer Live-App\ngefahrlos läuft: Er meldet sich nie an, er schreibt nie etwas, und er behält nie\neinen gefundenen Schlüssel. Ein offengelegtes Geheimnis wird als maskierter\nHinweis wie ",[37,316,67],{}," gespeichert, der echte Wert wird verworfen.\n",[28,319,321],{"href":320},"\u002F#scan","Scanne deine App",", oder lies zuerst,\n",[28,324,326],{"href":325},"\u002Fsecurity-scanner","was jede der neun Prüfungen ansieht",[17,328,330],{"id":329},"was-zu-tun-ist-in-der-reihenfolge-die-die-zahlen-nahelegen","Was zu tun ist, in der Reihenfolge, die die Zahlen nahelegen",[332,333,334],"key-takeaways",{},[335,336,337,345,348,351,354],"ul",{},[338,339,340,341,344],"li",{},"Identifiziere den Schlüssel, bevor du reagierst. Bei Stripe und bei neueren Supabase-Schlüsseln beantwortet das Präfix es; bei einem älteren Supabase-Schlüssel entscheidet das Feld ",[37,342,343],{},"role"," im Token.",[338,346,347],{},"Ist es ein Google-Schlüssel, schränke ihn ein, statt ihn zu verstecken. Websites-Beschränkung, deine Domain, nur die APIs, die du nutzt, dazu ein Tageslimit für das Kontingent. Kostenlos, etwa fünf Minuten, keine Codeänderung.",[338,349,350],{},"Ist es ein echter geheimer Schlüssel, rotiere ihn zuerst. Ihn aus dem Code zu löschen schließt nichts, denn der alte Wert steht weiterhin in deiner Versionshistorie und in zwischengespeicherten Kopien deiner Seite.",[338,352,353],{},"Geh danach deine Tabellenregeln durch, denn dort liegt laut den Zahlen die eigentliche Angriffsfläche. Fang bei den Tabellen mit Menschen an.",[338,355,356],{},"Prüfe nach jeder Offenlegung eines geheimen Schlüssels Abrechnung und Protokolle. Das Rotieren stoppt, was als Nächstes passiert, und sagt nichts darüber, was schon passiert ist.",[10,358,359,360,364,365,207],{},"Arbeite die ganze Liste in einer Sitzung durch mit der\n",[28,361,363],{"href":362},"\u002Fchecklist","10-Minuten-Sicherheitscheckliste",", die den Schlüssel und die\nTabellenregeln neben den anderen Dingen abdeckt, die in einer frisch\nveröffentlichten App zu schließen sind. Und wenn dich die Datenbankhälfte dieses\nArtikels beunruhigt: Sie hat eine eigene Erhebung,\n",[28,366,368],{"href":367},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","kann jeder deine Supabase-Datenbank lesen",{"title":370,"searchDepth":371,"depth":371,"links":372},"",3,[373,375,376,377,378,379,380],{"id":19,"depth":374,"text":20},2,{"id":47,"depth":374,"text":48},{"id":88,"depth":374,"text":89},{"id":210,"depth":374,"text":211},{"id":251,"depth":374,"text":252},{"id":280,"depth":374,"text":281},{"id":329,"depth":374,"text":330},"Sicherheitsgrundlagen","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps\u002Fcover-1200x630.png","Eine Seite App-Code mit acht hervorgehobenen schlüsselförmigen Werten, die meisten unauffällig, einer in Rot.","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.",false,"md",[388,391,394,397,400],{"q":389,"a":390},"Woran erkenne ich, ob mein API-Schlüssel geleakt ist?","Öffne deine Live-Seite, sieh dir den Seitenquelltext an und suche nach den Formen: AIza für einen Google-Schlüssel, sk_ für ein Stripe- oder Modellanbieter-Geheimnis und eyJ für ein Supabase-JWT. Alles, was dabei auftaucht, liegt bereits in den Händen jedes Besuchers. Unser kostenloser Scan macht denselben Blick von außen und meldet in etwa 20 Sekunden, was er sehen kann, ohne Konto für die Note.",{"q":392,"a":393},"Ist ein fest eingebauter API-Schlüssel immer ein Sicherheitsproblem?","Nein, und genau diese Annahme bringt Leute dazu, die Warnung irgendwann zu überhören. Manche Schlüssel werden absichtlich veröffentlicht: ein Supabase-anon-Schlüssel, ein Stripe-pk_-Schlüssel und ein Firebase-Web-Config-Schlüssel gehören alle in den Browser, und was deine Daten schützt, sind die Regeln dahinter. Ein geheimer Schlüssel ist der umgekehrte Fall und gehört auf einen Server. Das Präfix sagt dir, welchen der beiden du vor dir hast.",{"q":395,"a":396},"Jemand sagt, mein Supabase-Schlüssel sei offengelegt. Ist das der schlimme?","Mit hoher Wahrscheinlichkeit nicht. Beide Supabase-Schlüssel sehen gleich aus, lies also die Rolle im Token oder prüfe das Präfix: anon und sb_publishable_ sollen öffentlich sein, service_role und sb_secret_ nicht. Wir fanden einen service_role-Schlüssel in 3 von 30.998 Apps, die Chancen stehen also deutlich für den harmlosen. Ist es doch der geheime, rotiere ihn heute noch im Supabase-Dashboard.",{"q":398,"a":399},"Worüber sollte ich mir stattdessen Sorgen machen?","Über die Tabellenregeln in deiner Datenbank. Von den Apps, bei denen wir diese Prüfung abschließen konnten, hatte mehr als die Hälfte mindestens eine Tabelle, die auf eine Anfrage ganz ohne Login geantwortet hat, und in 394 davon trug die offene Tabelle einen Namen für Menschen: users, profiles, customers, orders. Das ist weit häufiger als jeder geleakte Schlüssel und viel leiser, weil die App in beiden Fällen genau gleich funktioniert.",{"q":401,"a":402},"Ich habe den Schlüssel aus meinem Code entfernt. Ist die Tür jetzt zu?","Nicht von allein. Der alte Wert steht weiterhin in deiner Versionshistorie und in jeder zwischengespeicherten Kopie der Seite, wer ihn also schon eingesammelt hat, kann ihn weiter benutzen. Was die Tür wirklich schließt, ist das Rotieren des Schlüssels im Dashboard des Anbieters, und das ist der erste Schritt, nicht der letzte. Danach prüfe Abrechnung und Protokolle auf Nutzung, die du nicht erklären kannst.","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps\u002Fcard-800x500.png",[405,406,407,408,409],"api-schlüssel im frontend sichtbar","geheimnisse im clientcode","api-schlüssel im code","ist mein api-schlüssel geleakt","offengelegte api-schlüssel finden",{},true,"API-Schlüssel im Frontend: 30.998 Apps gezählt","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps","2026-09-02",{"title":5,"description":384},"blog\u002Fwhat-secrets-leak-from-vibe-coded-apps",[418,419,420],"Ein API-Schlüssel im Frontend ist fast immer die harmlose Sorte. Wir fanden einen nennenswerten Schlüssel in 1.332 von 30.998 Apps, und 1.080 davon trugen nur einen Google-API-Schlüssel.","Der Supabase-Schlüssel service_role, vor dem jedes Tutorial warnt, tauchte in 3 von 30.998 Apps auf. Ein geheimer Stripe-Schlüssel ebenfalls in 3.","Schlüssel, die schon ihrer Form nach Geld ausgeben oder Daten lesen, fanden sich in 54 Apps. Eine offene Supabase-Tabelle fand sich in 2.096.","exsRTfMrU23_meInNlI3pZNrsOJ-kPoWm-m0Dp6xi1g",[423,430,436,442,448,454,460,466,472,478,484,490,496,502,508,514,520,526,532,538,544,549,550,556,562,568,574,580,586,592,598,604,610,615,621,626,631,637,643,648,653,659],{"path":424,"title":425,"description":426,"published":427,"category":428,"image":429,"draft":385},"\u002Fblog\u002Fsupabase-backup-auth-users","Warum in deinem Supabase-Dump keine Nutzer stehen","Führe supabase db dump allein aus und du bekommst die Form deiner Datenbank und keine einzige Zeile, und das auth-Schema mit deinen Nutzern fehlt ganz.","2026-09-23","Backups","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":431,"title":432,"description":433,"published":434,"category":381,"image":435,"draft":385},"\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":437,"title":438,"description":439,"published":440,"category":381,"image":441,"draft":385},"\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":443,"title":444,"description":445,"published":446,"category":381,"image":447,"draft":385},"\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":449,"title":450,"description":451,"published":452,"category":381,"image":453,"draft":385},"\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":455,"title":456,"description":457,"published":458,"category":381,"image":459,"draft":385},"\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":461,"title":462,"description":463,"published":464,"category":381,"image":465,"draft":385},"\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":467,"title":468,"description":469,"published":470,"category":381,"image":471,"draft":385},"\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":473,"title":474,"description":475,"published":476,"category":381,"image":477,"draft":385},"\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":479,"title":480,"description":481,"published":482,"category":428,"image":483,"draft":385},"\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":485,"title":486,"description":487,"published":488,"category":428,"image":489,"draft":385},"\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":491,"title":492,"description":493,"published":494,"category":428,"image":495,"draft":385},"\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":497,"title":498,"description":499,"published":500,"category":381,"image":501,"draft":385},"\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":503,"title":504,"description":505,"published":506,"category":381,"image":507,"draft":385},"\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":509,"title":510,"description":511,"published":512,"category":381,"image":513,"draft":385},"\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":515,"title":516,"description":517,"published":518,"category":381,"image":519,"draft":385},"\u002Fblog\u002Frotate-supabase-service-role-key","Geleakten Supabase-service_role-Schlüssel richtig tauschen","Supabase sagt: erst das Leck schließen. Andere Anleitungen: sofort tauschen. Was richtig ist, hängt davon ab, wohin dein service_role-Schlüssel gelangt ist.","2026-09-08","\u002Fblog\u002Frotate-supabase-service-role-key\u002Fcard-800x500.png",{"path":521,"title":522,"description":523,"published":524,"category":381,"image":525,"draft":385},"\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":527,"title":528,"description":529,"published":530,"category":381,"image":531,"draft":385},"\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":533,"title":534,"description":535,"published":536,"category":381,"image":537,"draft":385},"\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":539,"title":540,"description":541,"published":542,"category":381,"image":543,"draft":385},"\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":205,"title":545,"description":546,"published":547,"category":381,"image":548,"draft":385},"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":413,"title":5,"description":384,"published":414,"category":381,"image":403,"draft":385},{"path":551,"title":552,"description":553,"published":554,"category":428,"image":555,"draft":385},"\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":557,"title":558,"description":559,"published":560,"category":381,"image":561,"draft":385},"\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":563,"title":564,"description":565,"published":566,"category":428,"image":567,"draft":385},"\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":569,"title":570,"description":571,"published":572,"category":381,"image":573,"draft":385},"\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":575,"title":576,"description":577,"published":578,"category":381,"image":579,"draft":385},"\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":581,"title":582,"description":583,"published":584,"category":381,"image":585,"draft":385},"\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":587,"title":588,"description":589,"published":590,"category":381,"image":591,"draft":385},"\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":593,"title":594,"description":595,"published":596,"category":428,"image":597,"draft":385},"\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":599,"title":600,"description":601,"published":602,"category":428,"image":603,"draft":385},"\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":605,"title":606,"description":607,"published":608,"category":381,"image":609,"draft":385},"\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":30,"title":611,"description":612,"published":613,"category":381,"image":614,"draft":385},"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":616,"title":617,"description":618,"published":619,"category":428,"image":620,"draft":385},"\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":367,"title":622,"description":623,"published":624,"category":381,"image":625,"draft":385},"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":627,"title":628,"description":629,"published":624,"category":381,"image":630,"draft":385},"\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":632,"title":633,"description":634,"published":635,"category":381,"image":636,"draft":385},"\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":638,"title":639,"description":640,"published":641,"category":428,"image":642,"draft":385},"\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":275,"title":644,"description":645,"published":646,"category":381,"image":647,"draft":385},"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":649,"title":650,"description":651,"published":646,"category":428,"image":652,"draft":385},"\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":654,"title":655,"description":656,"published":657,"category":428,"image":658,"draft":385},"\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":267,"title":660,"description":661,"published":657,"category":381,"image":662,"draft":385},"Welche API-Schlüssel im Frontend sicher sind, und welche nicht","Dein Supabase-anon-Schlüssel darf öffentlich sein. Der service_role-Schlüssel nicht. Er ignoriert jede Regel, die du setzt. So erkennst du den Unterschied.","\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend\u002Fcard-800x500.png",1790150951364]