[{"data":1,"prerenderedAt":654},["ShallowReactive",2],{"blog-es-vibe-coding-security-scanner":3,"blog-index-es":411},{"id":4,"title":5,"body":6,"category":364,"cover":365,"coverAlt":366,"description":367,"draft":368,"extension":369,"faq":370,"image":388,"keywords":389,"meta":399,"navigation":400,"ogTitle":401,"path":402,"published":403,"seo":404,"stem":405,"tldr":406,"updated":403,"__hash__":410},"blog_es\u002Fblog\u002Fvibe-coding-security-scanner.md","Escáner de seguridad para vibe coding: qué se le escapa",{"type":7,"value":8,"toc":352},"minimark",[9,13,21,24,29,32,35,38,41,45,48,126,132,135,144,148,151,157,163,169,175,178,182,185,188,193,196,209,213,216,277,284,287,291,294,297,300,310,314,336,344],[10,11,12],"p",{},"Pegas la dirección de tu app en un escáner, esperas unos veinte segundos y\nvuelve una letra. A, quizá C. Y entonces llega la pregunta que de verdad\nimporta: ¿significa esto que mi app está bien?",[10,14,15,16,20],{},"Esta es la parte que la mayoría de herramientas de esta categoría te dejan\naveriguar sola. ",[17,18,19],"strong",{},"Un escáner de seguridad para vibe coding lee tu app desde la\ncalle."," Ve lo que ve el navegador de cualquier visitante, que resulta ser\nmuchísimo, y se detiene en tu puerta. Lo que tu servidor hace en privado sigue\nsiendo privado también para él.",[10,22,23],{},"Saber por dónde pasa esa línea es lo que hace que un escaneo valga la pena. Una\nA te dice que las puertas que dan a la calle estaban cerradas cuando miramos, y\nno dice absolutamente nada sobre la habitación de detrás.",[25,26,28],"h2",{"id":27},"qué-es-un-escáner-de-seguridad-para-vibe-coding","¿Qué es un escáner de seguridad para vibe coding?",[10,30,31],{},"Una herramienta que carga tu app en vivo como lo haría un visitante y luego lee\nlo que volvió.",[10,33,34],{},"Le das una URL. No pide tu código fuente, ni tu repositorio, ni la contraseña de\ntu base de datos, ni una cuenta en el builder que usaste. Trae tu página, deja\ncorrer el JavaScript para poder ver el código que tu app envía de verdad, lee las\ncabeceras que llegaron con la respuesta, mira tu certificado y le hace a tu base\nde datos y a tu almacenamiento de archivos unas cuantas preguntas que podría\nhacer cualquier desconocido.",[10,36,37],{},"Luego anota qué respondió. Esa es toda la forma del asunto, y por eso tarda\nveinte segundos en lugar de una semana.",[10,39,40],{},"Esta categoría existe porque las apps hechas con Lovable, Bolt, v0, Cursor,\nReplit, Windsurf y Base44 se tuercen en el mismo puñado de sitios, y casi todos\nesos sitios se ven desde fuera. Una clave secreta en el bundle. Una tabla que le\nresponde a un desconocido. Un bucket de almacenamiento que lista su propio\ncontenido. Nadie necesita tu código fuente para encontrar ninguno, porque tu app\nse los tiende a cada visitante por diseño.",[25,42,44],{"id":43},"qué-lee-realmente-un-escaneo","Qué lee realmente un escaneo",[10,46,47],{},"Cinco superficies, y tus propios visitantes descargan cuatro de ellas sin\nnotarlo.",[49,50,51,67],"table",{},[52,53,54],"thead",{},[55,56,57,61,64],"tr",{},[58,59,60],"th",{},"Qué lee",[58,62,63],{},"De dónde sale eso",[58,65,66],{},"Qué atrapa",[68,69,70,82,93,104,115],"tbody",{},[55,71,72,76,79],{},[73,74,75],"td",{},"Tu bundle de JavaScript",[73,77,78],{},"Los archivos que un navegador descarga para ejecutar tu app",[73,80,81],{},"Claves enviadas al navegador, las rutas de API que llama, nombres de tablas que usa",[55,83,84,87,90],{},[73,85,86],{},"Tus cabeceras de respuesta",[73,88,89],{},"Van con cada página que sirve tu alojamiento",[73,91,92],{},"Protecciones del navegador ausentes, una regla que responde a peticiones de cualquier web",[55,94,95,98,101],{},[73,96,97],{},"Las respuestas de tu base",[73,99,100],{},"La misma API de proyecto que llama tu propia app",[73,102,103],{},"Una tabla que entrega filas a una petición sin nadie con sesión iniciada",[55,105,106,109,112],{},[73,107,108],{},"Tus buckets de almacenamiento",[73,110,111],{},"La misma API pública de almacenamiento por la que tu app sube",[73,113,114],{},"Un bucket que le lista sus propios archivos a un desconocido",[55,116,117,120,123],{},[73,118,119],{},"Certificado y dominio",[73,121,122],{},"El apretón de manos TLS y el registro público del registro",[73,124,125],{},"Un certificado a punto de caducar, un dominio a punto de vencer",[127,128],"diagram",{"alt":129,"caption":130,"src":131},"Una marca de escáner a la izquierda alcanza cinco paneles mediante líneas continuas de color de acento. Una línea vertical cruza la imagen, y detrás de ella hay cuatro paneles más dibujados como contornos discontinuos, cada uno con su línea deteniéndose en la barra y llevando allí una cruz.","Cinco superficies llegan a un navegador, así que un escaneo puede leerlas. Las cuatro de detrás de la barra nunca salen de tu servidor, así que nada de fuera puede.","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fwhere-the-scan-stops-1600x820.png",[10,133,134],{},"El bundle es el que sorprende a la gente. El código de tu app tiene que llegar al\nnavegador antes de poder ejecutarse ahí, así que también llega cada clave que\nlleva dentro, junto con las rutas de API que llama y a menudo los nombres de las\ntablas que lee. Un escáner pulsa el mismo F12 que pulsaría un visitante curioso.\nSolo es más rápido, y lee todos los archivos en lugar del primero.",[10,136,137,138,143],{},"La pregunta a la base de datos es la que todo el mundo espera que sea invasiva, y\nes lo más manso de la lista. Para averiguar si una tabla es legible por\ndesconocidos, el nuestro le pide a la API un recuento de filas y lee el número en\nuna cabecera de respuesta. Un recuento mayor que cero significa que esas filas\nson alcanzables. Nunca se trae ninguna fila, y la clave con la que pregunta es la\npublicable que ya está en tu bundle, que\n",[139,140,142],"a",{"href":141},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","se supone que está ahí",".",[25,145,147],{"id":146},"las-cuatro-cosas-que-un-escaneo-de-url-no-puede-ver","Las cuatro cosas que un escaneo de URL no puede ver",[10,149,150],{},"Todo lo que ocurre en tu servidor, porque nada de eso se envía nunca a un\nnavegador.",[10,152,153,156],{},[17,154,155],{},"Tu código de servidor."," Edge functions, rutas de API, funciones de base de\ndatos, todo lo que corre dentro de Supabase o en tu alojamiento. Un escáner puede\nllamar a un endpoint y leer lo que vuelve. No puede leer el código que lo produjo,\nasí que un fallo que solo aparece con ciertas entradas queda invisible.",[10,158,159,162],{},[17,160,161],{},"Tus variables de entorno."," Las claves que dejaste en el servidor, que es justo\nsu sitio. Un escaneo puede decirte que no encontró un secreto en tu bundle. No\npuede confirmar que el secreto esté bien guardado, porque nunca ve el lugar donde\nlo guardaste.",[10,164,165,168],{},[17,166,167],{},"Tu historial de versiones."," Una clave que subiste en marzo y quitaste en abril\nya no está en tu app y sigue en tu repositorio. Cualquiera que pueda ver ese\nrepositorio puede seguir leyéndola, y por mucho que se mire tu sitio en vivo no\nva a aparecer.",[10,170,171,174],{},[17,172,173],{},"La lógica de tu propia app."," Si un usuario con sesión iniciada puede abrir el\npedido de otro cambiando un número en la dirección. Si un formulario aceptará un\nprecio que le mandó el navegador. Son decisiones que tu app toma sobre lo que\npermite, y pillarlas exige iniciar sesión y probar cosas, que es un test de\nintrusión.",[10,176,177],{},"Hay un quinto límite que es nuestro y no de la categoría, y vale la pena\nconocerlo antes de leer uno de nuestros informes. Supabase ya no le sirve la\nlista de tablas de un proyecto a una clave publicable, así que un escáner no tiene\nforma de preguntar cómo se llaman tus tablas. El nuestro trabaja en su lugar con\ntres fuentes: el índice del proyecto en proyectos más antiguos donde todavía\nresponde, los nombres de tablas que encuentra en tu propio bundle, y una lista de\nveintiséis nombres habituales en apps hechas con vibe coding. Una tabla abierta\ncon un nombre poco común que nunca aparece en tu código de frontend es una a la\nque no llegaremos. El advisor del propio Supabase sí llega, y esa es la\ncomparación de dos secciones más abajo.",[25,179,181],{"id":180},"un-escaneo-limpio-significa-que-mi-app-es-segura","¿Un escaneo limpio significa que mi app es segura?",[10,183,184],{},"No. Significa que toda pregunta que el escaneo pudo hacer desde fuera volvió\nlimpia, y esa es una frase más pequeña de lo que suena.",[10,186,187],{},"Parte del motivo son los cuatro puntos ciegos de arriba. La otra parte es que una\ncomprobación puede terminar de tres maneras y solo una de ellas es un aprobado.\nUna comprobación encuentra algo. Una comprobación pregunta y recibe un no claro.\nO una comprobación no recibe respuesta alguna, porque la petición expiró, el host\nla rechazó o la página nunca terminó de cargar.",[127,189],{"alt":190,"caption":191,"src":192},"Un panel de informe con cinco filas. Tres llevan una marca de verificación verde, una lleva una cruz roja, y la última tiene una línea discontinua donde iría una marca y ningún veredicto.","El tercer final es el que hay que buscar. Una comprobación que no obtuvo respuesta se dibuja como una ausencia de respuesta, porque una marca ahí es una promesa sobre una pregunta que nadie llegó a hacer.","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fthree-endings-1600x760.png",[10,194,195],{},"Ese tercer final es el que decide si un informe merece confianza, y es el más\nfácil de redondear discretamente a una marca verde. El nuestro escribe «No se\npudo comprobar» en la línea y deja tu nota en paz. Una marca falsa sería lo más\ndañino que este escáner podría poner en una pantalla, porque actuarías sobre\nella.",[10,197,198,199,203,204,208],{},"Esa misma honestidad es lo que hace que nuestras propias cifras publicadas sean\nmenos alarmantes de lo que parecen a primera vista. Entre el 12 y el 14 de agosto\nde 2026 pasamos estas comprobaciones sobre\n",[139,200,202],{"href":201},"\u002Fresearch\u002Fvibe-coded-app-security-2026","30.998 apps en vivo hechas con vibe coding",",\ny el 99 % volvió con al menos un hallazgo. Casi todo eso es una sola línea:\ncabeceras de seguridad del navegador que la plataforma de alojamiento nunca pone,\ny que la mayoría de propietarios en un subdominio de builder\n",[139,205,207],{"href":206},"\u002Fblog\u002Fmissing-security-headers","no pueden activar por su cuenta",". Contarlas es\ncorrecto. Leer el 99 % como «casi todas las apps están en peligro» no lo es.",[25,210,212],{"id":211},"escaneo-de-url-de-repositorio-o-el-advisor-de-supabase","¿Escaneo de URL, de repositorio o el advisor de Supabase?",[10,214,215],{},"Leen tres cosas distintas, así que la pregunta útil es cuál de ellos puede ver el\nproblema que tienes.",[49,217,218,233],{},[52,219,220],{},[55,221,222,225,227,230],{},[58,223,224],{},"Tipo",[58,226,60],{},[58,228,229],{},"Qué te pide",[58,231,232],{},"Dónde está ciego",[68,234,235,249,263],{},[55,236,237,240,243,246],{},[73,238,239],{},"Escáner de URL",[73,241,242],{},"Tu app en vivo, desde fuera",[73,244,245],{},"Una URL",[73,247,248],{},"Todo lo que tu servidor se guarda para sí",[55,250,251,254,257,260],{},[73,252,253],{},"Escáner de repositorio",[73,255,256],{},"Tu código fuente y su historial",[73,258,259],{},"Acceso a tu repo",[73,261,262],{},"Si ese código está desplegado y qué hacen tus reglas en producción",[55,264,265,268,271,274],{},[73,266,267],{},"Supabase Security Advisor",[73,269,270],{},"La configuración de ese proyecto",[73,272,273],{},"Tu cuenta de Supabase",[73,275,276],{},"Todo lo de fuera del proyecto: bundle, cabeceras, otros proveedores",[10,278,279,280,143],{},"Se solapan mucho menos de lo que sugieren los nombres. El advisor de Supabase\nrecorre tu proyecto e informa de problemas de configuración, entre ellos tablas\ncon la Row Level Security mal puesta. Un escaneo de URL lee la consecuencia, que\nes si esas filas están llegando ahora mismo a desconocidos. Las dos se separan\nmás a menudo de lo que esperarías, porque\n",[139,281,283],{"href":282},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","activar el ajuste no es lo mismo que estar protegido",[10,285,286],{},"Un escáner de repositorio es el único de los tres que puede encontrar la clave\nque borraste el mes pasado. También es el único que no puede decirte si el código\nque acaba de leer es el que tienes desplegado.",[25,288,290],{"id":289},"cómo-leer-la-nota","Cómo leer la nota",[10,292,293],{},"La letra queda limitada por el peor hallazgo del informe, así que una buena\npuntuación nunca rescata a uno grave.",[10,295,296],{},"Cada escaneo empieza en 100. Un hallazgo crítico cuesta 40 puntos, uno alto 15,\nuno medio 5, uno bajo 1. Después se posa un techo sobre la aritmética: un\nhallazgo crítico limita la nota a D, dos la limitan a F, y un solo hallazgo alto\nla limita a C. Una app por lo demás impecable con una única tabla abierta sale\ncomo D, y ese es el comportamiento buscado.",[10,298,299],{},"Lo que hiciste bien aparece en el informe y no te cuesta nada. Tu clave publicable\nde Supabase, ahí en tu bundle, figura como correcta, porque para eso está, y\npintarla de rojo es la manera en que una herramienta te enseña a ignorar el rojo.",[301,302,304],"callout",{"type":303},"warn",[10,305,306,309],{},[17,307,308],{},"Una nota describe la app que estaba en vivo cuando preguntaste."," La Row Level\nSecurity se desactiva para que cargue una página, una clave de servidor se pega\nen el frontend para que una función salga esta noche, un bucket se abre para una\nsubida y se queda abierto. Ninguno de esos se anuncia, y cada uno basta para\nmover una nota de A a F entre un martes y el siguiente.",[25,311,313],{"id":312},"qué-hacer-con-el-resultado-de-un-escaneo","Qué hacer con el resultado de un escaneo",[315,316,317],"key-takeaways",{},[318,319,320,324,327,330,333],"ul",{},[321,322,323],"li",{},"Lee primero las líneas que dicen «No se pudo comprobar». Esas son las preguntas que siguen abiertas, y no son aprobados.",[321,325,326],{},"Trabaja por gravedad. Un hallazgo crítico significa que hoy se puede llegar a tus datos; una cabecera ausente es un ajuste que nadie ha activado.",[321,328,329],{},"Ocúpate del interior aparte: guarda las claves secretas en el servidor, busca en tu propio historial de versiones las claves que borraste, e inicia sesión como usuario de prueba para ver hasta dónde llega.",[321,331,332],{},"Vuelve a escanear después de cada despliegue, y siempre que alguien toque una regla de la base de datos. Ese es el cambio del que nada te avisa.",[321,334,335],{},"Si tu app cobra pagos o guarda datos de salud, contrata un test de intrusión en algún momento. Una comprobación externa automática no es una auditoría, y ninguna ausencia de hallazgos es una garantía.",[10,337,338,339,343],{},"Nuestro ",[139,340,342],{"href":341},"\u002Fsecurity-scanner","escáner de seguridad web gratis"," ejecuta nueve\ncomprobaciones de solo lectura sobre cualquier URL en vivo en unos veinte\nsegundos, sin cuenta. Lee, nunca escribe y nunca inicia sesión.",[10,345,346,347,351],{},"Si prefieres recorrerlo primero a mano, la\n",[139,348,350],{"href":349},"\u002Fchecklist","checklist de seguridad de 10 minutos"," cubre el mismo terreno en el\norden en que vale la pena hacerlo.",{"title":353,"searchDepth":354,"depth":354,"links":355},"",3,[356,358,359,360,361,362,363],{"id":27,"depth":357,"text":28},2,{"id":43,"depth":357,"text":44},{"id":146,"depth":357,"text":147},{"id":180,"depth":357,"text":181},{"id":211,"depth":357,"text":212},{"id":289,"depth":357,"text":290},{"id":312,"depth":357,"text":313},"Fundamentos de seguridad","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fcover-1200x630.png","Una ventana de app iluminada vista de frente, y detrás dos ventanas más que retroceden hacia la sombra, ilegibles.","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.",false,"md",[371,373,376,379,382,385],{"q":28,"a":372},"Una herramienta que carga tu app en vivo como lo haría un visitante y lee lo que vuelve: el JavaScript que tu app envía al navegador, las cabeceras que tu alojamiento añade, el certificado y las respuestas que tu base de datos y tu almacenamiento de archivos dan a una petición de un desconocido. Necesita una URL y nada más. Informa de lo que encontró en la superficie pública de tu app, que es justo donde las apps hechas con IA fallan más a menudo.",{"q":374,"a":375},"¿Es seguro escanear mi propia app?","Sí, siempre que el escáner solo lea. El nuestro hace el mismo tipo de peticiones que un visitante corriente, nunca inicia sesión, nunca escribe, crea ni borra nada en ningún sitio, y nunca descarga los datos de tus usuarios. Para comprobar si una tabla de la base de datos es legible, pide un recuento de filas y lee el número, sin traer ni una sola fila. El tráfico es un puñado de peticiones, menos que una persona navegando por tu sitio durante un minuto.",{"q":377,"a":378},"¿Un escaneo necesita mi código fuente o la contraseña de mi base de datos?","No. Un escáner de URL trabaja enteramente desde fuera, así que no hay nada que conectar ni credenciales que entregar. Ese es también su límite: solo ve lo que tu app ya le muestra a cualquier visitante. Una herramienta que lee tu repositorio o se conecta a tu cuenta de base de datos ve cosas distintas, y el artículo de arriba pone las tres una al lado de la otra.",{"q":380,"a":381},"¿Funciona con Lovable, Bolt, Cursor, Replit, v0, Windsurf y Base44?","Sí, y con cualquier otra cosa que ponga un sitio en internet, porque el escaneo mira lo que está desplegado y no lo que lo escribió. El builder importa para el arreglo más que para la comprobación: reparar una tabla abierta es una secuencia de clics distinta en Lovable que en Replit, y por eso el texto del arreglo nombra tu builder.",{"q":383,"a":384},"¿Qué no comprueba un escáner de seguridad?","Todo lo que se queda en tu servidor. Tu código de servidor y tus funciones de base de datos, las variables de entorno que mantuviste fuera del navegador, la clave que subiste y luego borraste del repositorio, y los fallos de tu propia lógica, como que un usuario con sesión iniciada pueda abrir el pedido de otro cambiando un número en la dirección. Encontrar ese último grupo exige iniciar sesión y probar cosas, y eso es un test de intrusión y no un escaneo.",{"q":386,"a":387},"¿Un escáner de seguridad para vibe coding es gratis?","El nuestro lo es, al menos el escaneo en sí: obtienes la nota, la puntuación y el número de hallazgos en pantalla en unos 20 segundos, sin cuenta, y los hallazgos detallados con sus arreglos después de dar un correo. Hay planes de pago para lo que un escaneo puntual no puede hacer, que es enterarse de que algo cambia el mes que viene. Una nota es cierta en el segundo en que la tomas.","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fcard-800x500.png",[390,391,392,393,394,395,396,342,397,398],"escáner de seguridad para vibe coding","escáner vibe code","escáner de seguridad de apps con ia","escáner de seguridad para apps generadas con ia","escanear mi app de lovable en busca de fallos","escaneo de seguridad app bolt","escáner de seguridad app replit","comprobar claves api expuestas de mi app","es segura mi app hecha con vibe coding",{},true,"Qué se le escapa a un escáner de seguridad vibe coding","\u002Fblog\u002Fvibe-coding-security-scanner","2026-09-05",{"title":5,"description":367},"blog\u002Fvibe-coding-security-scanner",[407,408,409],"Un escáner de seguridad para vibe coding lee lo que los navegadores de tus visitantes ya descargan: tu bundle, tus cabeceras, tu certificado y las respuestas que tu base de datos le da a un desconocido.","Eso cubre justo la clase de errores más frecuentes al construir con IA. No cubre nada de lo que ocurre en tu servidor.","Un resultado limpio significa que toda pregunta que el escaneo pudo hacer desde fuera volvió limpia. Tómalo como una preocupación menos.","hV2nNyCPmm_QUQ6BqwpyODZTNUemqe6EMKcxeIj7d-A",[412,419,425,431,437,443,449,455,461,467,473,479,485,491,497,503,509,515,521,522,527,533,539,545,551,557,563,569,575,581,587,593,599,605,611,617,622,628,634,639,644,650],{"path":413,"title":414,"description":415,"published":416,"category":417,"image":418,"draft":368},"\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":420,"title":421,"description":422,"published":423,"category":364,"image":424,"draft":368},"\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":426,"title":427,"description":428,"published":429,"category":364,"image":430,"draft":368},"\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":432,"title":433,"description":434,"published":435,"category":364,"image":436,"draft":368},"\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":438,"title":439,"description":440,"published":441,"category":364,"image":442,"draft":368},"\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":444,"title":445,"description":446,"published":447,"category":364,"image":448,"draft":368},"\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":450,"title":451,"description":452,"published":453,"category":364,"image":454,"draft":368},"\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":456,"title":457,"description":458,"published":459,"category":364,"image":460,"draft":368},"\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":462,"title":463,"description":464,"published":465,"category":364,"image":466,"draft":368},"\u002Fblog\u002Fis-replit-safe","¿Es seguro Replit? Lo que vimos en 3.042 aplicaciones Replit en vivo","¿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.","2026-09-15","\u002Fblog\u002Fis-replit-safe\u002Fcard-800x500.png",{"path":468,"title":469,"description":470,"published":471,"category":417,"image":472,"draft":368},"\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":474,"title":475,"description":476,"published":477,"category":417,"image":478,"draft":368},"\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":480,"title":481,"description":482,"published":483,"category":417,"image":484,"draft":368},"\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":486,"title":487,"description":488,"published":489,"category":364,"image":490,"draft":368},"\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":492,"title":493,"description":494,"published":495,"category":364,"image":496,"draft":368},"\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":498,"title":499,"description":500,"published":501,"category":364,"image":502,"draft":368},"\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":504,"title":505,"description":506,"published":507,"category":364,"image":508,"draft":368},"\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":510,"title":511,"description":512,"published":513,"category":364,"image":514,"draft":368},"\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":516,"title":517,"description":518,"published":519,"category":364,"image":520,"draft":368},"\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":402,"title":5,"description":367,"published":403,"category":364,"image":388,"draft":368},{"path":206,"title":523,"description":524,"published":525,"category":364,"image":526,"draft":368},"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":528,"title":529,"description":530,"published":531,"category":364,"image":532,"draft":368},"\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":534,"title":535,"description":536,"published":537,"category":364,"image":538,"draft":368},"\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":540,"title":541,"description":542,"published":543,"category":417,"image":544,"draft":368},"\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":546,"title":547,"description":548,"published":549,"category":364,"image":550,"draft":368},"\u002Fblog\u002Freplit-secrets-explained","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":552,"title":553,"description":554,"published":555,"category":417,"image":556,"draft":368},"\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":558,"title":559,"description":560,"published":561,"category":364,"image":562,"draft":368},"\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":564,"title":565,"description":566,"published":567,"category":364,"image":568,"draft":368},"\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":570,"title":571,"description":572,"published":573,"category":364,"image":574,"draft":368},"\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":576,"title":577,"description":578,"published":579,"category":364,"image":580,"draft":368},"\u002Fblog\u002Fcors-wildcard-security-risk","¿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":582,"title":583,"description":584,"published":585,"category":417,"image":586,"draft":368},"\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":588,"title":589,"description":590,"published":591,"category":417,"image":592,"draft":368},"\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":594,"title":595,"description":596,"published":597,"category":364,"image":598,"draft":368},"\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":600,"title":601,"description":602,"published":603,"category":364,"image":604,"draft":368},"\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend","¿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":606,"title":607,"description":608,"published":609,"category":417,"image":610,"draft":368},"\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":612,"title":613,"description":614,"published":615,"category":364,"image":616,"draft":368},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","¿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":618,"title":619,"description":620,"published":615,"category":364,"image":621,"draft":368},"\u002Fblog\u002Fsource-maps-exposed-in-production","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":623,"title":624,"description":625,"published":626,"category":364,"image":627,"draft":368},"\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":629,"title":630,"description":631,"published":632,"category":417,"image":633,"draft":368},"\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":282,"title":635,"description":636,"published":637,"category":364,"image":638,"draft":368},"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":640,"title":641,"description":642,"published":637,"category":417,"image":643,"draft":368},"\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":645,"title":646,"description":647,"published":648,"category":417,"image":649,"draft":368},"\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":141,"title":651,"description":652,"published":648,"category":364,"image":653,"draft":368},"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",1790150954106]