[{"data":1,"prerenderedAt":663},["ShallowReactive",2],{"blog-de-missing-security-headers":3,"blog-index-de":418},{"id":4,"title":5,"body":6,"category":374,"cover":375,"coverAlt":376,"description":377,"draft":378,"extension":379,"faq":380,"image":396,"keywords":397,"meta":405,"navigation":406,"ogTitle":407,"path":408,"published":409,"seo":410,"stem":411,"tldr":412,"updated":409,"__hash__":417},"blog_de\u002Fblog\u002Fmissing-security-headers.md","Fehlende Sicherheitsheader: wann sie wirklich zählen",{"type":7,"value":8,"toc":362},"minimark",[9,13,21,30,35,38,41,44,47,51,54,57,63,70,73,76,83,87,90,179,192,196,199,202,207,210,215,227,231,234,237,252,261,265,268,283,293,296,308,312,349],[10,11,12],"p",{},"Dein Scan kommt zurück und fast jede Zeile ist grün. Eine ist bernsteinfarben:\neinige Browser-Sicherheitsheader fehlen. Es ist das Einzige auf der Seite mit\neiner Farbe, also liest es sich wie die Sache, um die du dich zuerst kümmern\nmusst.",[10,14,15,16,20],{},"Hier ist der Teil, den die meisten Ratgeber dazu falsch machen. ",[17,18,19],"strong",{},"Fehlende\nSicherheitsheader ist der Befund, den wir am häufigsten ausgeben, und für sich\ngenommen sagt er dir fast nichts darüber, ob jemand an deine Daten kommt."," Ihn\nwie einen Einbruch zu behandeln heißt entweder, ihn panisch vor den Dingen zu\nbeheben, die tatsächlich entscheiden, wer deine Datenbank liest, oder zu lernen,\ndass bernsteinfarbene Zeilen Rauschen sind, was schlimmer ist.",[10,22,23,24,29],{},"Zwischen dem 12. und 14. August 2026 haben wir dieselben neun externen Prüfungen\nüber 30.998 aktive Apps laufen lassen, gebaut mit Lovable, Bolt, v0, Replit und\nBase44. Von den Apps, bei denen diese Prüfung eine Antwort bekam, fehlte 30.756\nvon 30.981 mindestens ein Header. Die vollständigen Zahlen stehen in\n",[25,26,28],"a",{"href":27},"\u002Fresearch\u002Fvibe-coded-app-security-2026","unserem Scan-Bericht",".",[31,32,34],"h2",{"id":33},"sind-fehlende-sicherheitsheader-ein-problem","Sind fehlende Sicherheitsheader ein Problem?",[10,36,37],{},"Es ist eine echte Lücke und fast immer die unwichtigste Zeile in deinem Bericht.",[10,39,40],{},"Ein Sicherheitsheader ist eine kurze Anweisung, die dein Server jeder Seite\nmitgibt, die er ausliefert, und die sich an den Browser des Besuchers richtet\nstatt an den Besucher. Lass keine andere Website diese Seite in einen Rahmen\nsetzen. Rate nicht, was für eine Art Datei das ist. Gib meine vollständige\nAdresse nicht weiter, wenn jemand auf einen Link nach draußen klickt. Es sind\nNotizen an einen Helfer, der tut, was jede Website ihm sagt.",[10,42,43],{},"Im Rest deines Berichts geht es um Schlösser. Ob Row Level Security an ist, ob\nein geheimer Schlüssel in deinem Code liegt, ob ein Storage-Bucket seinen Inhalt\nauflistet: das entscheidet, wer überhaupt an deine Daten kommt. Notizen und\nSchlösser will man beide haben, und die Notiz, die du nie geschrieben hast, ist\nnicht der Grund, warum Leute eine Datenbank verlieren.",[10,45,46],{},"Unsere Bewertung behandelt das genauso. Ein fehlender Header zieht fünf Punkte\nvon hundert ab und deckelt nichts, also kommt eine App, deren einziger Befund\ndieser ist, mit 95 und der Note A heraus.",[31,48,50],{"id":49},"was-wir-in-30998-apps-gefunden-haben","Was wir in 30.998 Apps gefunden haben",[10,52,53],{},"Fehlende Header tauchten fast überall auf, und sie bewegten sich kaum mit dem\nRest des Berichts.",[10,55,56],{},"25.821 dieser Apps bekamen von allen neun Prüfungen eine Antwort, und das ist\ndie Gruppe, in der \"sonst war nichts\" etwas bedeutet. Von ihnen fehlte 25.606\nmindestens ein Header, und 215 hatten alle fünf.",[58,59],"diagram",{"alt":60,"caption":61,"src":62},"Ein Raster aus vier Zahlen. Die Zeilen stehen für den Header-Befund, gezeichnet als gefüllter Balken für vorhanden und als leerer gestrichelter Balken für fehlend. Die Spalten stehen für den Rest des Berichts, ein Haken für nichts gefunden und ein Kreuz für etwas gefunden. Obere Zeile: 70 und 145. Untere Zeile: 17.043 und 8.563.","Apps mit fehlenden Headern hatten nicht häufiger etwas anderes im Argen als Apps, die alle fünf hatten.","\u002Fblog\u002Fmissing-security-headers\u002Fdoes-it-predict-anything-1600x900.png",[10,64,65,66,69],{},"Von den 25.606 Apps, denen mindestens ein Header fehlte, ",[17,67,68],{},"hatten 17.043 sonst\nüberhaupt nichts",". Zwei von drei. Es war das einzige Problem in ihrem Bericht.",[10,71,72],{},"Lies jetzt die andere Zeile, und das ist der Teil, der uns überrascht hat. Von\nden 215 Apps, die alle fünf Header gesetzt hatten, hatten 145 etwas anderes im\nArgen. Das ist eine höhere Rate echter Probleme als bei den Apps mit fehlenden\nHeadern, keine niedrigere.",[10,74,75],{},"Wir haben nicht gemessen, warum, und die ehrliche Lesart ist eng: was diese\nScans sonst noch fanden, der Header-Befund hat es nicht vorhergesagt. Eine App\nmit einem perfekten Satz Header war in unseren Daten keine sicherere App. Die\nwahrscheinlichste Erklärung ist, dass Header überhaupt zu setzen bedeutet, dass\njemand einen echten Host konfiguriert hat, was meist eine größere App bedeutet,\nbei der mehr schiefgehen kann, aber das ist eine Vermutung und wir haben sie\nnicht geprüft.",[10,77,78,79,29],{},"Wenn du sehen willst, welche dieser Zeilen deine eigene App erzeugt: der Scan\nist kostenlos, dauert etwa 20 Sekunden und braucht kein Konto.\n",[25,80,82],{"href":81},"\u002Fsecurity-scanner","App scannen",[31,84,86],{"id":85},"was-jeder-header-tatsächlich-tut","Was jeder Header tatsächlich tut",[10,88,89],{},"Jeder schaltet ein Browser-Verhalten ab, das standardmäßig an ist.",[91,92,93,109],"table",{},[94,95,96],"thead",{},[97,98,99,103,106],"tr",{},[100,101,102],"th",{},"Header",[100,104,105],{},"Was er dem Browser sagt",[100,107,108],{},"Was seine Abwesenheit erlaubt",[110,111,112,127,140,153,166],"tbody",{},[97,113,114,121,124],{},[115,116,117],"td",{},[118,119,120],"code",{},"Content-Security-Policy",[115,122,123],{},"Von welchen Orten diese Seite Code und Styles laden darf",[115,125,126],{},"Ein eingeschleustes Skript kann Daten überallhin schicken",[97,128,129,134,137],{},[115,130,131],{},[118,132,133],{},"Strict-Transport-Security",[115,135,136],{},"Komm immer über HTTPS zurück, nie über einfaches HTTP",[115,138,139],{},"Ein Besuch in einem unsicheren Netz kann auf einfaches HTTP heruntergedrückt werden",[97,141,142,147,150],{},[115,143,144],{},[118,145,146],{},"X-Frame-Options",[115,148,149],{},"Lass keine andere Website diese Seite in einem Rahmen anzeigen",[115,151,152],{},"Deine Seite kann unsichtbar in der von jemand anderem geladen werden",[97,154,155,160,163],{},[115,156,157],{},[118,158,159],{},"X-Content-Type-Options",[115,161,162],{},"Vertrau dem Dateityp, den ich dir gegeben habe, und rate nicht am Inhalt",[115,164,165],{},"Eine hochgeladene Datei kann als eine ganz andere Art Datei ausgeliefert werden",[97,167,168,173,176],{},[115,169,170],{},[118,171,172],{},"Referrer-Policy",[115,174,175],{},"Wie viel von dieser Adresse weitergegeben wird, wenn jemand nach außen klickt",[115,177,178],{},"Vollständige URLs, samt allem, was darin steht, erreichen fremde Server",[10,180,181,182,184,185,188,189,191],{},"Zwei davon überschneiden sich, und der Scanner rechnet das ein. Eine\n",[118,183,120],{},", die ",[118,186,187],{},"frame-ancestors"," enthält, erledigt dieselbe\nAufgabe wie ",[118,190,146],{},", also zählt unsere Prüfung eines von beiden und\nverlangt nicht beide.",[31,193,195],{"id":194},"wann-ein-fehlender-header-das-ganze-problem-ist","Wann ein fehlender Header das ganze Problem ist",[10,197,198],{},"Wenn es in deiner App etwas gibt, das anzuklicken sich lohnt, während jemand\nangemeldet ist.",[10,200,201],{},"Das ist der Clickjacking-Fall, und er ist der eine, der ohne jeden weiteren\nFehler funktioniert. Jemand lädt deine App in einem unsichtbaren Rahmen auf\neiner Seite, die er kontrolliert, und legt seine eigenen Schaltflächen über\ndeine, sodass ein bereits angemeldeter Besucher klickt, was aussieht wie seine\nSeite, und stattdessen ein Bedienelement von dir trifft: die Schaltfläche, die\nein Konto löscht, eine Überweisung freigibt oder eine E-Mail-Adresse ändert.",[58,203],{"alt":204,"caption":205,"src":206},"Zwei Reihen. In der ersten wandert eine Seite nach rechts und wird von einem Balken gestoppt, bevor sie eine gestrichelte leere Fläche erreicht. In der zweiten gibt es keinen Balken, und die Seite ist klein in der anderen Fläche gezeichnet, mit einem Mauszeiger über ihrer Schaltfläche.","Mit dem Header weigert sich der Browser, deine Seite in einer anderen Website zu zeichnen. Ohne ihn ist genau das vorgesehen.","\u002Fblog\u002Fmissing-security-headers\u002Floaded-inside-another-page-1600x790.png",[10,208,209],{},"Der Besucher ist angemeldet, also trägt die Aktion seine Sitzung. An deiner\nDatenbank muss nichts falsch konfiguriert sein. Was das möglich macht, ist, dass\ndem Browser nie gesagt wurde, er solle ablehnen.",[10,211,212,214],{},[118,213,172],{}," hat eine kleinere Version derselben Form. Wenn eine\nangemeldete Seite von dir irgendetwas Identifizierendes in der URL trägt und auf\neinen Bilder-Host oder ein Analytics-Skript hinauslinkt, reist die ganze Adresse\nmit dem Klick mit. Wer diesen anderen Server betreibt, sieht, wo dein Nutzer war.",[10,216,217,218,220,221,223,224,226],{},"Die anderen drei sind an Bedingungen geknüpft. Sie zählen, wenn schon etwas\nanderes schiefgegangen ist, und ihre Aufgabe ist, es klein zu halten. Eine\n",[118,219,120],{}," begrenzt, was ein eingeschleustes Skript mit seinem\nZugriff anfangen kann. ",[118,222,159],{}," zählt, wenn Fremde Dateien zu\ndir hochladen können. ",[118,225,133],{}," deckt jemanden ab, der deine\nApp in einem Netz benutzt, das er nicht kontrolliert.",[31,228,230],{"id":229},"brauche-ich-sicherheitsheader","Brauche ich Sicherheitsheader?",[10,232,233],{},"Ja. Sie sind billig, und sie kommen nach den Befunden, die entscheiden, wer\ndeine Datenbank lesen kann.",[10,235,236],{},"Die Reihenfolge, die aus der Messung oben folgt: alles Kritische oder Hohe in\ndeinem Bericht zuerst, Header danach. Wenn in deinem Bericht nur diese eine\nZeile steht, wie bei 17.043 der Apps, die wir gescannt haben, dann stehen Header\nohnehin ganz oben auf deiner Liste.",[10,238,239,240,243,244,247,248,251],{},"Zwei der fünf kosten nichts, um sie richtig zu machen.\n",[118,241,242],{},"X-Content-Type-Options: nosniff"," und\n",[118,245,246],{},"Referrer-Policy: strict-origin-when-cross-origin"," sind je eine Zeile, haben\nkeinen falschen Wert zu wählen und können eine funktionierende App nicht kaputt\nmachen. ",[118,249,250],{},"X-Frame-Options: DENY"," ist ebenfalls eine Zeile und einen Blick wert,\nfalls du deine eigene App absichtlich irgendwo einbettest.",[10,253,254,256,257,260],{},[118,255,120],{}," ist der, der echte Arbeit macht. Ein erster Versuch\nblockiert meist etwas, das deine eigene Seite gebraucht hat, und das Symptom ist\neine Funktion, die stillschweigend aufhört zu funktionieren. Bring ihn als\n",[118,258,259],{},"Content-Security-Policy-Report-Only"," aus, der dir meldet, was er blockiert\nhätte, ohne etwas zu blockieren, und lies eine Woche Meldungen, bevor du ihn\neinschaltest.",[31,262,264],{"id":263},"wie-du-sie-hinzufügst","Wie du sie hinzufügst",[10,266,267],{},"In dem, was deine App tatsächlich ins Internet ausliefert, und das ist oft nicht\nder Ort, an dem du sie baust.",[10,269,270,271,274,275,278,279,282],{},"Die meisten Builder deployen auf einen Host, dem die Antwort gehört, also liegt\ndie Einstellung dort. Bei Vercel ist es ",[118,272,273],{},"headers"," in ",[118,276,277],{},"vercel.json",". Bei Netlify\nund Cloudflare Pages ist es eine ",[118,280,281],{},"_headers","-Datei im Wurzelverzeichnis deiner\nveröffentlichten Ausgabe. Hinter Cloudflares Proxy ist es eine Transform Rule.\nWenn du deinen eigenen Server betreibst, ist es deine nginx- oder\nCaddy-Konfiguration.",[284,285,287],"callout",{"type":286},"warn",[10,288,289,292],{},[17,290,291],{},"Wenn deine App auf der eigenen Subdomain deines Builders liegt, kannst du\ndiese womöglich gar nicht setzen."," Die Plattform schickt die Antwort, die\nHeader sind ihre Entscheidung, und es gibt keine Datei, die du hinzufügen\nkannst und die sie überschreibt. Das ist eine echte Antwort und kein zu\nschlampiges Suchen. Eine eigene Domain zu verbinden ist das, was dir einen Host\nzum Konfigurieren gibt, und solange du keinen willst, darf dieser Befund ruhig\nin deinem Bericht stehen bleiben.",[10,294,295],{},"Was man über Header wissen sollte, sobald man sie gesetzt hat: sie verschwinden\nwieder, ohne dass jemand sie anfasst. Auf eine eigene Domain umziehen, einen\nProxy davorsetzen, den Host wechseln, eine Framework-Konfiguration ändern: die\nHeader, die du hinzugefügt hast, liegen an einer dieser Stellen, und jeder\ndieser Schritte kann sie zurücklassen. Nichts sagt es dir. Die Seite\nfunktioniert weiter, und die Einstellung ist weg.",[10,297,298,299,303,304,29],{},"Für so etwas gibt es ",[25,300,302],{"href":301},"\u002F#pricing","Reeve Monitor",". Es lässt die vollständige\nPrüfung jede Stunde für bis zu drei Apps neu laufen, beobachtet die Erreichbarkeit\nalle 60 Sekunden und sagt dir Bescheid, wenn sich ein Ergebnis ändert, statt zu\nwarten, bis du nachsiehst. Monitor beobachtet und sonst nichts. Wenn du also\nzusätzlich eine Kopie deiner Datenbank irgendwo haben willst, wo dein Builder\nnicht hinkommt, ",[25,305,307],{"href":306},"\u002Fsupabase-backups","dann ist das Care, und es deckt Supabase ab",[31,309,311],{"id":310},"was-du-jetzt-tun-kannst","Was du jetzt tun kannst",[313,314,315],"key-takeaways",{},[316,317,318,322,331,337,343,346],"ul",{},[319,320,321],"li",{},"Lies zuerst den Rest deines Berichts. Steht dort irgendwo kritisch oder hoch, ist das die Arbeit, und die Header warten.",[319,323,324,325,327,328,330],{},"Setz heute ",[118,326,242],{}," und ",[118,329,246],{},". Je eine Zeile, nichts zu entscheiden, nichts kaputtzumachen.",[319,332,333,334,336],{},"Setz ",[118,335,250],{},", wenn sich Leute bei deiner App anmelden und mit einem Klick etwas Folgenreiches tun können.",[319,338,339,340,342],{},"Heb dir ",[118,341,120],{}," bis zuletzt auf und starte im Report-Only-Modus, damit du vor deinen Besuchern erfährst, was er kaputt macht.",[319,344,345],{},"Wenn du auf einer Builder-Subdomain ohne Header-Einstellung sitzt, lass den Befund liegen. Er ist noch nicht deiner.",[319,347,348],{},"Prüf sie erneut, nachdem du die Domain gewechselt, einen Proxy hinzugefügt oder den Host getauscht hast. Dann verschwinden sie.",[10,350,351,352,356,357,361],{},"Header sind einen ruhigen Nachmittag wert, sobald der Rest des Berichts sauber\nist. Wenn du die ganze Liste lieber der Reihe nach durchgehst: die\n",[25,353,355],{"href":354},"\u002Fchecklist","10-Minuten-Sicherheitscheckliste"," deckt ab, was in einer frisch\ngestarteten App abzuschalten ist, und\n",[25,358,360],{"href":359},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","die Befunde, die tatsächlich entscheiden, wer deine Datenbank liest",",\nsind die, die zuerst weg müssen.",{"title":363,"searchDepth":364,"depth":364,"links":365},"",3,[366,368,369,370,371,372,373],{"id":33,"depth":367,"text":34},2,{"id":49,"depth":367,"text":50},{"id":85,"depth":367,"text":86},{"id":194,"depth":367,"text":195},{"id":229,"depth":367,"text":230},{"id":263,"depth":367,"text":264},{"id":310,"depth":367,"text":311},"Sicherheitsgrundlagen","\u002Fblog\u002Fmissing-security-headers\u002Fcover-1200x630.png","Die Liste der Header, die eine Website mit jeder Seite zurückschickt, vier ihrer Zeilen nur liniert und leer, wo ein Wert stehen würde.","Fehlende Sicherheitsheader ist unser häufigster Befund. Wogegen sie schützen, und wann sie die unwichtigste Zeile in deinem Bericht sind.",false,"md",[381,384,387,390,393],{"q":382,"a":383},"Mein Scan sagt, Sicherheitsheader fehlen. Wurde meine App gehackt?","Nein. Ein fehlender Header ist eine Einstellung, die nie eingeschaltet wurde, und er ist kein Beleg dafür, dass irgendetwas passiert ist. An dem Befund ist niemand beteiligt, der an deine Daten oder dein Konto kommt. Er beschreibt eine Anweisung, die deine Website besuchenden Browsern geben könnte und derzeit nicht gibt.",{"q":385,"a":386},"Welchen Sicherheitsheader soll ich zuerst setzen?","X-Content-Type-Options und Referrer-Policy, denn beide sind eine einzige Zeile, bei keinem gibt es einen falschen Wert zu wählen, und keiner kann eine funktionierende App kaputt machen. Danach X-Frame-Options, wenn sich Leute bei deiner App anmelden. Danach Strict-Transport-Security. Content-Security-Policy zuletzt, denn er ist der einzige der fünf, der echtes Nachdenken verlangt, und der einzige, der deine eigenen Skripte am Laufen hindern kann.",{"q":388,"a":389},"Ich bin auf der Standard-Domain meines Builders und finde keine Einstellung für Header. Was jetzt?","Lass sie liegen. Wenn deine App von einer Plattform-Subdomain ausgeliefert wird, sind die Antwort-Header die Entscheidung der Plattform und nicht deine, und es gibt keine Datei, die du hinzufügen kannst und die daran etwas ändert. Verbinde eine eigene Domain, wenn du das steuern möchtest, denn die Domain ist es, die dich einen eigenen Host oder einen Proxy vor die App setzen lässt. Bis dahin steck die Mühe in die Befunde, die zu beheben deine Sache sind.",{"q":391,"a":392},"Kann eine Content-Security-Policy meine App kaputt machen?","Ja, und das ist der normale Ausgang eines ersten Versuchs. Eine Policy, die keine Inline-Skripte erlaubt, stoppt Inline-Skripte, auch die von deinem Builder erzeugten, und die Seite bleibt leer oder verliert eine Funktion, mit einem Fehler nur in der Browser-Konsole. Fang mit Content-Security-Policy-Report-Only an, die meldet, was sie blockiert hätte, und nichts blockiert, und lies die Meldungen eine Woche lang, bevor du sie scharf schaltest.",{"q":394,"a":395},"Helfen Sicherheitsheader, wenn meine Datenbank für jeden lesbar ist?","Nein. Header sind Anweisungen an die Browser, die deine Website besuchen, und wer deine Datenbank direkt liest, benutzt keinen Browser und besucht deine Website nicht. Diese Anfrage geht direkt an deinen Datenbankanbieter und berührt deine Seiten nie, also gilt kein Header auf ihnen für sie. Darüber entscheidet Row Level Security.","\u002Fblog\u002Fmissing-security-headers\u002Fcard-800x500.png",[398,399,400,401,402,403,404],"fehlende sicherheitsheader","content-security-policy fehlt","x-frame-options fehlt","brauche ich sicherheitsheader","sicherheitsheader prüfen","strict-transport-security fehlt","sind fehlende sicherheitsheader ein problem",{},true,"Fehlende Sicherheitsheader: wann zählen sie?","\u002Fblog\u002Fmissing-security-headers","2026-09-04",{"title":5,"description":377},"blog\u002Fmissing-security-headers",[413,414,415,416],"Fehlende Sicherheitsheader ist der häufigste Befund überhaupt, und für sich genommen sagt er fast nichts darüber aus, ob jemand an deine Daten kommt.","Wir haben 30.998 aktive Apps gescannt. Zwei von drei der Apps mit fehlenden Headern hatten sonst überhaupt nichts.","Es lohnt sich trotzdem, das zu beheben, und zwar nach den Dingen, die darüber entscheiden, wer deine Datenbank lesen kann.","Auf manchen Builder-Domains kannst du sie gar nicht selbst setzen, und sie liegen zu lassen ist dann eine vernünftige Antwort.","urH78TklUwueD1E4IEKTyC0bS4-rqY276S5Vz3oph9M",[419,426,432,438,444,450,456,462,468,474,480,486,492,498,504,510,516,522,528,534,535,541,547,553,559,565,571,577,583,589,595,601,607,613,619,624,629,635,641,647,652,658],{"path":420,"title":421,"description":422,"published":423,"category":424,"image":425,"draft":378},"\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":427,"title":428,"description":429,"published":430,"category":374,"image":431,"draft":378},"\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":433,"title":434,"description":435,"published":436,"category":374,"image":437,"draft":378},"\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":439,"title":440,"description":441,"published":442,"category":374,"image":443,"draft":378},"\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":445,"title":446,"description":447,"published":448,"category":374,"image":449,"draft":378},"\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":451,"title":452,"description":453,"published":454,"category":374,"image":455,"draft":378},"\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":457,"title":458,"description":459,"published":460,"category":374,"image":461,"draft":378},"\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":463,"title":464,"description":465,"published":466,"category":374,"image":467,"draft":378},"\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":469,"title":470,"description":471,"published":472,"category":374,"image":473,"draft":378},"\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":475,"title":476,"description":477,"published":478,"category":424,"image":479,"draft":378},"\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":481,"title":482,"description":483,"published":484,"category":424,"image":485,"draft":378},"\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":487,"title":488,"description":489,"published":490,"category":424,"image":491,"draft":378},"\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":493,"title":494,"description":495,"published":496,"category":374,"image":497,"draft":378},"\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":499,"title":500,"description":501,"published":502,"category":374,"image":503,"draft":378},"\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":505,"title":506,"description":507,"published":508,"category":374,"image":509,"draft":378},"\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":511,"title":512,"description":513,"published":514,"category":374,"image":515,"draft":378},"\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":517,"title":518,"description":519,"published":520,"category":374,"image":521,"draft":378},"\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":523,"title":524,"description":525,"published":526,"category":374,"image":527,"draft":378},"\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":529,"title":530,"description":531,"published":532,"category":374,"image":533,"draft":378},"\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":408,"title":5,"description":377,"published":409,"category":374,"image":396,"draft":378},{"path":536,"title":537,"description":538,"published":539,"category":374,"image":540,"draft":378},"\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":542,"title":543,"description":544,"published":545,"category":374,"image":546,"draft":378},"\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":548,"title":549,"description":550,"published":551,"category":424,"image":552,"draft":378},"\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":554,"title":555,"description":556,"published":557,"category":374,"image":558,"draft":378},"\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":560,"title":561,"description":562,"published":563,"category":424,"image":564,"draft":378},"\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":566,"title":567,"description":568,"published":569,"category":374,"image":570,"draft":378},"\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":572,"title":573,"description":574,"published":575,"category":374,"image":576,"draft":378},"\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":578,"title":579,"description":580,"published":581,"category":374,"image":582,"draft":378},"\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":584,"title":585,"description":586,"published":587,"category":374,"image":588,"draft":378},"\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":590,"title":591,"description":592,"published":593,"category":424,"image":594,"draft":378},"\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":596,"title":597,"description":598,"published":599,"category":424,"image":600,"draft":378},"\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":602,"title":603,"description":604,"published":605,"category":374,"image":606,"draft":378},"\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":608,"title":609,"description":610,"published":611,"category":374,"image":612,"draft":378},"\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":614,"title":615,"description":616,"published":617,"category":424,"image":618,"draft":378},"\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":359,"title":620,"description":621,"published":622,"category":374,"image":623,"draft":378},"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":625,"title":626,"description":627,"published":622,"category":374,"image":628,"draft":378},"\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":630,"title":631,"description":632,"published":633,"category":374,"image":634,"draft":378},"\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":636,"title":637,"description":638,"published":639,"category":424,"image":640,"draft":378},"\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":642,"title":643,"description":644,"published":645,"category":374,"image":646,"draft":378},"\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":648,"title":649,"description":650,"published":645,"category":424,"image":651,"draft":378},"\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":653,"title":654,"description":655,"published":656,"category":424,"image":657,"draft":378},"\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":659,"title":660,"description":661,"published":656,"category":374,"image":662,"draft":378},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","Welche API-Schlüssel im Frontend sicher sind, und welche nicht","Dein Supabase-anon-Schlüssel darf öffentlich sein. Der service_role-Schlüssel nicht. Er ignoriert jede Regel, die du setzt. So erkennst du den Unterschied.","\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend\u002Fcard-800x500.png",1790150951364]