[{"data":1,"prerenderedAt":1001},["ShallowReactive",2],{"blog-de-env-file-exposed-on-your-server":3,"blog-index-de":648},{"id":4,"title":5,"body":6,"category":604,"cover":605,"coverAlt":606,"description":607,"draft":608,"extension":609,"faq":610,"image":626,"keywords":627,"meta":636,"navigation":637,"ogTitle":5,"path":638,"published":639,"seo":640,"stem":641,"tldr":642,"updated":646,"__hash__":647},"blog_de\u002Fblog\u002Fenv-file-exposed-on-your-server.md","Ist deine .env-Datei öffentlich? Zwölf Pfade zum Prüfen",{"type":7,"value":8,"toc":590},"minimark",[9,18,36,42,47,54,57,63,69,83,100,104,107,167,176,182,186,189,198,201,208,216,220,223,394,401,405,408,411,439,447,451,457,463,472,479,483,492,495,508,512,515,518,523,526,548,555,559,582],[10,11,12,13,17],"p",{},"Jemand hat dir gesagt, deine ",[14,15,16],"code",{},".env","-Datei sei offengelegt, und du kannst dem Satz\nnicht ansehen, wie ernst das ist. Er deckt zwei völlig verschiedene Situationen\nab. Die eine ist das Werkzeug, das tut, wofür es gebaut wurde. Die andere heißt,\ndass eine Datei, die du für privat gehalten hast, von deiner laufenden Seite\nheruntergeladen werden kann, von jedem, seit sie dort liegt.",[10,19,20,21,31,32,35],{},"Hier ist der Teil, den Anleitung um Anleitung vermischt: ",[22,23,24,25,27,28,30],"strong",{},"ein Wert aus deiner\n",[14,26,16],{},", der in deinem JavaScript landet, ist nicht dasselbe Ereignis wie die\n",[14,29,16],{},"-Datei selbst, die dein Webserver ausliefert."," Das Erste ist der Build,\nder tut, worum du ihn gebeten hast, als du die Variable ",[14,33,34],{},"VITE_IRGENDWAS"," genannt\nhast. Das Zweite ist ein Ablagefehler, und es ist das, was du zuerst prüfen\nsolltest, weil du es von außen selbst prüfen kannst, in etwa einer Minute.",[10,37,38,39,41],{},"Stell dir deine laufende Seite als Ladentheke vor. Alles auf der Theke liegt dort\nzum Mitnehmen: die Seite, die Bilder, das JavaScript, das Logo. Das Hinterzimmer\ndahinter enthält das, was den Laden betreibt, und ein Besucher hat keinen Weg\ndorthin. Ein Wert, der in dein JavaScript kompiliert wurde, ist eine Zeile im\nProspekt auf der Theke. Die ",[14,40,16],{},"-Datei, die unter einer öffentlichen Adresse\nantwortet, ist der Ordner aus dem Hinterzimmer, der mit allem anderen auf der\nTheke liegt.",[43,44,46],"h2",{"id":45},"ist-meine-env-datei-öffentlich","Ist meine .env-Datei öffentlich?",[10,48,49,50,53],{},"Öffne deine laufende Seite im Browser, hänge ",[14,51,52],{},"\u002F.env"," an die Adresse und drücke\nEnter.",[10,55,56],{},"Drei Dinge können zurückkommen, und nur eines davon ist ein Problem.",[10,58,59,62],{},[22,60,61],{},"Eine Seite deiner App."," Die meisten Frontends beantworten jede unbekannte\nAdresse mit ihrer eigenen Indexseite, weil Single-Page-Apps so routen. Du\nbekommst deine Startseite oder deinen Nicht-gefunden-Bildschirm. Unter diesem\nPfad wird nichts ausgeliefert.",[10,64,65,68],{},[22,66,67],{},"Einen Fehler."," Eine 403 oder eine 404 heißt, der Server wurde gefragt und hat\nabgelehnt. Das ist die Antwort, die du willst.",[10,70,71,74,75,78,79,82],{},[22,72,73],{},"Reinen Text, mit Zeilen darin."," So etwas wie ",[14,76,77],{},"SUPABASE_URL=https:\u002F\u002F…"," und\n",[14,80,81],{},"SUPABASE_SERVICE_ROLE_KEY=eyJ…",", als Wand aus Monospace ohne jede Gestaltung.\nDie Datei wird an jeden ausgehändigt, der danach fragt, und zwar seit dem Tag,\nan dem sie zum ersten Mal ausgeliefert wurde.",[84,85,87],"callout",{"type":86},"note",[10,88,89,92,93,96,97,99],{},[22,90,91],{},"Sieh dir an, was zurückkam, nicht den Statuscode."," Ein Server kann ",[14,94,95],{},"200 OK","\nmit deiner Indexseite antworten, und das ist das normale Ergebnis und völlig in\nOrdnung. Browser stellen eine heruntergeladene ",[14,98,16],{}," außerdem als nackten Text\ndar, also sieht das Fenster kaputt aus, wenn der Fund echt ist. Der Test ist, ob\ndu gerade deine eigenen Einstellungen liest.",[43,101,103],{"id":102},"zwei-verschiedene-dinge-heißen-offengelegte-env-datei","Zwei verschiedene Dinge heißen offengelegte .env-Datei",[10,105,106],{},"Das eine betrifft dein Bundle. Das andere deinen Server.",[108,109,110,126],"table",{},[111,112,113],"thead",{},[114,115,116,120,123],"tr",{},[117,118,119],"th",{},"Was passiert ist",[117,121,122],{},"Wo der Wert liegt",[117,124,125],{},"Was die Lösung kostet",[127,128,129,153],"tbody",{},[114,130,131,147,150],{},[132,133,134,135,138,139,142,143,146],"td",{},"Du hast eine Variable ",[14,136,137],{},"VITE_",", ",[14,140,141],{},"NEXT_PUBLIC_"," oder ",[14,144,145],{},"EXPO_PUBLIC_"," genannt",[132,148,149],{},"Einkompiliert in das JavaScript, das jeder Besucher lädt",[132,151,152],{},"Die Arbeit auf einen Server verlegen, dann den Schlüssel tauschen. Die Datei wurde nie ausgeliefert.",[114,154,155,158,164],{},[132,156,157],{},"Dein Webserver veröffentlicht dein Projektverzeichnis",[132,159,160,161],{},"In der Datei, unter ",[14,162,163],{},"https:\u002F\u002Fdeineseite\u002F.env",[132,165,166],{},"Die Datei aus dem veröffentlichten Verzeichnis nehmen, dann alles darin tauschen.",[10,168,169,170,175],{},"Die erste Zeile ist der häufige Fall und hat ",[171,172,174],"a",{"href":173},"\u002Fblog\u002Fvite-and-next-public-env-vars","einen eigenen\nBeitrag",": Das Präfix ist eine Anweisung zu\nveröffentlichen, und der Build hat sie befolgt. Alles Weitere hier ist die zweite\nZeile.",[177,178],"diagram",{"alt":179,"caption":180,"src":181},"Zwei Wege aus derselben .env-Datei. Links kopiert der Build einen Wert mit Präfix in das JavaScript-Bundle, das ein Besucher lädt. Rechts übergibt der Webserver die ganze Datei unter der Adresse \u002F.env.","Links: Der Build hat einen Wert in dein JavaScript kopiert, weil das Präfix es so wollte. Rechts: Der Server händigt die Datei aus, und die Präfixe spielen dabei keine Rolle.","\u002Fblog\u002Fenv-file-exposed-on-your-server\u002Ftwo-meanings-1600x840.png",[43,183,185],{"id":184},"warum-eine-lovable-app-das-nicht-kann-und-eine-replit-app-schon","Warum eine Lovable-App das nicht kann und eine Replit-App schon",[10,187,188],{},"Weil die beiden Hosts Verschiedenes veröffentlichen.",[10,190,191,192,194,195,197],{},"Ein Builder, der ein statisches Frontend deployt, übergibt seinem Host einen\nOrdner mit gebauten Dateien: etwas HTML, etwas JavaScript, ein paar Bilder. Deine\n",[14,193,16],{}," wurde beim Build gelesen und liegt nicht in diesem Ordner, also gibt es\nunter ",[14,196,52],{}," nichts zu holen. Der Host könnte die Datei gar nicht ausliefern.",[10,199,200],{},"Eine Replit-App betreibt meist einen eigenen Server, in ihrem eigenen\nProjektverzeichnis, mit deinen Dateien neben deinem Code. Ein Server, der sein\nVerzeichnis ausliefern soll, liefert jede Datei darin aus, und er kann nicht\nwissen, dass eine davon deine Schlüssel enthält. Dasselbe gilt für alles, was du\nauf eine eigene Maschine deployt hast.",[10,202,203,204,207],{},"Die Zahlen folgen der Architektur. Von 30.761 laufenden Apps, bei denen dieser\nCheck eine Antwort bekam, haben 8 mindestens eine private Datei ausgehändigt.\n",[22,205,206],{},"Sieben der acht waren Replit-Apps",", und Replit-Apps waren 3.025 der 30.761.\nDie achte lief unter einer eigenen Domain, was dasselbe anders sagt: Da betrieb\njemand einen eigenen Server.",[10,209,210,211,215],{},"Das ist der seltenste Fund, den wir ausgeben, und der einzige der neun ohne\nharmlose Erklärung. Wenn du die breitere Lesart willst, was Replit-Apps\ntatsächlich ausliefern: ",[171,212,214],{"href":213},"\u002Fblog\u002Fis-replit-safe","wir haben 3.042 davon\ngescannt",".",[43,217,219],{"id":218},"die-zwölf-pfade-zum-prüfen","Die zwölf Pfade zum Prüfen",[10,221,222],{},"Zwölf Adressen, in der Reihenfolge, in der es sich lohnt. Hänge jede an deine\nDomain.",[108,224,225,238],{},[111,226,227],{},[114,228,229,232,235],{},[117,230,231],{},"Adresse",[117,233,234],{},"Was darin steht",[117,236,237],{},"Wenn sie mit Text antwortet",[127,239,240,252,265,277,294,307,320,333,344,355,368,381],{},[114,241,242,246,249],{},[132,243,244],{},[14,245,52],{},[132,247,248],{},"Jeder Schlüssel, mit dem deine App gebaut wurde",[132,250,251],{},"Alles als öffentlich behandeln und tauschen",[114,253,254,259,262],{},[132,255,256],{},[14,257,258],{},"\u002F.env.local",[132,260,261],{},"Dasselbe, aus einem lokalen Lauf",[132,263,264],{},"Dasselbe",[114,266,267,272,275],{},[132,268,269],{},[14,270,271],{},"\u002F.env.production",[132,273,274],{},"Dasselbe, aus deinem Live-Deploy",[132,276,264],{},[114,278,279,284,287],{},[132,280,281],{},[14,282,283],{},"\u002F.git\u002Fconfig",[132,285,286],{},"Die Remote-Adresse deines Repositorys",[132,288,289,290,293],{},"Das ganze ",[14,291,292],{},".git","-Verzeichnis ist meist lesbar",[114,295,296,301,304],{},[132,297,298],{},[14,299,300],{},"\u002F.git\u002FHEAD",[132,302,303],{},"Auf welchem Branch du bist",[132,305,306],{},"Dasselbe, und es ist der leiseste der zwölf",[114,308,309,314,317],{},[132,310,311],{},[14,312,313],{},"\u002F.aws\u002Fcredentials",[132,315,316],{},"Langlebige Amazon-Schlüssel",[132,318,319],{},"Bei Amazon tauschen, dann die Abrechnung prüfen",[114,321,322,327,330],{},[132,323,324],{},[14,325,326],{},"\u002Fdatabase.sql",[132,328,329],{},"Schema und Zeilen",[132,331,332],{},"Jede Zeile jeder Tabelle ist öffentlich",[114,334,335,340,342],{},[132,336,337],{},[14,338,339],{},"\u002Fdump.sql",[132,341,264],{},[132,343,264],{},[114,345,346,351,353],{},[132,347,348],{},[14,349,350],{},"\u002Fbackup.sql",[132,352,264],{},[132,354,264],{},[114,356,357,362,365],{},[132,358,359],{},[14,360,361],{},"\u002Fconfig.json",[132,363,364],{},"Was auch immer du hineingeschrieben hast",[132,366,367],{},"Lies sie und sieh nach; Tokens liegen hier öfter, als man denkt",[114,369,370,375,378],{},[132,371,372],{},[14,373,374],{},"\u002Fdocker-compose.yml",[132,376,377],{},"Service-Definitionen, oft mit Passwörtern darin",[132,379,380],{},"Alles tauschen, was darin steht",[114,382,383,388,391],{},[132,384,385],{},[14,386,387],{},"\u002F.npmrc",[132,389,390],{},"Ein Registry-Token",[132,392,393],{},"Den Token widerrufen",[10,395,396,397,215],{},"Unser eigener Scan liest alle zwölf von außen und nennt dir die, die geantwortet\nhaben. Er dauert etwa 20 Sekunden und braucht kein Konto: ",[171,398,400],{"href":399},"\u002Fsecurity-scanner","scanne deine\nApp",[43,402,404],{"id":403},"was-ein-treffer-wirklich-bedeutet","Was ein Treffer wirklich bedeutet",[10,406,407],{},"Alles in dieser Datei ist gerade öffentlich, und zwar seit dem Tag, an dem sie\nzum ersten Mal ausgeliefert wurde.",[10,409,410],{},"Du wirst nicht herausfinden, wer sie gelesen hat. Ein Builder gibt dir kein Log\nüber eine abgeholte Datei, in das du sehen könntest, und die Anfrage sieht aus\nwie jede andere Anfrage nach jeder anderen Datei. Sicher sein kannst du dir, dass\nes jemand versucht hat: Automatische Crawler laufen genau diese zwölf Pfade im\nganzen Internet ab, ununterbrochen, und sie müssen nicht wissen, wer du bist, um\ndeine zu finden.",[10,412,413,414,416,417,419,420,423,424,427,428,138,431,434,435,438],{},"Fünf der acht Apps, die wir gefunden haben, händigten eine der vier teuren\nSorten aus: ",[14,415,16],{},", ein ",[14,418,292],{},"-Verzeichnis, ",[14,421,422],{},".aws\u002Fcredentials"," oder einen\n",[14,425,426],{},".sql","-Dump. Die anderen drei händigten ",[14,429,430],{},"config.json",[14,432,433],{},"docker-compose.yml"," oder\n",[14,436,437],{},".npmrc"," aus. Diese drei hält man für harmlos, und genau deshalb landen Tokens\nund Datenbankpasswörter darin.",[10,440,441,442,446],{},"Was das nicht ist, ist ein Urteil über deine App. Eine externe Prüfung liest,\nwas deine Seite einem Fremden aushändigt, und zwölf Pfade, die mit nichts\nantworten, sind zwölf Pfade, die mit nichts antworten. ",[171,443,445],{"href":444},"\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps","Was sonst noch aus einer\nvibe-codeten App\nherausläuft"," ist die längere\nListe.",[43,448,450],{"id":449},"das-eine-das-eine-woche-ruiniert-ein-git-verzeichnis","Das eine, das eine Woche ruiniert: ein .git-Verzeichnis",[10,452,453,454,456],{},"Ein ",[14,455,292],{},"-Verzeichnis ist nicht eine Datei. Es ist deine ganze Geschichte.",[10,458,459,460,462],{},"Jeder Commit steckt darin, auch der, in dem du einen Schlüssel eingefügt hast,\nund der spätere, in dem du ihn wieder herausgenommen hast. Das ist der Teil, den\nLeute bei einem ",[14,461,292],{},"-Leck falsch verstehen: Einen Schlüssel aus dem Code von\nheute zu löschen ändert nichts an der Version, in der er noch drin war, und\ndiese Version liegt in demselben Verzeichnis, das dein Server veröffentlicht.",[10,464,465,466,468,469,471],{},"Der Check liest ",[14,467,283],{}," und ",[14,470,300],{},", weil die beiden klein sind, ihr\nInhalt unverwechselbar ist und jede der beiden Antworten bedeutet, dass das\nVerzeichnis selbst ausgeliefert wird. Von da an braucht ein Leser kein\nSpezialwerkzeug. Das Format ist dokumentiert, und gewöhnliche Software klont es.",[10,473,474,475,215],{},"Wenn ein Schlüssel je in einem Commit war, hilft nur noch tauschen. Was zuerst\nkommt, hängt davon ab, ob die Kopie schon draußen ist, und ",[171,476,478],{"href":477},"\u002Fblog\u002Frotate-supabase-service-role-key","diese Reihenfolge\nlohnt sich",[43,480,482],{"id":481},"der-dump-den-jemand-im-ordner-liegen-ließ","Der Dump, den jemand im Ordner liegen ließ",[10,484,485,486,138,488,78,490,215],{},"Drei der zwölf Pfade sind Datenbank-Dumps: ",[14,487,326],{},[14,489,339],{},[14,491,350],{},[10,493,494],{},"Ein Dump ist jede Zeile jeder Tabelle in einer Datei, mit dem Schema darüber.\nE-Mail-Adressen, gehashte Passwörter, Bestellungen, Nachrichten, was auch immer\ndeine App hält. Er antwortet unter einer öffentlichen Adresse aus dem\nlangweiligsten Grund in diesem ganzen Beitrag: Jemand hat das Vernünftige getan,\neine Kopie seiner Datenbank gezogen und sie in dem Projektordner gespeichert, in\ndem er gerade stand.",[10,496,497,498,502,503,507],{},"So wurde die Datei, die die Daten schützen sollte, zum schnellsten Weg, sie alle\nzu lesen. Wo eine Kopie liegt, ist genauso Teil der Entscheidung wie die Frage,\nob du eine ziehst. ",[171,499,501],{"href":500},"\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database","Drei Wege, eine Supabase-Datenbank zu\nsichern"," nennt die Möglichkeiten,\nund ",[171,504,506],{"href":505},"\u002Fsupabase-backups","Reeve Care"," bewahrt eine Kopie deiner Supabase-Datenbank\naußerhalb deines eigenen Servers auf, geprüft, bevor sie als Backup zählt.",[43,509,511],{"id":510},"wie-du-es-behebst-und-warum-die-reihenfolge-zählt","Wie du es behebst, und warum die Reihenfolge zählt",[10,513,514],{},"Nimm die Datei aus dem, was dein Server veröffentlicht. Tausche danach jeden\nSchlüssel, der darin stand. In dieser Reihenfolge.",[10,516,517],{},"Zuerst zu tauschen fühlt sich nach der dringenden Hälfte an, und es ist die\nHälfte, die die Arbeit verschwendet. Deine neuen Schlüssel landen in derselben\nDatei, die Datei antwortet weiter unter derselben Adresse, und du hast direkt\nzurück ins Leck getauscht. Nichts ist sicherer als vor zehn Minuten.",[177,519],{"alt":520,"caption":521,"src":522},"Zwei Abläufe. Wird getauscht, bevor die Datei umgezogen ist, landet der neue Schlüssel wieder in der Datei, die der Server weiter ausliefert. Wird die Datei zuerst verschoben, landet der getauschte Schlüssel dort, wo niemand hinkommt.","Zuerst tauschen, und der neue Schlüssel landet in der Datei, die weiter ausgehändigt wird. Zuerst verschieben, und es bleibt nichts mehr zum Aushändigen.","\u002Fblog\u002Fenv-file-exposed-on-your-server\u002Ffix-order-1600x760.png",[10,524,525],{},"Wohin sie stattdessen gehört, je nachdem, was du betreibst:",[527,528,529,536,542],"ul",{},[530,531,532,535],"li",{},[22,533,534],{},"Ein Host mit eigenem Secrets-Speicher."," Replit Secrets, die\nUmgebungsvariablen einer Plattform, dein Hosting-Dashboard. Der Wert wird zur\nLaufzeit von deinem Server gelesen und liegt nie als Datei im veröffentlichten\nVerzeichnis.",[530,537,538,541],{},[22,539,540],{},"Außerhalb des ausgelieferten Verzeichnisses."," Wenn du die Serverkonfiguration\nkontrollierst, zeige auf einen Build-Ausgabeordner statt auf das\nProjektverzeichnis. Dann hat eine Datei im Projektverzeichnis überhaupt keine\nAdresse.",[530,543,544,547],{},[22,545,546],{},"Auch nicht im Repository",", was eine eigene Gewohnheit ist und eine gute. Für\ndas Problem von heute tut es nichts.",[10,549,550,551,554],{},"Der letzte Punkt gehört deutlich gesagt, denn ",[14,552,553],{},".gitignore"," ist die Antwort, nach\nder alle greifen. Sie hält die Datei aus deinem Repository heraus. Die Datei auf\ndeinem Server liegt dort, weil der Server in deinem Projektverzeichnis sitzt, und\ngit hat dazu keine Meinung.",[43,556,558],{"id":557},"was-du-jetzt-tun-solltest","Was du jetzt tun solltest",[560,561,562],"key-takeaways",{},[527,563,564,567,570,573,576],{},[530,565,566],{},"Tippe alle zwölf Adressen hinter deine eigene Domain, oder lass den kostenlosen Scan das Tippen übernehmen. Lies, was zurückkommt, nicht den Statuscode.",[530,568,569],{},"Antwortet eine davon mit deinen eigenen Einstellungen, nimm die Datei aus dem Verzeichnis, das dein Server veröffentlicht, und deploye neu. Das ist der Schritt, der es stoppt.",[530,571,572],{},"Tausche danach jeden Schlüssel, jedes Passwort und jeden Token, den die Datei hielt, bei jedem Anbieter. Vor dem Umzug zu tauschen schreibt die neuen Werte dorthin, wo die alten waren.",[530,574,575],{},"Sieh dir danach Abrechnung und Anbieter-Logs an. Tauschen stoppt, was als Nächstes passiert, und nichts an dem, was schon passiert ist.",[530,577,578,579,581],{},"War ein ",[14,580,292],{},"-Verzeichnis lesbar, tausche alles, was je in einem Commit war, nicht nur das, was heute im Code steht.",[10,583,584,585,589],{},"Wenn du deine App lieber als Liste durchgehst: Die\n",[171,586,588],{"href":587},"\u002Fchecklist","10-Minuten-Sicherheitscheckliste"," deckt das hier zusammen mit den\nanderen Dingen ab, die in einer frisch gestarteten App zu schließen sind.",{"title":591,"searchDepth":592,"depth":592,"links":593},"",3,[594,596,597,598,599,600,601,602,603],{"id":45,"depth":595,"text":46},2,{"id":102,"depth":595,"text":103},{"id":184,"depth":595,"text":185},{"id":218,"depth":595,"text":219},{"id":403,"depth":595,"text":404},{"id":449,"depth":595,"text":450},{"id":481,"depth":595,"text":482},{"id":510,"depth":595,"text":511},{"id":557,"depth":595,"text":558},"Sicherheitsgrundlagen","\u002Fblog\u002Fenv-file-exposed-on-your-server\u002Fcover-1200x630.png","Vier versiegelte Ordner hinter einer Mauer, davor ein offener Ordner mit sichtbaren Zeilen unter einem gelben Balken.","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.",false,"md",[611,614,617,620,623],{"q":612,"a":613},"Woher weiß ich, ob meine .env-Datei öffentlich ist?","Öffne deine laufende Seite im Browser, hänge \u002F.env an die Adresse und drücke Enter. Kommt eine Seite deiner App zurück, wird unter diesem Pfad nichts ausgeliefert. Kommt reiner Text zurück, mit Zeilen wie SUPABASE_URL=https:\u002F\u002Fabcdefghij.supabase.co, dann wird die Datei an jeden ausgehändigt, der danach fragt. Mach dasselbe mit \u002F.env.local und \u002F.env.production, denn ein Server, der eine davon ausliefert, liefert meist alle drei.",{"q":615,"a":616},"Ist eine .env-Datei in meinem Bundle dasselbe?","Nein, und die Lösung ist eine andere. Ein Wert, der in deinem JavaScript landet, ist dort, weil der Build es so machen sollte: Die Variable hieß VITE_ oder NEXT_PUBLIC_ oder EXPO_PUBLIC_. Die Datei hat deinen Rechner nie verlassen, der Wert schon. Das ist ein eigenes Problem mit einem eigenen Beitrag. Hier geht es um die Datei selbst, die dein Webserver ausliefert, und damit ist jeder Wert darin öffentlich, mit Präfix oder ohne.",{"q":618,"a":619},"Warum kann jemand meinen .git-Ordner herunterladen?","Weil dein Server auf dein Projektverzeichnis zeigt und .git ein Verzeichnis darin ist wie jedes andere. Ein Server weiß nicht, dass eines davon deine Versionsgeschichte ist. Wenn \u002F.git\u002Fconfig oder \u002F.git\u002FHEAD mit Text antwortet, ist das ganze Verzeichnis meist lesbar, und dazu gehört jeder Commit, den du je gemacht hast, nicht nur der Code von heute.",{"q":621,"a":622},"Ich habe eine backup.sql auf meiner eigenen Seite gefunden, was jetzt?","Nimm sie aus dem Verzeichnis, das dein Server veröffentlicht, bevor du irgendetwas anderes tust, denn die Datei wird ausgehändigt, während du das hier liest. Behandle danach jedes Passwort, jeden Schlüssel und jeden Personendatensatz darin als öffentlich: Ein Dump enthält das Schema und jede Zeile jeder Tabelle. Und finde heraus, wie die Datei dorthin kam, meist ist es ein Backup im Projektordner, das nie umgezogen ist.",{"q":624,"a":625},"Soll ich zuerst Schlüssel tauschen oder die Datei löschen?","Erst die Datei verschieben, dann tauschen. Wer tauscht, während die Datei noch ausgeliefert wird, schreibt die neuen Werte in etwas, das jeder herunterladen kann, und steht danach genau dort, wo er vorher stand. Sobald unter dem Pfad nichts mehr antwortet, tausche jeden Schlüssel, den die Datei hielt, bei jedem Anbieter, und sieh dir danach Abrechnung und Logs an.","\u002Fblog\u002Fenv-file-exposed-on-your-server\u002Fcard-800x500.png",[628,629,630,631,632,633,634,635],".env datei öffentlich",".env datei offengelegt","env datei im internet erreichbar",".env von website herunterladen",".git ordner öffentlich","ist meine .env datei öffentlich","backup.sql öffentlich","config.json öffentlich",{},true,"\u002Fblog\u002Fenv-file-exposed-on-your-server","2026-10-04",{"title":5,"description":607},"blog\u002Fenv-file-exposed-on-your-server",[643,644,645],"Zwei verschiedene Probleme heißen beide offengelegte .env-Datei. Hier geht es um die Datei selbst, die auf deinem Webserver liegt und von jedem heruntergeladen werden kann, der die Adresse tippt.","Ein Host, der nur dein gebautes Frontend ausliefert, kann das nicht. Ein echter Server schon, und darum waren sieben der acht Apps, die wir gefunden haben, Replit-Apps.","Von 30.761 laufenden Apps, bei denen unser Check eine Antwort bekam, haben 8 eine private Datei ausgehändigt. Zwölf Adressen sagen dir, ob du die neunte bist.","2026-10-05","dlIf01rASAW9YNXrGgfEqeSrv_I2tBni_bBMg9ouVD0",[649,655,661,667,673,679,685,690,691,697,703,709,715,721,728,734,740,745,751,757,763,769,775,781,787,792,798,804,809,815,821,827,833,839,845,850,856,862,868,874,880,885,891,897,903,909,915,921,927,933,939,945,951,957,963,968,974,980,986,991,996],{"path":650,"title":651,"description":652,"published":653,"category":604,"image":654,"draft":608},"\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":656,"title":657,"description":658,"published":659,"category":604,"image":660,"draft":608},"\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":662,"title":663,"description":664,"published":665,"category":604,"image":666,"draft":608},"\u002Fblog\u002Fapi-key-leaked-what-to-do","Dein API-Key wurde geleakt. Die richtige Reihenfolge","Ein API-Key wurde geleakt und du weißt nicht, was zuerst zu tun ist. Nicht jeder Key im Frontend ist ein Leck, und die Reihenfolge zählt mehr als das Tempo.","2026-10-09","\u002Fblog\u002Fapi-key-leaked-what-to-do\u002Fcard-800x500.png",{"path":668,"title":669,"description":670,"published":671,"category":604,"image":672,"draft":608},"\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":674,"title":675,"description":676,"published":677,"category":604,"image":678,"draft":608},"\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":680,"title":681,"description":682,"published":683,"category":604,"image":684,"draft":608},"\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":686,"title":687,"description":688,"published":646,"category":604,"image":689,"draft":608},"\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.","\u002Fblog\u002Fmove-a-secret-to-an-edge-function\u002Fcard-800x500.png",{"path":638,"title":5,"description":607,"published":639,"category":604,"image":626,"draft":608},{"path":692,"title":693,"description":694,"published":695,"category":604,"image":696,"draft":608},"\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":698,"title":699,"description":700,"published":701,"category":604,"image":702,"draft":608},"\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":704,"title":705,"description":706,"published":707,"category":604,"image":708,"draft":608},"\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":710,"title":711,"description":712,"published":713,"category":604,"image":714,"draft":608},"\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":716,"title":717,"description":718,"published":719,"category":604,"image":720,"draft":608},"\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":722,"title":723,"description":724,"published":725,"category":726,"image":727,"draft":608},"\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":729,"title":730,"description":731,"published":732,"category":726,"image":733,"draft":608},"\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":735,"title":736,"description":737,"published":738,"category":726,"image":739,"draft":608},"\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":741,"title":742,"description":743,"published":738,"category":604,"image":744,"draft":608},"\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":746,"title":747,"description":748,"published":749,"category":604,"image":750,"draft":608},"\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":752,"title":753,"description":754,"published":755,"category":604,"image":756,"draft":608},"\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":758,"title":759,"description":760,"published":761,"category":726,"image":762,"draft":608},"\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":764,"title":765,"description":766,"published":767,"category":604,"image":768,"draft":608},"\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":770,"title":771,"description":772,"published":773,"category":604,"image":774,"draft":608},"\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":776,"title":777,"description":778,"published":779,"category":604,"image":780,"draft":608},"\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":782,"title":783,"description":784,"published":785,"category":604,"image":786,"draft":608},"\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":173,"title":788,"description":789,"published":790,"category":604,"image":791,"draft":608},"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":793,"title":794,"description":795,"published":796,"category":604,"image":797,"draft":608},"\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":799,"title":800,"description":801,"published":802,"category":604,"image":803,"draft":608},"\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":213,"title":805,"description":806,"published":807,"category":604,"image":808,"draft":608},"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":810,"title":811,"description":812,"published":813,"category":726,"image":814,"draft":608},"\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":816,"title":817,"description":818,"published":819,"category":726,"image":820,"draft":608},"\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":822,"title":823,"description":824,"published":825,"category":726,"image":826,"draft":608},"\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":828,"title":829,"description":830,"published":831,"category":604,"image":832,"draft":608},"\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":834,"title":835,"description":836,"published":837,"category":604,"image":838,"draft":608},"\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":840,"title":841,"description":842,"published":843,"category":604,"image":844,"draft":608},"\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":477,"title":846,"description":847,"published":848,"category":604,"image":849,"draft":608},"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":851,"title":852,"description":853,"published":854,"category":604,"image":855,"draft":608},"\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":857,"title":858,"description":859,"published":860,"category":604,"image":861,"draft":608},"\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":863,"title":864,"description":865,"published":866,"category":604,"image":867,"draft":608},"\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":869,"title":870,"description":871,"published":872,"category":604,"image":873,"draft":608},"\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":875,"title":876,"description":877,"published":878,"category":604,"image":879,"draft":608},"\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":444,"title":881,"description":882,"published":883,"category":604,"image":884,"draft":608},"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":886,"title":887,"description":888,"published":889,"category":726,"image":890,"draft":608},"\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":892,"title":893,"description":894,"published":895,"category":604,"image":896,"draft":608},"\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":898,"title":899,"description":900,"published":901,"category":726,"image":902,"draft":608},"\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":904,"title":905,"description":906,"published":907,"category":604,"image":908,"draft":608},"\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":910,"title":911,"description":912,"published":913,"category":604,"image":914,"draft":608},"\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":916,"title":917,"description":918,"published":919,"category":604,"image":920,"draft":608},"\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":922,"title":923,"description":924,"published":925,"category":604,"image":926,"draft":608},"\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":928,"title":929,"description":930,"published":931,"category":726,"image":932,"draft":608},"\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":934,"title":935,"description":936,"published":937,"category":726,"image":938,"draft":608},"\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":940,"title":941,"description":942,"published":943,"category":604,"image":944,"draft":608},"\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":946,"title":947,"description":948,"published":949,"category":604,"image":950,"draft":608},"\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":952,"title":953,"description":954,"published":955,"category":726,"image":956,"draft":608},"\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":958,"title":959,"description":960,"published":961,"category":604,"image":962,"draft":608},"\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":964,"title":965,"description":966,"published":961,"category":604,"image":967,"draft":608},"\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":969,"title":970,"description":971,"published":972,"category":604,"image":973,"draft":608},"\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":975,"title":976,"description":977,"published":978,"category":726,"image":979,"draft":608},"\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":981,"title":982,"description":983,"published":984,"category":604,"image":985,"draft":608},"\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":987,"title":988,"description":989,"published":984,"category":726,"image":990,"draft":608},"\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":500,"title":992,"description":993,"published":994,"category":726,"image":995,"draft":608},"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":997,"title":998,"description":999,"published":994,"category":604,"image":1000,"draft":608},"\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",1791705957971]