[{"data":1,"prerenderedAt":304},["ShallowReactive",2],{"blog-de-source-maps-exposed-in-production":3},{"id":4,"title":5,"body":6,"category":261,"cover":262,"coverAlt":262,"description":263,"draft":264,"extension":265,"faq":266,"image":282,"keywords":283,"meta":291,"navigation":292,"ogTitle":293,"path":294,"published":295,"seo":296,"stem":297,"tldr":298,"updated":295,"__hash__":303},"blog_de\u002Fblog\u002Fsource-maps-exposed-in-production.md","Source-Maps öffentlich: deine App veröffentlicht ihren Quellcode",{"type":7,"value":8,"toc":250},"minimark",[9,13,16,21,24,27,30,44,48,51,54,65,71,74,78,81,107,110,118,122,125,128,136,139,143,146,149,154,161,165,168,171,181,196,203,207,235,242],[10,11,12],"p",{},"Du hast deine App gescannt, und eine Zeile des Berichts sagt, dein\nOriginal-Quellcode sei veröffentlicht. Oder jemand mit Technik-Hintergrund hat\nauf deiner Seite F12 gedrückt und dir gesagt, deine Source-Maps seien\nöffentlich. So oder so klingt es auf eine bestimmte, persönliche Art schlimm:\nDas, woran du monatelang gebaut hast, liegt offenbar offen herum, Kommentare\ninklusive.",[10,14,15],{},"Die alarmierte Lesart und das Achselzucken sind beide falsch. Eine Source-Map\nist kein Geheimnis. Sie ist eine Karte (der Name ist wörtlich gemeint) zu der\nStelle, an der deine Geheimnisse lägen, falls je welche in deinen Code geraten\nsind. Ob deine eine Rolle spielt, hängt davon ab, was drinsteht, und das\nnachzusehen dauert etwa 30 Sekunden.",[17,18,20],"h2",{"id":19},"ist-es-schlimm-dass-deine-source-maps-öffentlich-sind","Ist es schlimm, dass deine Source-Maps öffentlich sind?",[10,22,23],{},"Es ist etwas, das du diese Woche reparieren solltest. Es ist selten etwas,\nwegen dem du heute Nacht in Panik geraten musst.",[10,25,26],{},"Was eine öffentliche Source-Map zeigt, ist Code, und deine App gibt ihren Code\nohnehin jedem Besucher mit, komprimiert zu einem unlesbaren Block, aber\nvorhanden, denn so funktioniert das Web. Ein geduldiger Fremder mit den\nrichtigen Werkzeugen könnte aus der komprimierten Datei allein eine grobe\nFassung rekonstruieren. Die Karte macht die Geduld überflüssig: Mit ihr liest\njeder, der F12 drückt, dein Projekt so aufgeräumt, wie es in deinem Editor\naussieht.",[10,28,29],{},"Unser Scanner stuft eine veröffentlichte Source-Map als Medium ein, die Mitte\nder Skala, und diese Einordnung ist Absicht. Für sich genommen ist lesbarer\nCode ein Verlust an Privatsphäre: Jemand kann studieren, wie deine App\nfunktioniert, deine halbfertigen Features lesen, deine Ideen übernehmen.\nUnangenehm, und für eine App, deren Wert ein cleverer Prompt oder ein\nungewöhnlicher Ablauf ist, ein echtes Geschäftsproblem. Aber keine offene\nKasse.",[10,31,32,33,38,39,43],{},"Das Gewicht ändert sich an dem Tag, an dem dein Code etwas enthält, das nie\nCode hätte sein dürfen. Ein Schlüssel, der als Teil deiner App läuft, landet\nauch in der komprimierten Datei. Die Karte macht ihn leichter auffindbar, aber\nveröffentlicht war er schon vorher, und das ist\n",[34,35,37],"a",{"href":36},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","ein eigener, größerer Befund",".\nKommentare sind anders. Die Komprimierung löscht sie aus dem, was ausgeliefert\nwird, also ist die Karte der einzige öffentliche Ort, an dem ein Kommentar\nexistiert. Ein Passwort in einer auskommentierten Zeile, eine\n",[40,41,42],"code",{},"remove before launch","-Notiz über dem Ding, das nie entfernt wurde, eine\ninterne Adresse, die du dir neben der Funktion notiert hast, die sie aufruft:\nall das kann ein Fremder nirgendwo erreichen außer in der Karte.",[17,45,47],{"id":46},"was-eine-source-map-eigentlich-ist","Was eine Source-Map eigentlich ist",[10,49,50],{},"Sie ist die Übersetzung zwischen dem Code, den deine Seite ausliefert, und dem\nCode, den du geschrieben hast.",[10,52,53],{},"Wenn deine App veröffentlicht wird, komprimiert der Build-Schritt deinen Code:\njede Datei zusammengepresst, jeder Name auf ein, zwei Buchstaben verkürzt,\njeder Kommentar entfernt, das Ganze auf einer einzigen riesigen Zeile. Browser\nführen das klaglos aus. Lesen kann es niemand, auch die Werkzeuge nicht, die\nes gebaut haben, und das wird zum Problem, sobald etwas abstürzt und der Fehler\nauf Zeile 1, Zeichen 48.120 einer Datei zeigt, die kein Mensch je gesehen hat.",[10,55,56,57,60,61,64],{},"Also schreiben Build-Tools eine zweite Datei, die Source-Map. Sie liegt neben\nder komprimierten (",[40,58,59],{},"app.js"," bekommt ",[40,62,63],{},"app.js.map",") und enthält alles, was die\nKomprimierung weggeworfen hat: deine Originaldateien, ihre Namen, ihre\nOrdnerstruktur und jeden Kommentar. Die letzte Zeile der komprimierten Datei\nträgt die Adresse der Karte, und ein Browser lädt die Karte, sobald seine\nEntwicklertools aufgehen. Das ist der ganze Entwurf. Es gibt sie, damit ein\nFehler auf den Code zeigen kann, den du wirklich geschrieben hast.",[66,67],"diagram",{"alt":68,"caption":69,"src":70},"Links eine komprimierte Bundle-Datei als Wand aus unlesbaren Strichen, darunter ihre Source-Map-Datei. Ein Pfeil führt nach rechts zu derselben App als lesbarem Projekt: ein src-Ordner, Komponenten-Dateien und Codezeilen, von denen zwei Kommentarzeilen bernsteinfarben hervorgehoben sind.","Die komprimierte Datei ist das, was deine Besucher ausführen. Die Karte verwandelt sie zurück in das Projekt, das du geschrieben hast. Die Kommentare, aus dem Bundle entfernt, existieren nur auf der lesbaren Seite.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fwhat-the-map-reveals-1600x720.png",[10,72,73],{},"Aus diesem Entwurf folgen zwei Dinge. Deine Besucher laden die Karte nie\nherunter (ein Browser fragt erst danach, wenn Entwicklertools offen sind),\nalso kostet eine veröffentlichte Karte nichts, ändert nichts am Bildschirm und\nmeldet sich nie von selbst. Und alles, was deine Seite öffnen kann, kann die\nKarte laden, denn die Adresse steht in der Seite und davor steht kein Login. Ob\ndie Datei dort liegt, ist eine Build-Einstellung, und von außen sieht\nangeschaltet exakt so aus wie ausgeschaltet, bis jemand nachsieht.",[17,75,77],{"id":76},"so-prüfst-du-deine-app-in-30-sekunden","So prüfst du deine App in 30 Sekunden",[10,79,80],{},"Auf deiner Live-App, der veröffentlichten Adresse, die deine Nutzer besuchen,\nnicht der Vorschau in deinem Builder:",[82,83,84,88,96],"ol",{},[85,86,87],"li",{},"Öffne die App in Chrome, Edge oder Firefox und drücke F12. Das öffnet die\nEntwicklertools des Browsers, dasselbe Panel, das ein Fremder benutzen\nwürde.",[85,89,90,91,95],{},"Klicke oben im Panel auf den Reiter ",[92,93,94],"strong",{},"Sources",".",[85,97,98,99,102,103,106],{},"Lies den Dateibaum links. Komprimierter Code sieht aus wie ein, zwei Dateien\nmit Namen wie ",[40,100,101],{},"index-4f81ab2c.js",". Source-Maps sehen aus wie dein Projekt:\nein Ordner namens ",[40,104,105],{},"src",", Dateien mit den Namen deiner Seiten und\nKomponenten, und darin Code, den du tatsächlich lesen kannst.",[10,108,109],{},"Wenn du dort eine Datei öffnen und deine eigenen Kommentare sehen kannst, sind\ndeine Source-Maps veröffentlicht. Der Browser zeichnet diesen Baum nur, weil er\ndie Karte von deiner Live-Seite geladen hat, genau so, wie es der Browser\njedes anderen täte.",[10,111,112,113,117],{},"Wenn du lieber nicht in Panels herumstocherst: Unser kostenloser Scan liest\ndeine Live-Seite von außen und meldet diesen Check zusammen mit acht weiteren:\n",[34,114,116],{"href":115},"\u002F#scan","App scannen",". Er dauert etwa 20 Sekunden und braucht kein Konto.",[17,119,121],{"id":120},"was-ein-fremder-sehen-kann-und-was-nicht","Was ein Fremder sehen kann, und was nicht",[10,123,124],{},"Alles, was du in die App selbst geschrieben hast, und nichts darüber hinaus.",[10,126,127],{},"Veröffentlichte Source-Maps zeigen dein Frontend: deine Seiten, deine\nKomponenten, die Logik, die im Browser läuft, die Namen der Routen, die deine\nApp aufruft, jeden Prompt, den du in die App geschrieben hast, und jeden\nKommentar.",[10,129,130,131,135],{},"An deinen Server reichen sie nicht heran. Code, der in einer Edge-Funktion oder\neinem Backend läuft, bleibt, wo er ist. Auch deine Datenbank öffnen sie nicht.\nOb ein Fremder deine Tabellen lesen kann, entscheiden die Regeln auf jeder\nTabelle, nicht die Sichtbarkeit deines Codes, und\n",[34,132,134],{"href":133},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","diese Frage haben wir separat gemessen",",\nan denselben Apps.",[10,137,138],{},"In der Praxis kommt der Schaden einer veröffentlichten Karte als stilles\nMitlesen, nicht als dramatischer Einbruch: Jemand studiert deine\nCheckout-Logik auf der Suche nach einem Weg drumherum, oder findet eine\nAdmin-Route, die nie jemand verlinkt hat, und probiert sie aus. Jedes davon\nwird nur dann zum Problem, wenn das Gefundene ungeschützt war. Die Karte ist\nein Wegweiser für Fremde; sie ist nicht selbst die offene Tür.",[17,140,142],{"id":141},"wie-oft-veröffentlichte-source-maps-vorkommen","Wie oft veröffentlichte Source-Maps vorkommen",[10,144,145],{},"Im August 2026 haben wir 30.998 aktive Apps gescannt, veröffentlicht mit\nLovable, Base44, Replit, v0 und Bolt. Jede achte (13 %) lieferte mindestens\neine funktionierende Source-Map aus.",[10,147,148],{},"Wir zählen eine Karte nur, wenn sie tatsächlich antwortet. Die Adresse am Ende\neiner komprimierten Datei beweist für sich nichts, denn viele Builds schreiben\ndie Adresse und laden die Datei nie hoch; unser Scanner folgt ihr und prüft,\ndass eine echte Karte zurückkommt. Und wo der Check nicht abgeschlossen werden\nkonnte, haben wir festgehalten, dass er nicht abgeschlossen werden konnte.\nEine App, die wir nicht prüfen konnten, ist unbekannt, nicht sauber.",[66,150],{"alt":151,"caption":152,"src":153},"Eine komprimierte Bundle-Datei, die mit der Zeile sourceMappingURL=index-4f81.js.map endet, darunter zwei mögliche Ausgänge. Im einen liefert die Anfrage nach der Karte 200 mit einer JSON-Datei und trägt ein bernsteinfarbenes Kreuz: Der Code ist veröffentlicht. Im anderen kommt 404 zurück, markiert mit einem grünen Haken.","Die Adresse allein beweist nichts. Der Befund ist eine Karte, die antwortet. Ein 404 unter dieser Adresse heißt, die Einstellung ist aus, egal was die letzte Zeile des Bundles sagt.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fdoes-the-map-answer-1600x640.png",[10,155,156,157,160],{},"Zwei andere Zahlen aus demselben Sweep rücken diese hier zurecht. Das Leck, vor\ndem Betreiber am häufigsten gewarnt werden (ein geheimer Schlüssel in der\nSeite, die Sorte, die jede Datenbankregel ignoriert), kam in diesen 30.998 Apps\n3-mal vor. Und eine Datenbanktabelle, die jeder Fremde lesen kann, fand sich in\n",[34,158,159],{"href":133},"mehr als der Hälfte der Apps, bei denen wir diese Prüfung abschließen konnten",".\nÖffentliche Source-Maps liegen dazwischen: weit häufiger als das berühmte Leck,\nweit weniger direkt schädlich als die offene Tabelle. Genau das versucht ein\nMedium-Befund dir zu sagen.",[17,162,164],{"id":163},"so-schaltest-du-source-maps-in-der-produktion-aus","So schaltest du Source-Maps in der Produktion aus",[10,166,167],{},"Eine Build-Einstellung, dann ein neues Deployment.",[10,169,170],{},"Wenn ein Builder deine App gebaut hat, sag es ihm in einfachen Worten, auf\nEnglisch, darin sind die Builder am zuverlässigsten:",[172,173,178],"pre",{"className":174,"code":176,"language":177},[175],"language-text","Disable source map generation for production builds and redeploy.\n","text",[40,179,176],{"__ignoreMap":180},"",[10,182,183,184,187,188,191,192,195],{},"Verwaltest du den Code selbst, liegt die Einstellung in der\nBuild-Konfiguration. In einem Vite-Projekt (und das steckt unter den meisten\nLovable- und Bolt-Apps) ist das ",[40,185,186],{},"build.sourcemap: false"," in der ",[40,189,190],{},"vite.config",";\neine Nuxt-App hat ihre eigene ",[40,193,194],{},"sourcemap","-Option. Deploye neu und wiederhole\ndann den 30-Sekunden-Check: Der lesbare Dateibaum unter Sources sollte weg\nsein, und nur die komprimierten Namen sollten übrig bleiben.",[10,197,198,199,202],{},"Zwei Dinge noch, bevor du das als erledigt ablegst. Karten auszuschalten holt\ndie Kopien nicht zurück. Wer deine Karte geladen hat, solange sie oben war,\nhat deinen Code so, wie er an dem Tag war. Lies also deinen eigenen Quelltext,\nbevor du dich entspannst: Steht irgendwo ein Schlüssel, ein Passwort oder sonst\netwas, das nicht öffentlich sein dürfte,\n",[34,200,201],{"href":36},"rotiere es jetzt","; die Karte\nzu entfernen schließt die Tür für neue Leser, nicht für das, was schon kopiert\nwurde. Und die Einstellung kann zurückkommen: Ein Template-Update, eine neu\ngenerierte Konfiguration oder ein neues Deployment-Ziel kann Karten wieder\nanschalten, ohne dass du irgendetwas angefasst hast.",[17,204,206],{"id":205},"was-du-jetzt-tun-solltest","Was du jetzt tun solltest",[208,209,210],"key-takeaways",{},[211,212,213,219,226,229,232],"ul",{},[85,214,215,216,218],{},"Drücke F12 auf deiner Live-App, öffne Sources und suche nach einem Ordner namens ",[40,217,105],{},". Lesbare Dateien mit deinen eigenen Kommentaren heißen: Deine Source-Maps sind veröffentlicht.",[85,220,221,222,225],{},"Schalte sie mit einer Anweisung an deinen Builder aus (disable source maps for production builds and redeploy) oder setze selbst ",[40,223,224],{},"sourcemap: false"," in der Build-Konfiguration.",[85,227,228],{},"Lies, was die Karte gezeigt hat, bevor du dich entspannst. Ein Schlüssel oder Passwort irgendwo in deinem Quelltext heißt: heute rotieren, denn die Karte zu entfernen holt bereits gemachte Kopien nicht zurück.",[85,230,231],{},"Lass Source-Maps in der Entwicklung in Ruhe. Sie tun dort ihre Arbeit, und zur Debatte steht nur die veröffentlichte Seite.",[85,233,234],{},"Wiederhole den 30-Sekunden-Check nach Template-Updates und großen Deployments. Diese Einstellung hat die Angewohnheit, von selbst zurückzukommen.",[10,236,237,238,95],{},"Diese letzte Gewohnheit ist die, die verrutscht, denn nichts sieht anders aus,\nwenn sich die Antwort ändert. Reeve Care lässt genau diesen Scan nach Zeitplan\ngegen deine Live-App laufen, diesen Check eingeschlossen, und mailt dir, wenn\nein Ergebnis schlechter wird:\n",[34,239,241],{"href":240},"\u002F#pricing","was es beobachtet und was es kostet",[10,243,244,245,249],{},"Wenn du lieber alles in einem Rutsch schließt: Die\n",[34,246,248],{"href":247},"\u002Fchecklist","10-Minuten-Sicherheitscheckliste"," deckt das zusammen mit den\nanderen Türen ab, die in einer frisch gestarteten App einen Blick wert sind.",{"title":180,"searchDepth":251,"depth":251,"links":252},3,[253,255,256,257,258,259,260],{"id":19,"depth":254,"text":20},2,{"id":46,"depth":254,"text":47},{"id":76,"depth":254,"text":77},{"id":120,"depth":254,"text":121},{"id":141,"depth":254,"text":142},{"id":163,"depth":254,"text":164},{"id":205,"depth":254,"text":206},"Sicherheitsgrundlagen",null,"Eine öffentliche Source-Map lässt jeden den Originalcode deiner App lesen, Kommentare inklusive. Der 30-Sekunden-Check, und was wirklich zählt.",false,"md",[267,270,273,276,279],{"q":268,"a":269},"Mir wurde gesagt, meine Source-Maps seien öffentlich. Ist das ein Datenleck?","Nein. Eine Source-Map enthält deinen Code, nicht die Daten deiner Nutzer. Deine Datenbank steckt nicht darin und auch nichts von deinem Server. Ernst wird es erst, wenn der Code selbst etwas Geheimes enthält: einen Schlüssel, ein Passwort, eine interne Adresse. Lies, was wirklich in deinem steht, bevor du entscheidest, wie schlimm die Nachricht ist.",{"q":271,"a":272},"Kann jemand meine App stehlen, wenn meine Source-Maps öffentlich sind?","Man kann deinen Frontend-Code lesen (Seiten, Komponenten, Browser-Logik und Kommentare), und das macht das Kopieren deiner Ideen leichter, als es ohnehin schon war. Man bekommt aber weder deinen Server-Code noch deine Datenbank noch deine Nutzer. Für die meisten Apps ist das praktische Risiko nicht der Diebstahl des Codes, sondern das Geheimnis, das unterwegs in den Code geschrieben wurde.",{"q":274,"a":275},"Wie entferne ich Source-Maps aus meinem Produktions-Build?","Sag es deinem Builder in einfachen Worten: disable source map generation for production builds and redeploy. Verwaltest du den Code selbst, setze sourcemap in deiner Build-Konfiguration auf false (in einem Vite-Projekt ist das build.sourcemap in der vite.config) und deploye erneut. Prüfe danach mit F12: Der lesbare Dateibaum unter Sources sollte verschwunden sein.",{"q":277,"a":278},"Sind Source-Maps in der Entwicklung auch ein Problem?","Nein. Source-Maps sind für die Entwicklung da. Sie sorgen dafür, dass eine Fehlermeldung auf die echte Datei und Zeile zeigt, die du geschrieben hast, statt irgendwo in eine einzige riesige komprimierte Zeile. Deine Dev-Vorschau ist ein Ort, an den nur du schaust. Die einzige Frage, die zählt, ist, ob deine veröffentlichte Seite sie an die Welt ausliefert.",{"q":280,"a":281},"Mein Scan sagt, mein Original-Quellcode sei nicht veröffentlicht. Bin ich sicher?","Es heißt, dass keine funktionierende Source-Map geantwortet hat, als wir nachgesehen haben, mehr nicht. Dein komprimierter Code ist weiterhin öffentlich, wie bei jeder App, und ein späteres Deployment kann die Antwort still ändern. Genau deshalb lohnt es sich, den Check nach großen Änderungen zu wiederholen.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fcard-800x500.png",[284,285,286,287,288,289,290],"source maps öffentlich produktion","source map exposed","source maps entfernen produktion","ist es schlimm source maps zu veröffentlichen","öffentliche source maps","sourceMappingURL","vite sourcemap false",{},true,"Source-Maps öffentlich: veröffentlicht deine App ihren Code?","\u002Fblog\u002Fsource-maps-exposed-in-production","2026-08-18",{"title":5,"description":263},"blog\u002Fsource-maps-exposed-in-production",[299,300,301,302],"Eine öffentliche Source-Map lässt jeden den Original-Quellcode deiner App lesen (Komponenten, Logik und jeden Kommentar) direkt im Browser.","Für sich genommen ist das kein Datenleck. Code ist kein Geheimnis. Aber eine Source-Map ist eine Karte zu der Stelle, an der deine Geheimnisse lägen, falls je welche in deinen Code geraten sind.","Jede achte der 30.998 vibe-gecodeten Apps, die wir im August 2026 gescannt haben, veröffentlichte ihre Source-Maps.","Der Check dauert 30 Sekunden im Browser, und die Reparatur ist eine einzige Build-Einstellung.","NND80rnFIwNGSsW3R52ih8p3KvTpmFm99vXtz_eqMm0",1787826048205]