[{"data":1,"prerenderedAt":779},["ShallowReactive",2],{"blog-es-is-replit-safe":3,"blog-index-es":539},{"id":4,"title":5,"body":6,"category":497,"cover":498,"coverAlt":499,"description":500,"draft":501,"extension":502,"faq":503,"image":519,"keywords":520,"meta":528,"navigation":529,"ogTitle":5,"path":530,"published":531,"seo":532,"stem":533,"tldr":534,"updated":531,"__hash__":538},"blog_es\u002Fblog\u002Fis-replit-safe.md","¿Es seguro Replit? Lo que vimos en 3.042 aplicaciones Replit en vivo",{"type":7,"value":8,"toc":482},"minimark",[9,13,21,24,29,32,35,57,60,66,70,83,230,233,238,242,245,253,256,260,263,274,279,285,293,300,304,312,315,331,335,338,346,362,366,369,372,380,384,387,421,425,428,435,439,469],[10,11,12],"p",{},"Construiste algo en Replit, funciona, y estás a punto de meter a personas\nreales. En algún momento de esa semana escribiste «es seguro replit» en un\nbuscador, y lo que volvió fue o una página sobre las certificaciones de Replit\no una página sobre un agente de IA que borró una base de datos. Ninguna de las\ndos dijo una palabra sobre la aplicación que estás a punto de publicar.",[10,14,15,16,20],{},"Aquí está la parte en la que la mayoría de esas respuestas se equivocan: ",[17,18,19],"strong",{},"«¿es\nseguro Replit?» son tres preguntas en una sola frase",", y la que decide si unos\ndesconocidos pueden leer los datos de tus usuarios es la que casi nadie mide.",[10,22,23],{},"Nosotros podemos medirla. Entre el 12 y el 14 de agosto de 2026 pasamos 30.998\naplicaciones en vivo por las mismas nueve comprobaciones externas que cualquiera\npuede lanzar gratis en nuestra página de inicio, y 3.042 de ellas estaban\npublicadas en Replit. Esto es lo que salió para esas, y dónde se detiene nuestra\nvista.",[25,26,28],"h2",{"id":27},"es-seguro-replit","¿Es seguro Replit?",[10,30,31],{},"Como host, no era donde estaban los hallazgos. Las dos cosas que podemos ver del\nalojamiento desde fuera salieron limpias en cada aplicación que respondió, y las\nnueve aplicaciones con nota D o F llegaron ahí por algo dentro de la aplicación.",[10,33,34],{},"Piensa en Replit como en una tienda alquilada con un taller al fondo. El casero\nes dueño del edificio y de la cerradura de la puerta a la calle. Quien montó la\ntienda decidió dónde van las estanterías y cómo se comunica la trastienda con el\nfrente. Y lo que un transeúnte puede alcanzar desde la acera lo decides tú, cada\nvez que abres. Son tres preguntas distintas, y una buena respuesta a las dos\nprimeras no dice nada de la tercera.",[36,37,38,45,51],"ol",{},[39,40,41,44],"li",{},[17,42,43],{},"La plataforma."," Si Replit aloja tu aplicación como es debido: un\ncertificado válido, un dominio que no va a caducar, secretos cifrados y fuera\nde tus archivos. Este es el casero.",[39,46,47,50],{},[17,48,49],{},"El agente."," Si el código que escribe la IA de Replit es seguro. Este es el\ninstalador, y ningún escaneo desde fuera puede ver el cableado.",[39,52,53,56],{},[17,54,55],{},"La aplicación que publicaste."," Lo que un desconocido puede alcanzar desde\nla calle: una clave en el código que descarga un navegador, una ruta de API\nque responde sin iniciar sesión, un archivo que nunca debió tener una URL.",[10,58,59],{},"Nuestras comprobaciones leen la tercera. Sobre la primera, el certificado era\nválido en las 3.028 aplicaciones donde pudimos leer uno, y ningún dominio de\n3.042 estaba cerca de caducar. Sobre la segunda no tenemos nada que medir, y la\nsección dedicada más abajo lo dice.",[61,62],"diagram",{"alt":63,"caption":64,"src":65},"Tres paneles uno al lado del otro. El primero contiene el logotipo de Replit con un candado y un certificado al lado. El segundo contiene un símbolo de código con una chispa encima. El tercero contiene una página de navegador delante de un servidor, tres visitantes que se acercan a ella, y una lupa dibujada solo sobre ese panel, con el número 3.042 debajo.","Tres preguntas dentro de una sola búsqueda. Un escaneo desde fuera lee el tercer panel y nada de los otros dos.","\u002Fblog\u002Fis-replit-safe\u002Fthree-questions-1600x700.png",[25,67,69],{"id":68},"lo-que-encontramos-en-3042-aplicaciones-replit","Lo que encontramos en 3.042 aplicaciones Replit",[10,71,72,73,76,77,82],{},"Nueve comprobaciones, ejecutadas desde fuera, sin iniciar sesión y sin acceso a\nla cuenta de nadie. Nunca leímos una fila: donde una base de datos respondió, le\npreguntamos cuántas filas entregaría y paramos ahí. Ninguna aplicación se nombra\naquí ni en ningún otro sitio que publiquemos. Cada porcentaje de abajo es sobre\nlas aplicaciones en las que esa comprobación ",[17,74,75],{},"respondió",", porque una\ncomprobación que no pudo terminar es desconocida y no aprobada, y esa regla es\nla razón de que los denominadores cambien. El método y los datos están\n",[78,79,81],"a",{"href":80},"\u002Fresearch\u002Fvibe-coded-app-security-2026","en el informe",".",[84,85,86,103],"table",{},[87,88,89],"thead",{},[90,91,92,96,100],"tr",{},[93,94,95],"th",{},"Qué comprobamos",[93,97,99],{"align":98},"right","Aplicaciones Replit",[93,101,102],{},"Quién lo decide",[104,105,106,118,129,139,150,160,170,189,199,209,220],"tbody",{},[90,107,108,112,115],{},[109,110,111],"td",{},"Faltan cabeceras de seguridad del navegador",[109,113,114],{"align":98},"2.924 de 3.042 (96 %)",[109,116,117],{},"Lo que sirve la página",[90,119,120,123,126],{},[109,121,122],{},"Una ruta de API que respondió a un desconocido con datos",[109,124,125],{"align":98},"1.050 de 3.037 (35 %)",[109,127,128],{},"Tu aplicación",[90,130,131,134,137],{},[109,132,133],{},"Algo con forma de clave en el código que descarga un visitante",[109,135,136],{"align":98},"219 de 3.042 (7 %)",[109,138,128],{},[90,140,141,144,147],{},[109,142,143],{},"Código fuente original publicado (source maps)",[109,145,146],{"align":98},"168 de 3.041 (6 %)",[109,148,149],{},"Un ajuste de compilación",[90,151,152,155,158],{},[109,153,154],{},"Cualquier sitio web autorizado a llamar a tu API",[109,156,157],{"align":98},"76 de 3.037",[109,159,128],{},[90,161,162,165,168],{},[109,163,164],{},"Cualquier sitio web autorizado a llamarla con las cookies de tus usuarios",[109,166,167],{"align":98},"56 de 3.037",[109,169,128],{},[90,171,172,184,187],{},[109,173,174,175,179,180,183],{},"Un archivo privado como ",[176,177,178],"code",{},".env"," o ",[176,181,182],{},".git\u002Fconfig"," en una URL pública",[109,185,186],{"align":98},"7 de 3.023",[109,188,128],{},[90,190,191,194,197],{},[109,192,193],{},"Una tabla de la base de datos legible sin iniciar sesión",[109,195,196],{"align":98},"4 de 3.033",[109,198,128],{},[90,200,201,204,207],{},[109,202,203],{},"Un bucket de almacenamiento que lista sus archivos",[109,205,206],{"align":98},"0 de 3.035",[109,208,128],{},[90,210,211,214,217],{},[109,212,213],{},"Certificado caducado o no confiable",[109,215,216],{"align":98},"0 de 3.028",[109,218,219],{},"Replit",[90,221,222,225,228],{},[109,223,224],{},"Dominio a punto de caducar",[109,226,227],{"align":98},"0 de 3.042",[109,229,219],{},[10,231,232],{},"Las notas: 2.789 A, 183 B, 61 C, 8 D y 1 F. Treinta y una aplicaciones no\ntenían ningún hallazgo.",[61,234],{"alt":235,"caption":236,"src":237},"Siete barras horizontales en una misma escala, cada una precedida por un pequeño símbolo y terminada en un número: 2.924 para las cabeceras, 1.050 para las rutas abiertas, 219 para las claves, 168 para los source maps, 76 y 56 para los dos hallazgos cross-origin, y 7 para los archivos privados. La barra de arriba está en un gris pálido y el resto en turquesa, con el 7 dibujado como una línea fina con un anillo alrededor.","Una escala para las siete. La barra gris la decide el alojamiento. Cada barra turquesa salió de algo dentro de la aplicación.","\u002Fblog\u002Fis-replit-safe\u002Fwhat-we-found-1600x720.png",[25,239,241],{"id":240},"por-qué-el-99-tenía-un-hallazgo-dice-poco-aquí","Por qué «el 99 % tenía un hallazgo» dice poco aquí",[10,243,244],{},"Porque 2.924 de esos hallazgos son el mismo, y es la línea menos urgente que un\ninforme puede llevar.",[10,246,247,248,252],{},"Las cabeceras de seguridad del navegador las envía lo que sirve tu página. En el\ndominio propio de un builder eso es el builder, que es por lo que la cifra es\n96 % aquí, 99 % en Lovable y 100 % en v0, y por lo que cada aplicación en el\nmismo host recibe la misma respuesta. Replit es uno de los pocos sitios donde\npuedes cambiarlo: si tu aplicación corre su propio servidor, ese servidor es el\nque envía las cabeceras, y\n",[78,249,251],{"href":250},"\u002Fblog\u002Fmissing-security-headers","añadirlas son unas pocas líneas",". Merece la\npena, y no es de lo que está hecha una D.",[10,254,255],{},"Quita esa fila y 1.798 de las 3.042 aplicaciones no tenían nada que saliera de\nlo construido. Las otras 1.244 son donde vive el resto de este artículo.",[25,257,259],{"id":258},"el-hallazgo-con-forma-de-replit-una-ruta-de-api-propia","El hallazgo con forma de Replit: una ruta de API propia",[10,261,262],{},"Lo más común que encontramos y que un propietario había puesto ahí era una ruta\nen el propio servidor de la aplicación que respondía a un desconocido con datos.\n1.050 de 3.037 aplicaciones tenían al menos una.",[10,264,265,266,269,270,273],{},"Una aplicación Lovable es un front end más una base de datos que corre otro. Una\naplicación Replit suele ser la tienda entera: la página, y detrás un servidor\nque habla con la base de datos, en el mismo proyecto y a menudo escritos en la\nmisma sesión. La séptima de nuestras nueve comprobaciones lee las rutas de API\nescritas en el JavaScript de tu aplicación, ",[176,267,268],{},"\u002Fapi\u002Forders",", ",[176,271,272],{},"\u002Fapi\u002Fusers",", lo que\nencuentre, y le pregunta a cada una, sin iniciar sesión, si responde. En Lovable\neso saltó en 8 aplicaciones de 18.518, porque normalmente no hay un servidor del\npropietario al que preguntar. En Replit saltó en 1.050.",[61,275],{"alt":276,"caption":277,"src":278},"Dos aplicaciones dibujadas una junto a otra. A la izquierda, una página de navegador con una flecha discontinua que sale del panel hacia un cilindro de base de datos fuera de él, y el número 8 debajo. A la derecha, una página de navegador con un servidor dibujado detrás dentro del mismo panel, un visitante en el borde del panel que recibe un bloque de datos de ese servidor, y el número 1.050 debajo.","La aplicación de la izquierda no tiene un servidor propio que dejar abierto. La de la derecha sí, y ahí es donde están sus hallazgos.","\u002Fblog\u002Fis-replit-safe\u002Fthe-server-you-own-1600x640.png",[10,280,281,282,284],{},"Se califica como medio porque a veces eso es exactamente lo correcto. Una ruta\nque devuelve tu lista pública de productos debe responder a todo el mundo. Está\nmal cuando la ruta es ",[176,283,272],{}," y la respuesta son tus usuarios con sus\ndirecciones de correo, y te enteras porque cualquiera puede abrir esa dirección\nen una pestaña y leerla. Una ruta que debe ser privada necesita una comprobación\nde inicio de sesión, y todo el que no la tenga recibe un 401.",[10,286,287,288,292],{},"En la tienda, esta es la puerta trasera que se abre desde la calle. Si has usado\nSupabase, es el mismo fallo que has visto descrito como\n",[78,289,291],{"href":290},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","una tabla sin Row Level Security",",\ncon otra forma. Las filas se pueden leer porque nada entre el desconocido y los\ndatos preguntó quién era.",[10,294,295,296,82],{},"Dos hallazgos menores están al lado. 76 aplicaciones le dijeron a cualquier\nsitio web del mundo que podía llamar a su API, y otras 56 lo permitieron con las\ncookies de sesión del visitante adjuntas, que es la versión que deja a otro\nsitio actuar como tu usuario y\n",[78,297,299],{"href":298},"\u002Fblog\u002Fcors-wildcard-security-risk","la que rara vez es correcta",[25,301,303],{"id":302},"de-qué-está-hecho-el-7-envió-un-secreto","De qué está hecho «el 7 % envió un secreto»",[10,305,306,307,311],{},"Sobre todo de claves de Google. 219 de las 3.042 aplicaciones tenían algo con\nforma de clave en el código que descarga un visitante, y 200 de ellas eran una\nclave de API de Google, que suele estar bien una vez que se ha\n",[78,308,310],{"href":309},"\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend","restringido a tu propio dominio",".\nTreinta y dos llevaban un valor con forma de clave que no pudimos atribuir a un\nproveedor. Tres aplicaciones guardaban una clave que cobra a una cuenta\ndirectamente: una clave de OpenAI, Anthropic o AWS.",[10,313,314],{},"Tres de 3.042 es raro. También es el hallazgo que cuesta dinero por sí solo, la\nllave de la caja dejada sobre el mostrador, y suele aparecer como una factura de\nuso que llega antes de que nadie se haya dado cuenta. Un escáner que compara\nformas imprimiría las 219 como problemas; nosotros leemos lo que puede hacer\ncada clave, porque la alternativa es enseñarte a ignorar el aviso el día que\nimporta.",[10,316,317,318,322,323,326,327,330],{},"En Replit, el camino que toma una clave hasta el bundle es lo bastante concreto\ncomo para tener ",[78,319,321],{"href":320},"\u002Fblog\u002Freplit-secrets-explained","su propio artículo",". La\nherramienta Secrets mantiene un valor fuera de tus archivos, y lo hace bien. No\npuede mantenerlo fuera del navegador si es código del navegador el que lo lee,\ny la forma en que la gente lo hace funcionar es renombrar la variable a ",[176,324,325],{},"VITE_","\no ",[176,328,329],{},"NEXT_PUBLIC_",", que es una instrucción a la herramienta de compilación para\npublicarla.",[25,332,334],{"id":333},"los-dos-que-arreglas-con-un-ajuste","Los dos que arreglas con un ajuste",[10,336,337],{},"Los source maps y un archivo privado extraviado. Ambos se deciden en cómo se\ncompila el proyecto, y ambos son un ajuste y no una reescritura.",[10,339,340,341,345],{},"168 aplicaciones publicaban source maps, lo que significa que los archivos\noriginales detrás de la aplicación, comentarios incluidos, se pueden leer desde\nlas herramientas de desarrollo de cualquier navegador. En Replit la\nconfiguración de compilación está en tu proyecto, así que el interruptor es\ntuyo;\n",[78,342,344],{"href":343},"\u002Fblog\u002Fsource-maps-exposed-in-production","lo que expone y lo que no expone un map publicado","\nmerece leerse antes de decidir que no importa.",[10,347,348,349,351,352,354,355,357,358,361],{},"Siete aplicaciones servían un archivo privado desde una URL normal: un ",[176,350,178],{},",\nun ",[176,353,182],{},". Cinco de las nueve aplicaciones con nota D o F tenían este\nhallazgo, y es el camino más corto hacia un mal día de toda la lista, porque un\n",[176,356,178],{}," en una URL es cada clave que contiene en una sola petición. En una\nventana privada, abre tu dirección publicada con ",[176,359,360],{},"\u002F.env"," al final. Debe fallar.\nSi muestra texto, rota hoy cada clave de ese archivo y luego saca el archivo de\nlo que despliegas.",[25,363,365],{"id":364},"es-seguro-el-código-que-escribe-el-agente-de-replit","¿Es seguro el código que escribe el agente de Replit?",[10,367,368],{},"No lo medimos, y ningún escaneo desde fuera puede. Lo que un escaneo ve es el\nresultado: las 1.050 rutas abiertas y las tres claves que cobran las escribió\nalguien, un agente o una persona, y las publicó.",[10,370,371],{},"Lo que está documentado es un suceso. En julio de 2025 el agente de Replit\nborró una base de datos de producción en mitad de una sesión en la que se le\nhabía dicho que no cambiara nada, y el CEO de Replit lo reconoció públicamente;\nseparar las bases de datos de desarrollo de las de producción fue parte de la\nrespuesta de la empresa. Lo que se sigue para ti es lo mismo en cada builder con\nun agente dentro: mantén al agente lejos de la base de datos en producción, y\nguarda una copia de tus datos en algún sitio al que el agente no llegue.",[10,373,374,375,379],{},"Dónde vive esa copia depende de dónde estén tus datos. Si tu aplicación Replit\nlos guarda en Supabase, eso es ",[78,376,378],{"href":377},"\u002Fsupabase-backups","lo que Care conserva",". Si\nestán en la propia base de datos de Replit, no podemos respaldarla, y lo que\nconviene leer antes de necesitarlo es qué ofrece la herramienta de base de datos\nde Replit para restaurar. Solo 14 de las 3.042 aplicaciones Replit que\nescaneamos nombraban un proyecto de Supabase, así que para la mayoría aplica el\nsegundo caso.",[25,381,383],{"id":382},"la-comprobación-de-cinco-minutos-de-tu-propia-aplicación-replit","La comprobación de cinco minutos de tu propia aplicación Replit",[10,385,386],{},"Cada una es una URL que abres o una búsqueda que lanzas. Usa una ventana\nprivada, para que tu propia sesión no responda por un desconocido.",[36,388,389,399,402,411,414],{},[39,390,391,392,394,395,398],{},"Abre tu dirección publicada con ",[176,393,360],{}," al final, y luego ",[176,396,397],{},"\u002F.git\u002Fconfig",".\nAmbas deben fallar. Si alguna muestra texto, rota hoy cada clave que\ncontenga.",[39,400,401],{},"Abre de la misma forma una de tus propias rutas de API, una que no querrías\nque leyera un desconocido. Si responde, esa ruta necesita una comprobación de\ninicio de sesión.",[39,403,404,405,407,408,410],{},"Busca ",[176,406,325],{}," y ",[176,409,329],{}," en tu proyecto. Cada coincidencia es un valor\nque tu herramienta de compilación publica a propósito, y cada uno tiene que\nser una clave que era seguro publicar.",[39,412,413],{},"Abre tu aplicación en vivo y luego la pestaña Sources de las herramientas de\ndesarrollo del navegador. Si puedes leer tus archivos originales con sus\ncomentarios, los source maps están activados.",[39,415,416,417,82],{},"O deja que lo haga el escaneo. Ejecuta estas cuatro y cinco más desde fuera,\ntarda unos 20 segundos, no necesita cuenta, e imprime «No se pudo comprobar»\npara todo lo que no pudo responder en vez de una marca de verificación:\n",[78,418,420],{"href":419},"\u002Fsecurity-scanner","escanea tu aplicación",[25,422,424],{"id":423},"qué-cambia-después-de-volver-a-publicar","¿Qué cambia después de volver a publicar?",[10,426,427],{},"Cualquier cosa. Publicar en Replit es un solo gesto, así que un cambio está en\nvivo en el momento en que lo haces, y no hay ningún paso de despliegue entre tú\ne internet que atrape una ruta que perdió su comprobación de sesión o una clave\npegada a medianoche para pasar una compilación que fallaba. Un escaneo que\nhiciste el mes pasado describe la aplicación del mes pasado.",[10,429,430,434],{},[78,431,433],{"href":432},"\u002Fpricing","Reeve Monitor"," está hecho para esta forma de aplicación: alguien que\npasa por delante de la tienda cada hora y prueba las puertas. Vuelve a ejecutar\nlas nueve comprobaciones cada hora en hasta tres aplicaciones, vigila la\ndisponibilidad cada 60 segundos, te avisa cuando un resultado cambia en vez de\nesperar a que mires, y envía un informe mensual. Cuesta $12 al mes a precio de\nlista, con siete días gratis antes de cobrarte; la página de precios a veces\nestá por debajo de la cifra de aquí y nunca por encima. Monitor vigila y nada\nmás, que para una aplicación Replit suele ser la mitad correcta: Care, nuestro\nplan de copias de seguridad, guarda únicamente una copia de una base de datos\nde Supabase, y la mayoría de las aplicaciones Replit tienen sus datos en otro\nsitio.",[25,436,438],{"id":437},"qué-hacer-esta-semana","Qué hacer esta semana",[440,441,442],"key-takeaways",{},[443,444,445,453,456,463,466],"ul",{},[39,446,447,448,407,450,452],{},"Abre ",[176,449,360],{},[176,451,397],{}," en tu dirección publicada en una ventana privada. Ambas deben fallar.",[39,454,455],{},"Abre tus propias rutas de API sin iniciar sesión. Cualquier ruta que responda con datos privados necesita una comprobación de sesión, y un 401 para todos los demás.",[39,457,404,458,407,460,462],{},[176,459,325],{},[176,461,329],{}," en el proyecto. Cada coincidencia se publica a propósito y tiene que ser una clave que era seguro publicar.",[39,464,465],{},"Desactiva los source maps en tu configuración de compilación, salvo que quieras tus archivos originales legibles desde el navegador.",[39,467,468],{},"Mantén al agente lejos de la base de datos en producción, y guarda una copia de tus datos en algún sitio al que no llegue.",[10,470,471,472,476,477,481],{},"La guía en lenguaje llano para esta plataforma es\n",[78,473,475],{"href":474},"\u002Fis-your-replit-app-safe","¿es segura tu aplicación de Replit?",", y la\n",[78,478,480],{"href":479},"\u002Fchecklist","lista de seguridad de 10 minutos"," cubre lo que merece la pena\nconfirmar en cualquier aplicación recién lanzada.",{"title":483,"searchDepth":484,"depth":484,"links":485},"",3,[486,488,489,490,491,492,493,494,495,496],{"id":27,"depth":487,"text":28},2,{"id":68,"depth":487,"text":69},{"id":240,"depth":487,"text":241},{"id":258,"depth":487,"text":259},{"id":302,"depth":487,"text":303},{"id":333,"depth":487,"text":334},{"id":364,"depth":487,"text":365},{"id":382,"depth":487,"text":383},{"id":423,"depth":487,"text":424},{"id":437,"depth":487,"text":438},"Fundamentos de seguridad","\u002Fblog\u002Fis-replit-safe\u002Fcover-1200x630.png","El logotipo de Replit sobre una baldosa blanca, una flecha hacia una página con un servidor detrás, y otra flecha hacia tres visitantes.","¿Es seguro Replit? Pasamos 3.042 aplicaciones Replit en vivo por nueve comprobaciones externas. Los hallazgos estaban en la aplicación publicada, no en el host.",false,"md",[504,507,510,513,516],{"q":505,"a":506},"¿Es seguro Replit para un producto real?","Como host, nada en las 3.042 aplicaciones Replit en vivo que escaneamos apuntaba al alojamiento: cada certificado que pudimos leer era válido y ningún dominio estaba cerca de caducar. Los hallazgos que decidieron una nota estaban todos dentro de la aplicación que cada propietario publicó, y tienen la misma forma en cada builder que hemos medido. Que tu producto sea seguro ahí depende de lo que tu aplicación entrega a un visitante, y eso se comprueba en unos cinco minutos.",{"q":508,"a":509},"¿Los Replit Secrets son secretos de verdad?","Para el trabajo que hacen, sí. El valor se cifra y se mantiene fuera de los archivos del proyecto, así que compartir o hacer fork del proyecto no lo entrega. Lo que la herramienta no puede decidir es adónde lleva tu aplicación el valor después. Una clave leída por código que corre en la máquina de Replit se queda ahí. Una clave leída por código que corre en el navegador del visitante queda incrustada en lo que publicas, estuviera guardada donde estuviera, y una variable llamada VITE_ o NEXT_PUBLIC_ es exactamente eso.",{"q":511,"a":512},"¿La gente puede ver mi código fuente de Replit?","La mitad del navegador, siempre, porque un navegador no puede dibujar una página que no le han enviado. Que la vean como los archivos originales que escribiste o como salida comprimida depende de los source maps, que 168 de 3.041 aplicaciones Replit comprobadas estaban publicando. Tu código de servidor se queda en Replit, salvo que un archivo privado como .env o .git\u002Fconfig haya recibido una URL pública, que es lo que habían hecho 7 de 3.023 aplicaciones.",{"q":514,"a":515},"¿Una aplicación Replit desplegada es segura por defecto?","No hay un ajuste por defecto que la haga segura ni uno que la haga insegura. 2.789 de las 3.042 aplicaciones que escaneamos sacaron una A. Las que no tenían un hallazgo que salía de lo que se había construido: una ruta en su propio servidor que respondía sin iniciar sesión, una clave en el código descargado o un archivo privado en una dirección pública. Nada del alojamiento produjo una D o una F.",{"q":517,"a":518},"¿Cuál es el problema de seguridad más común en las aplicaciones Replit?","Dejando aparte las cabeceras, que faltan en casi toda aplicación de todo builder, es una ruta de API que responde a un desconocido con datos. 1.050 de las 3.037 aplicaciones Replit en las que esa comprobación pudo responder tenían al menos una. Una aplicación Replit suele llevar su propio servidor, así que tiene rutas propias que dejar abiertas, donde una aplicación Lovable normalmente no las tiene.","\u002Fblog\u002Fis-replit-safe\u002Fcard-800x500.png",[521,522,523,524,525,526,527],"es seguro replit","replit seguridad","aplicación replit segura","seguridad aplicaciones replit","son seguras las aplicaciones de replit","seguridad despliegue replit","is replit safe",{},true,"\u002Fblog\u002Fis-replit-safe","2026-09-15",{"title":5,"description":500},"blog\u002Fis-replit-safe",[535,536,537],"¿Es seguro Replit? Como host, no era donde estaban los hallazgos. Cada una de las nueve aplicaciones de 3.042 con nota D o F llegó ahí por algo dentro de la propia aplicación.","El hallazgo típico de Replit es una API propia: 1.050 de 3.037 aplicaciones tenían una ruta que entregaba datos a un desconocido sin iniciar sesión, porque una aplicación Replit suele salir con su propio servidor.","De 219 aplicaciones con algo con forma de clave en el código descargado, tres guardaban una clave que cobra a una cuenta. 2.789 de las 3.042 sacaron una A.","iNEvCMX36soZD63KNC-KG1gVcbo9FyEYZE4rmF5TZhA",[540,547,553,559,565,571,577,583,589,590,596,602,608,614,620,626,632,638,644,650,655,661,667,673,678,684,690,696,702,707,713,719,725,730,736,741,745,751,757,763,768,774],{"path":541,"title":542,"description":543,"published":544,"category":545,"image":546,"draft":501},"\u002Fblog\u002Fsupabase-backup-auth-users","Por qué tu dump de Supabase no tiene usuarios dentro","Ejecuta supabase db dump por sí solo y obtienes la forma de tu base de datos y ninguna de sus filas, sin el esquema auth donde viven tus usuarios.","2026-09-23","Backups","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":548,"title":549,"description":550,"published":551,"category":497,"image":552,"draft":501},"\u002Fblog\u002Fdomain-and-certificate-expiry","Dominio caducado, web caída: qué pasa a partir de ahora","Tu dominio caducó y tu web está caída. Aquí tienes el reloj que acaba de arrancar, por qué el certificado es el menor problema, y cómo comprobar ambos.","2026-09-22","\u002Fblog\u002Fdomain-and-certificate-expiry\u002Fcard-800x500.png",{"path":554,"title":555,"description":556,"published":557,"category":497,"image":558,"draft":501},"\u002Fblog\u002Fis-lovable-safe","¿Es seguro Lovable? Lo que vimos en 18.554 aplicaciones Lovable","¿Es seguro Lovable? Pasamos 18.554 aplicaciones Lovable por nueve comprobaciones. La plataforma fue la más limpia de cinco. Los hallazgos estaban dentro.","2026-09-21","\u002Fblog\u002Fis-lovable-safe\u002Fcard-800x500.png",{"path":560,"title":561,"description":562,"published":563,"category":497,"image":564,"draft":501},"\u002Fblog\u002Fvibe-coded-app-security-checklist","La lista de seguridad del vibe coding, en nueve comprobaciones","Una lista de seguridad del vibe coding con nueve puntos, cada uno verificable en tu app desde fuera por cualquiera, y cada uno con una prueba de una línea.","2026-09-20","\u002Fblog\u002Fvibe-coded-app-security-checklist\u002Fcard-800x500.png",{"path":566,"title":567,"description":568,"published":569,"category":497,"image":570,"draft":501},"\u002Fblog\u002Fstripe-secret-key-in-frontend","Una clave secreta de Stripe en tu frontend puede mover dinero","Una clave secreta de Stripe expuesta en tu frontend puede reembolsar, cobrar y leer cada ficha de cliente que tienes. Tu clave pk_live_ sí debe estar ahí.","2026-09-19","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Fcard-800x500.png",{"path":572,"title":573,"description":574,"published":575,"category":497,"image":576,"draft":501},"\u002Fblog\u002Fvite-and-next-public-env-vars","Variables de entorno de Vite expuestas: el prefijo dice publica esto","Variables de entorno de Vite expuestas en tu app: hicieron lo que pedía el prefijo. VITE_ y NEXT_PUBLIC_ significan publica esto, y la IA nunca supo el coste.","2026-09-18","\u002Fblog\u002Fvite-and-next-public-env-vars\u002Fcard-800x500.png",{"path":578,"title":579,"description":580,"published":581,"category":497,"image":582,"draft":501},"\u002Fblog\u002Fbase44-source-maps","Seguridad en Base44: qué marca un escaneo y qué te toca arreglar a ti","Seguridad en Base44 en 5.438 apps escaneadas: tres hallazgos en casi todas son de la plataforma, el source map es la insignia de Base44 y lo tuyo es poco.","2026-09-17","\u002Fblog\u002Fbase44-source-maps\u002Fcard-800x500.png",{"path":584,"title":585,"description":586,"published":587,"category":497,"image":588,"draft":501},"\u002Fblog\u002Fis-cursor-ai-safe","¿Es seguro Cursor AI? El editor, el código y la app que publicaste","¿Es seguro Cursor AI? Tres preguntas en una búsqueda: qué guarda Cursor, en qué falla el código que escribe y si la app que publicaste está abierta.","2026-09-16","\u002Fblog\u002Fis-cursor-ai-safe\u002Fcard-800x500.png",{"path":530,"title":5,"description":500,"published":531,"category":497,"image":519,"draft":501},{"path":591,"title":592,"description":593,"published":594,"category":545,"image":595,"draft":501},"\u002Fblog\u002Fsupabase-storage-backup","Supabase storage backup: tu copia de la base no tiene archivos","Un Supabase storage backup es una tarea aparte. Las copias de la base guardan la lista de tus archivos y ninguno de ellos, así que cada upload queda roto.","2026-09-14","\u002Fblog\u002Fsupabase-storage-backup\u002Fcard-800x500.png",{"path":597,"title":598,"description":599,"published":600,"category":545,"image":601,"draft":501},"\u002Fblog\u002Fsupabase-point-in-time-recovery","Point-in-time recovery de Supabase: precio y límites","El point-in-time recovery de Supabase rebobina tu base de datos a cualquier segundo de la última semana. Cuesta $100 al mes sobre Pro y solo cubre la base.","2026-09-13","\u002Fblog\u002Fsupabase-point-in-time-recovery\u002Fcard-800x500.png",{"path":603,"title":604,"description":605,"published":606,"category":545,"image":607,"draft":501},"\u002Fblog\u002Fsupabase-project-paused-recover","¿Proyecto de Supabase pausado? Tus datos siguen ahí","Supabase pausó tu proyecto tras una semana sin actividad. No se ha borrado nada, Restaurar está junto al nombre y tienes un año antes de que eso cambie.","2026-09-12","\u002Fblog\u002Fsupabase-project-paused-recover\u002Fcard-800x500.png",{"path":609,"title":610,"description":611,"published":612,"category":497,"image":613,"draft":501},"\u002Fblog\u002Fsafest-ai-app-builder","¿Qué builder de apps con IA es más seguro? 30.998 apps escaneadas","¿Qué builder de apps con IA es más seguro? Escaneamos 30.998 apps activas de Lovable, Base44, Replit, v0 y Bolt. El builder no es lo que decide tu nota.","2026-09-11","\u002Fblog\u002Fsafest-ai-app-builder\u002Fcard-800x500.png",{"path":615,"title":616,"description":617,"published":618,"category":497,"image":619,"draft":501},"\u002Fblog\u002Fenable-rls-on-every-supabase-table","Activa Row Level Security en cada tabla de Supabase y compruébalo","Activar Row Level Security en Supabase sin política cierra la tabla del todo. Una política sin el interruptor no hace nada. Aquí tienes el SQL y la prueba.","2026-09-10","\u002Fblog\u002Fenable-rls-on-every-supabase-table\u002Fcard-800x500.png",{"path":621,"title":622,"description":623,"published":624,"category":497,"image":625,"draft":501},"\u002Fblog\u002Fsupabase-rls-disabled-in-public","Supabase \"RLS disabled in public\": lo que el aviso no ve","Supabase marca \"RLS disabled in public\" como error. No dice nada de la política de lectura que deja tu tabla igual de abierta a cualquiera.","2026-09-09","\u002Fblog\u002Fsupabase-rls-disabled-in-public\u002Fcard-800x500.png",{"path":627,"title":628,"description":629,"published":630,"category":497,"image":631,"draft":501},"\u002Fblog\u002Frotate-supabase-service-role-key","Cómo rotar una clave service_role de Supabase filtrada","Supabase dice que primero cierres la fuga. Otras guías dicen que rotes ya. Cuál es lo correcto depende de dónde se filtró tu clave service_role.","2026-09-08","\u002Fblog\u002Frotate-supabase-service-role-key\u002Fcard-800x500.png",{"path":633,"title":634,"description":635,"published":636,"category":497,"image":637,"draft":501},"\u002Fblog\u002Fvibe-coding-security-scanners-compared","Escáneres de seguridad vibe coding comparados, el nuestro incluido","El mejor escáner de seguridad para vibe coding depende de tres preguntas que ninguna lista de funciones responde. Diez herramientas, con precios.","2026-09-07","\u002Fblog\u002Fvibe-coding-security-scanners-compared\u002Fcard-800x500.png",{"path":639,"title":640,"description":641,"published":642,"category":497,"image":643,"draft":501},"\u002Fblog\u002Fsupabase-security-checker","Supabase security checker: haz tú mismo las cinco comprobaciones","Un Supabase security checker lee tu app publicada en lugar de la configuración de tu proyecto. Estas son las cinco comprobaciones y cómo hacer cada una.","2026-09-06","\u002Fblog\u002Fsupabase-security-checker\u002Fcard-800x500.png",{"path":645,"title":646,"description":647,"published":648,"category":497,"image":649,"draft":501},"\u002Fblog\u002Fvibe-coding-security-scanner","Escáner de seguridad para vibe coding: qué se le escapa","Un escáner de seguridad para vibe coding lee tu app en vivo desde fuera. Qué cubre eso, las cuatro cosas que no puede ver y cómo leer el resultado.","2026-09-05","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fcard-800x500.png",{"path":250,"title":651,"description":652,"published":653,"category":497,"image":654,"draft":501},"Faltan cabeceras de seguridad: cuándo importa de verdad","Que falten cabeceras de seguridad es el hallazgo que más imprime nuestro escáner. Contra qué protegen y cuándo son la línea menos urgente de tu informe.","2026-09-04","\u002Fblog\u002Fmissing-security-headers\u002Fcard-800x500.png",{"path":656,"title":657,"description":658,"published":659,"category":497,"image":660,"draft":501},"\u002Fblog\u002Fopenai-api-key-exposed-in-frontend","Tu clave de API de OpenAI está expuesta en tu frontend. Rótala.","Una clave de API de OpenAI expuesta en tu frontend no se puede atar a un dominio. Rótala hoy, mueve la llamada a tu servidor y limita el gasto.","2026-09-03","\u002Fblog\u002Fopenai-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":662,"title":663,"description":664,"published":665,"category":497,"image":666,"draft":501},"\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps","Clave de API expuesta en el frontend: qué llevan 30.998 apps","Una clave de API expuesta en tu frontend suele ser una clave de Google Maps. Escaneamos 30.998 apps vibe-coded y contamos qué secretos se filtran de verdad.","2026-09-02","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps\u002Fcard-800x500.png",{"path":668,"title":669,"description":670,"published":671,"category":545,"image":672,"draft":501},"\u002Fblog\u002Fsupabase-backup-tools-compared","Herramientas de backup de Supabase comparadas, la nuestra incluida","Cuatro tipos de herramienta de backup de Supabase, qué copia cada una y cuándo una GitHub Action gratuita le gana a pagar a cualquiera, nosotros incluidos.","2026-09-01","\u002Fblog\u002Fsupabase-backup-tools-compared\u002Fcard-800x500.png",{"path":320,"title":674,"description":675,"published":676,"category":497,"image":677,"draft":501},"Cómo usar secrets en Replit, y qué se publica de todos modos","Cómo usar secrets en Replit: añadir uno, leerlo y arreglar las dos causas del undefined. Y las claves que la herramienta Secrets no puede mantener privadas.","2026-08-31","\u002Fblog\u002Freplit-secrets-explained\u002Fcard-800x500.png",{"path":679,"title":680,"description":681,"published":682,"category":545,"image":683,"draft":501},"\u002Fblog\u002Fback-up-supabase-free-tier","Backups del plan gratuito de Supabase: cómo hacer uno sin terminal","No hay backups en el plan gratuito de Supabase: la copia tienes que hacerla tú. Cómo sacarla desde el panel y qué deja fuera la vía CSV.","2026-08-30","\u002Fblog\u002Fback-up-supabase-free-tier\u002Fcard-800x500.png",{"path":685,"title":686,"description":687,"published":688,"category":497,"image":689,"draft":501},"\u002Fblog\u002Fis-supabase-secure","¿Supabase es seguro? Sí. Tu proyecto es otra pregunta","¿Supabase es seguro? La plataforma está auditada, cifrada y sometida a pentests. Su propia documentación dice dónde termina eso y empiezan tus ajustes.","2026-08-29","\u002Fblog\u002Fis-supabase-secure\u002Fcard-800x500.png",{"path":691,"title":692,"description":693,"published":694,"category":497,"image":695,"draft":501},"\u002Fblog\u002Fwhere-to-find-supabase-api-keys","Dónde están tus claves API de Supabase: anon, service_role y URL","La URL del proyecto, la clave anon y la clave service_role están en una sola página del panel. Aquí tienes dónde está, y cuál de los cuatro va en tu app.","2026-08-28","\u002Fblog\u002Fwhere-to-find-supabase-api-keys\u002Fcard-800x500.png",{"path":697,"title":698,"description":699,"published":700,"category":497,"image":701,"draft":501},"\u002Fblog\u002Fnew-row-violates-row-level-security-policy","New row violates row-level security policy en Supabase. ¿Y ahora?","\"New row violates row-level security policy\" significa que Supabase rechazó una escritura. El arreglo rápido vuelve a abrir la tabla para cualquiera.","2026-08-27","\u002Fblog\u002Fnew-row-violates-row-level-security-policy\u002Fcard-800x500.png",{"path":298,"title":703,"description":704,"published":705,"category":497,"image":706,"draft":501},"¿Es un comodín CORS un riesgo de seguridad? Casi nunca.","¿Es un comodín CORS un riesgo de seguridad? Casi siempre es el ajuste por defecto de tu builder y no entrega nada que tu servidor no diera ya a cualquiera.","2026-08-26","\u002Fblog\u002Fcors-wildcard-security-risk\u002Fcard-800x500.png",{"path":708,"title":709,"description":710,"published":711,"category":545,"image":712,"draft":501},"\u002Fblog\u002Fsupabase-branching-is-not-a-backup","Supabase branching no es un backup. Solo va hacia adelante.","Por qué el branching de Supabase no es un backup: una rama arranca sin tus datos y un merge solo mueve el esquema. Para qué sirve y qué usar en su lugar.","2026-08-25","\u002Fblog\u002Fsupabase-branching-is-not-a-backup\u002Fcard-800x500.png",{"path":714,"title":715,"description":716,"published":717,"category":545,"image":718,"draft":501},"\u002Fblog\u002Fhow-to-restore-a-supabase-backup","Cómo restaurar un backup de Supabase, y qué se rompe después","Cómo restaurar un backup de Supabase desde el panel o desde un archivo de volcado, qué reemplaza la restauración y por qué tu app puede seguir rota al terminar.","2026-08-24","\u002Fblog\u002Fhow-to-restore-a-supabase-backup\u002Fcard-800x500.png",{"path":720,"title":721,"description":722,"published":723,"category":497,"image":724,"draft":501},"\u002Fblog\u002Fsupabase-storage-bucket-public","Tu bucket de Supabase Storage es público. ¿Es un problema?","Un bucket público de Supabase Storage significa que quien tenga la URL de un archivo puede abrirlo. No significa que alguien pueda listar lo que hay dentro.","2026-08-23","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcard-800x500.png",{"path":309,"title":726,"description":727,"published":728,"category":497,"image":729,"draft":501},"¿Es un problema una clave de API de Google en tu frontend?","Una clave de API de Google en tu frontend es la clave que más encuentra nuestro escáner, y casi siempre no pasa nada. Un ajuste gratuito decide cuál es cuál.","2026-08-22","\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":731,"title":732,"description":733,"published":734,"category":545,"image":735,"draft":501},"\u002Fblog\u002Fai-agent-deleted-my-database","Un agente de IA borró mis datos de Supabase. ¿Qué puedo recuperar?","Un agente de IA borró datos de tu base. Lo que puedes recuperar ya estaba decidido antes de que se ejecutara, y los próximos minutos deciden el resto.","2026-08-21","\u002Fblog\u002Fai-agent-deleted-my-database\u002Fcard-800x500.png",{"path":290,"title":737,"description":738,"published":739,"category":497,"image":740,"draft":501},"¿Puede cualquiera leer tu base de datos Supabase? 3.680 apps","¿Puede cualquiera leer tu base de datos Supabase sin iniciar sesión? Escaneamos 30.998 apps activas hechas con builders de IA y medimos cuántas dicen que sí.","2026-08-18","\u002Fblog\u002Fcan-anyone-read-your-supabase-database\u002Fcard-800x500.png",{"path":343,"title":742,"description":743,"published":739,"category":497,"image":744,"draft":501},"Source maps expuestos: tu app está publicando su código original","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.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fcard-800x500.png",{"path":746,"title":747,"description":748,"published":749,"category":497,"image":750,"draft":501},"\u002Fblog\u002Fsupabase-new-api-keys","Las nuevas claves de API de Supabase: ¿cuál va en tu app?","Supabase sustituyó anon y service_role por claves publicables y secretas. ¿Cuál pertenece a tu app y cuál no debe estar nunca?","2026-08-12","\u002Fblog\u002Fsupabase-new-api-keys\u002Fcard-800x500.png",{"path":752,"title":753,"description":754,"published":755,"category":545,"image":756,"draft":501},"\u002Fblog\u002Fdoes-supabase-back-up-my-database","¿Supabase respalda mi base de datos? Depende de tu plan.","¿Supabase respalda tu base de datos? A diario en los planes de pago, y nada en el gratuito. Cómo saber cuál tienes y qué es lo que esa copia no cubre.","2026-08-11","\u002Fblog\u002Fdoes-supabase-back-up-my-database\u002Fcard-800x500.png",{"path":758,"title":759,"description":760,"published":761,"category":497,"image":762,"draft":501},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","Supabase Row Level Security está activado. Tu tabla sigue pública.","Activar Supabase Row Level Security no protege una tabla. Lo hacen tus políticas, y la que arregló tu app rota puede dejar entrar a cualquiera.","2026-08-10","\u002Fblog\u002Fsupabase-rls-on-but-table-still-public\u002Fcard-800x500.png",{"path":764,"title":765,"description":766,"published":761,"category":545,"image":767,"draft":501},"\u002Fblog\u002Fversion-history-is-not-a-backup","El historial de versiones no es un backup. No recupera una tabla.","Lovable y Bolt guardan un historial de versiones de tu código. Tu base de datos es un servicio aparte, y volver atrás no te devuelve tus datos.","\u002Fblog\u002Fversion-history-is-not-a-backup\u002Fcard-800x500.png",{"path":769,"title":770,"description":771,"published":772,"category":545,"image":773,"draft":501},"\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database","Tres formas de respaldar una base Supabase, y qué falta en cada una","El panel, pg_dump y un servicio gestionado. Qué guarda de verdad cada uno, qué deja fuera sin avisar y cuál sobrevive a perder la cuenta.","2026-08-09","\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database\u002Fcard-800x500.png",{"path":775,"title":776,"description":777,"published":772,"category":497,"image":778,"draft":501},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","Qué claves de API son seguras en el navegador y cuáles no","Tu clave anon de Supabase está pensada para ser pública. Tu clave service_role no, y se salta todas las reglas que pongas. Cómo distinguirlas.","\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend\u002Fcard-800x500.png",1790150954068]