[{"data":1,"prerenderedAt":305},["ShallowReactive",2],{"blog-es-source-maps-exposed-in-production":3},{"id":4,"title":5,"body":6,"category":262,"cover":263,"coverAlt":263,"description":264,"draft":265,"extension":266,"faq":267,"image":283,"keywords":284,"meta":292,"navigation":293,"ogTitle":294,"path":295,"published":296,"seo":297,"stem":298,"tldr":299,"updated":296,"__hash__":304},"blog_es\u002Fblog\u002Fsource-maps-exposed-in-production.md","Source maps expuestos: tu app está publicando su código original",{"type":7,"value":8,"toc":251},"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,243],[10,11,12],"p",{},"Escaneaste tu app y una línea del informe dice que tu código fuente original\nestá publicado. O alguien con perfil técnico pulsó F12 en tu sitio y te dijo\nque tus source maps están expuestos. En cualquiera de los dos casos suena mal\nde una forma concreta y personal: lo que llevas meses construyendo está, por lo\nvisto, tirado a la vista de todos, comentarios incluidos.",[10,14,15],{},"La lectura alarmante y el encogerse de hombros están equivocadas las dos. Un\nsource map no es un secreto. Es un mapa (el nombre es literal) hacia donde\nestarían tus secretos, si alguna vez alguno acabó escrito en tu código. Que el\ntuyo importe depende de lo que haya dentro, y comprobarlo tarda unos 30\nsegundos.",[17,18,20],"h2",{"id":19},"es-malo-que-tus-source-maps-estén-expuestos","¿Es malo que tus source maps estén expuestos?",[10,22,23],{},"Es algo que conviene arreglar esta semana. Rara vez es motivo de pánico esta\nnoche.",[10,25,26],{},"Lo que revela un source map expuesto es código, y tu app ya entrega su código a\ncada visitante, comprimido en un bloque ilegible, pero presente, porque así\nfunciona la web. Un extraño paciente, con las herramientas adecuadas, podría\nreconstruir una versión aproximada a partir del archivo comprimido solo. El\nmapa elimina el requisito de paciencia: con él, cualquiera que pulse F12 lee tu\nproyecto tal y como se ve en tu editor.",[10,28,29],{},"Nuestro escáner clasifica un source map publicado como medio, el centro de la\nescala de severidad, y esa colocación es deliberada. Por sí solo, el código\nlegible es una pérdida de privacidad: alguien puede estudiar cómo funciona tu\napp, leer tus funciones a medio hacer, tomar prestadas tus ideas. Desagradable,\ny para una app cuyo valor es un prompt ingenioso o un flujo poco común, un\nproblema de negocio real. No una caja abierta.",[10,31,32,33,38,39,43],{},"El peso cambia el día en que tu código contiene algo que nunca debió ser\ncódigo. Una clave que corre como parte de tu app acaba también en el archivo\ncomprimido. El mapa la hace más fácil de encontrar, pero ya estaba publicada,\ny eso es\n",[34,35,37],"a",{"href":36},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","su propio hallazgo, más grave",".\nLos comentarios son distintos. La compresión los borra de lo que se envía, así\nque el mapa es el único lugar público donde un comentario existe. Una\ncontraseña en una línea comentada, una nota de ",[40,41,42],"code",{},"remove before launch"," sobre lo\nque nunca llegó a quitarse, una dirección interna que apuntaste junto a la\nfunción que la llama: nada de eso está al alcance de un extraño salvo en el\nmapa.",[17,45,47],{"id":46},"qué-es-en-realidad-un-source-map","Qué es en realidad un source map",[10,49,50],{},"Es la traducción entre el código que tu sitio envía y el código que tú\nescribiste.",[10,52,53],{},"Cuando tu app se publica, el paso de build comprime tu código: todos los\narchivos apretados en uno, cada nombre reducido a una o dos letras, cada\ncomentario eliminado, todo en una única línea enorme. Los navegadores lo\nejecutan sin quejarse. Nadie puede leerlo, tampoco las herramientas que lo\nconstruyeron, y eso se vuelve un problema en cuanto algo falla y el error\nseñala la línea 1, carácter 48.120, de un archivo que ningún humano ha visto\njamás.",[10,55,56,57,60,61,64],{},"Así que las herramientas de build escriben un segundo archivo, el source map.\nVa junto al comprimido (",[40,58,59],{},"app.js"," recibe su ",[40,62,63],{},"app.js.map",") y guarda todo lo que\nla compresión tiró: tus archivos originales, sus nombres, su estructura de\ncarpetas y cada comentario. La última línea del archivo comprimido lleva la\ndirección del mapa, y un navegador lo descarga cuando se abren sus herramientas\nde desarrollo. Ese es todo el diseño. Existe para que un error pueda señalar el\ncódigo que escribiste de verdad.",[66,67],"diagram",{"alt":68,"caption":69,"src":70},"A la izquierda, un archivo de bundle comprimido dibujado como un muro de rayas ilegibles, con su archivo de source map debajo. Una flecha lleva a la derecha, a la misma app convertida en un proyecto legible: una carpeta src, archivos de componentes y líneas de código donde dos líneas de comentario están resaltadas en ámbar.","El archivo comprimido es lo que ejecutan tus visitantes. El mapa lo convierte de vuelta en el proyecto que escribiste. Los comentarios, eliminados del bundle, solo existen en el lado legible.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fwhat-the-map-reveals-1600x720.png",[10,72,73],{},"De ese diseño se siguen dos cosas. Tus visitantes nunca descargan el mapa (un\nnavegador solo lo pide cuando se abren las herramientas de desarrollo), así\nque un mapa publicado no cuesta nada, no cambia nada en pantalla y nunca se\nanuncia. Y cualquier cosa que pueda abrir tu sitio puede descargar el mapa,\nporque la dirección está escrita en la página y delante no hay ningún login.\nQue el archivo esté ahí es un ajuste de build, y desde fuera, activado se ve\nexactamente igual que desactivado hasta que alguien va a mirar.",[17,75,77],{"id":76},"cómo-comprobar-tu-app-en-30-segundos","Cómo comprobar tu app en 30 segundos",[10,79,80],{},"En tu app en vivo, la dirección publicada que visitan tus usuarios, no la\nvista previa dentro de tu builder:",[82,83,84,88,96],"ol",{},[85,86,87],"li",{},"Abre la app en Chrome, Edge o Firefox y pulsa F12. Eso abre las herramientas\nde desarrollo del navegador, el mismo panel que usaría un extraño.",[85,89,90,91,95],{},"Haz clic en la pestaña ",[92,93,94],"strong",{},"Sources",", en la parte superior del panel.",[85,97,98,99,102,103,106],{},"Lee el árbol de archivos de la izquierda. El código comprimido se ve como\nuno o dos archivos con nombres tipo ",[40,100,101],{},"index-4f81ab2c.js",". Los source maps se\nven como tu proyecto: una carpeta llamada ",[40,104,105],{},"src",", archivos con los nombres de\ntus páginas y componentes, y dentro código que puedes leer de verdad.",[10,108,109],{},"Si puedes abrir un archivo ahí y ver tus propios comentarios, tus source maps\nestán publicados. El navegador solo dibuja ese árbol porque descargó el mapa de\ntu sitio en vivo, exactamente igual que lo haría el navegador de cualquier otra\npersona.",[10,111,112,113,117],{},"Si prefieres no hurgar en paneles, nuestro scan gratuito lee tu sitio en vivo\ndesde fuera e informa de esta comprobación junto con otras ocho:\n",[34,114,116],{"href":115},"\u002F#scan","escanea tu app",". Tarda unos 20 segundos y no necesita cuenta.",[17,119,121],{"id":120},"qué-puede-ver-un-extraño-y-qué-no","Qué puede ver un extraño, y qué no",[10,123,124],{},"Todo lo que escribiste dentro de la propia app, y nada más allá.",[10,126,127],{},"Los source maps publicados revelan tu frontend: tus páginas, tus componentes,\nla lógica que corre en el navegador, los nombres de las rutas que llama tu app,\ncualquier prompt que escribieras dentro de la app y cada comentario.",[10,129,130,131,135],{},"No llegan a tu servidor. El código que corre en una edge function o en un\nbackend se queda donde está. Tampoco abren tu base de datos. Que un extraño\npueda leer tus tablas lo deciden las reglas de cada tabla, no que tu código sea\nvisible, y\n",[34,132,134],{"href":133},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","esa pregunta la medimos por separado","\nen las mismas apps.",[10,137,138],{},"En la práctica, el daño de un mapa publicado llega como lectura silenciosa, no\ncomo un asalto dramático: alguien estudia tu lógica de pago buscando una forma\nde rodearla, o encuentra una ruta de administración que nadie enlazó jamás y la\nprueba. Cada una de esas cosas solo se convierte en problema si lo encontrado\nestaba desprotegido. El mapa es una guía para el extraño; no es, en sí mismo,\nla puerta abierta.",[17,140,142],{"id":141},"con-qué-frecuencia-aparecen-source-maps-publicados","Con qué frecuencia aparecen source maps publicados",[10,144,145],{},"En agosto de 2026 escaneamos 30.998 apps en vivo publicadas desde Lovable,\nBase44, Replit, v0 y Bolt. Una de cada ocho (el 13 %) servía al menos un\nsource map en funcionamiento.",[10,147,148],{},"Solo contamos un mapa cuando responde de verdad. La dirección al final de un\narchivo comprimido no demuestra nada por sí sola, porque muchos builds escriben\nla dirección y nunca suben el archivo; nuestro escáner la sigue y comprueba que\nvuelve un mapa real. Y donde la comprobación no pudo completarse, registramos\nque no pudo completarse. Una app que no pudimos comprobar es desconocida, no\nlimpia.",[66,150],{"alt":151,"caption":152,"src":153},"Un archivo de bundle comprimido que termina en la línea sourceMappingURL=index-4f81.js.map, con dos desenlaces posibles dibujados debajo. En uno, la petición del mapa devuelve 200 con un archivo JSON y lleva una cruz ámbar: el código está publicado. En el otro devuelve 404, marcado con un tic verde.","La dirección sola no demuestra nada. El hallazgo es un mapa que responde. Un 404 en esa dirección significa que el ajuste está apagado, diga lo que diga la última línea del bundle.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fdoes-the-map-answer-1600x640.png",[10,155,156,157,160],{},"Otros dos números del mismo barrido ponen este en su sitio. La fuga sobre la\nque más se avisa a los dueños (una clave secreta en la página, de las que\nignoran todas las reglas de la base de datos) apareció 3 veces en esas 30.998\napps. Y una tabla de base de datos legible por cualquier extraño apareció en\n",[34,158,159],{"href":133},"más de la mitad de las apps donde pudimos completar esa comprobación",".\nLos source maps expuestos quedan entre las dos: mucho más comunes que la fuga\nfamosa, mucho menos dañinos de forma directa que la tabla abierta. Que es\nexactamente lo que una severidad media intenta decirte.",[17,162,164],{"id":163},"cómo-apagar-los-source-maps-en-producción","Cómo apagar los source maps en producción",[10,166,167],{},"Un ajuste de build, y después un redespliegue.",[10,169,170],{},"Si tu app la hizo un builder, díselo en palabras llanas, en inglés, que es\ndonde los builders son más fiables:",[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],{},"Si gestionas el código tú, el ajuste vive en la configuración de build. En un\nproyecto Vite (que es lo que hay debajo de la mayoría de las apps de Lovable y\nBolt) es ",[40,185,186],{},"build.sourcemap: false"," en ",[40,189,190],{},"vite.config","; una app Nuxt tiene su\npropia opción ",[40,193,194],{},"sourcemap",". Vuelve a desplegar y repite la comprobación de 30\nsegundos: el árbol de archivos legible bajo Sources debería haber desaparecido,\ny solo deberían quedar los nombres comprimidos.",[10,197,198,199,202],{},"Dos remates antes de dar esto por hecho. Apagar los mapas no recupera las\ncopias. Quien descargara tu mapa mientras estuvo arriba sigue teniendo tu\ncódigo tal y como era ese día. Así que lee tu propio código antes de relajarte:\nsi en algún sitio hay escrita una clave, una contraseña o cualquier otra cosa\nque no debería ser pública,\n",[34,200,201],{"href":36},"rótala ahora","; quitar el mapa\ncierra la puerta a lectores nuevos, no a lo que ya se copió. Y el ajuste puede\nvolver: una actualización de plantilla, una configuración regenerada o un\nnuevo destino de despliegue puede reactivar los mapas sin que toques nada.",[17,204,206],{"id":205},"qué-hacer-ahora-mismo","Qué hacer ahora mismo",[208,209,210],"key-takeaways",{},[211,212,213,219,226,229,232],"ul",{},[85,214,215,216,218],{},"Pulsa F12 en tu app en vivo, abre Sources y busca una carpeta llamada ",[40,217,105],{},". Archivos legibles con tus propios comentarios significan que tus source maps están publicados.",[85,220,221,222,225],{},"Apágalos con una instrucción a tu builder (disable source maps for production builds and redeploy) o pon tú ",[40,223,224],{},"sourcemap: false"," en la configuración de build.",[85,227,228],{},"Lee lo que el mapa estaba revelando antes de relajarte. Una clave o contraseña en cualquier parte de tu código significa rotarla hoy, porque quitar el mapa no recupera las copias ya hechas.",[85,230,231],{},"Deja en paz los source maps de desarrollo. Están haciendo su trabajo, y lo único en cuestión es el sitio publicado.",[85,233,234],{},"Repite la comprobación de 30 segundos tras actualizaciones de plantilla y despliegues grandes. Este ajuste tiene la costumbre de volver a activarse solo.",[10,236,237,238,242],{},"Ese último hábito es el que se escapa, porque nada se ve distinto cuando la\nrespuesta cambia. Reeve Care vuelve a ejecutar este mismo scan contra tu app en\nvivo según un calendario, esta comprobación incluida, y te escribe cuando un\nresultado empeora: ",[34,239,241],{"href":240},"\u002F#pricing","qué vigila y cuánto cuesta",".",[10,244,245,246,250],{},"Si prefieres cerrarlo todo de una sentada, la\n",[34,247,249],{"href":248},"\u002Fchecklist","checklist de seguridad de 10 minutos"," cubre esto junto con las\notras puertas que conviene revisar en una app recién lanzada.",{"title":180,"searchDepth":252,"depth":252,"links":253},3,[254,256,257,258,259,260,261],{"id":19,"depth":255,"text":20},2,{"id":46,"depth":255,"text":47},{"id":76,"depth":255,"text":77},{"id":120,"depth":255,"text":121},{"id":141,"depth":255,"text":142},{"id":163,"depth":255,"text":164},{"id":205,"depth":255,"text":206},"Fundamentos de seguridad",null,"Un source map expuesto deja que cualquiera lea el código original de tu app, comentarios incluidos. La comprobación de 30 segundos y lo que de verdad importa.",false,"md",[268,271,274,277,280],{"q":269,"a":270},"Me han dicho que mis source maps están expuestos. ¿Es una brecha de datos?","No. Un source map contiene tu código, no los datos de tus usuarios. Tu base de datos no está dentro, y tampoco nada de tu servidor. Se vuelve serio solo cuando el propio código guarda algo secreto: una clave, una contraseña, una dirección interna. Lee lo que hay escrito de verdad en el tuyo antes de decidir lo grave que es la noticia.",{"q":272,"a":273},"¿Pueden robarme la app si mis source maps son públicos?","Pueden leer tu código de frontend (páginas, componentes, la lógica del navegador y los comentarios), y eso hace más fácil copiar las ideas de tu app de lo que ya era. No consiguen tu código de servidor, ni tu base de datos, ni tus usuarios. Para la mayoría de las apps el riesgo práctico no es el robo del código; es el secreto que acabó escrito en el código por el camino.",{"q":275,"a":276},"¿Cómo quito los source maps de mi build de producción?","Díselo a tu builder en palabras llanas: disable source map generation for production builds and redeploy. Si gestionas el código tú, el ajuste está en la configuración de build: en un proyecto Vite es build.sourcemap en vite.config; ponlo en false y vuelve a desplegar. Después vuelve a comprobar con F12: el árbol de archivos legible bajo Sources debería haber desaparecido.",{"q":278,"a":279},"¿Los source maps en desarrollo también son un problema?","No. Los source maps existen para el desarrollo. Son lo que hace que un error señale el archivo y la línea reales que escribiste, en vez de algún punto de una única línea comprimida enorme. Tu vista previa de desarrollo es un sitio que solo miras tú. La única pregunta que importa es si tu sitio publicado se los sirve al mundo.",{"q":281,"a":282},"Mi scan dice que mi código fuente original no está publicado. ¿Estoy a salvo?","Significa que ningún source map en funcionamiento respondió cuando miramos, nada más. Tu código comprimido sigue siendo público, como el de todas las apps, y un despliegue posterior puede cambiar la respuesta sin avisar, y por eso vale la pena repetir la comprobación después de cambios grandes.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fcard-800x500.png",[285,286,287,288,289,290,291],"source maps expuestos producción","source map expuesto","quitar source maps de producción","es malo publicar source maps","source maps públicos","sourceMappingURL","vite sourcemap false",{},true,"Source maps expuestos: ¿tu app publica su código?","\u002Fblog\u002Fsource-maps-exposed-in-production","2026-08-18",{"title":5,"description":264},"blog\u002Fsource-maps-exposed-in-production",[300,301,302,303],"Un source map expuesto deja que cualquiera lea el código fuente original de tu app (componentes, lógica y cada comentario) directamente desde su navegador.","Por sí solo no es una brecha. El código no es un secreto. Pero un source map es un mapa hacia donde estarían tus secretos, si alguna vez alguno acabó escrito en tu código.","Una de cada ocho de las 30.998 apps vibe-codeadas que escaneamos en agosto de 2026 estaba publicando sus source maps.","La comprobación tarda 30 segundos en tu navegador, y el arreglo es un único ajuste de build.","M6V0BEgqets9VLzncFXPifprEDfBHd_7ZImWHUOo-wU",1787826048206]