[{"data":1,"prerenderedAt":269},["ShallowReactive",2],{"research-es":3},{"id":4,"title":5,"aside":6,"body":9,"coverAlt":242,"description":243,"extension":244,"faq":245,"lede":261,"meta":262,"navigation":263,"path":264,"published":265,"seo":266,"stem":267,"updated":265,"__hash__":268},"research_es\u002Fresearch\u002Fvibe-coded-app-security-2026.md","La seguridad de las apps de vibe coding en 2026",[7,8],"Solo una mirada desde fuera. Leemos lo que el navegador de un visitante ya lee: el código que la app entrega, las cabeceras que devuelve, los puntos de acceso que nombra su propio código. Sin inicios de sesión, sin adivinar contraseñas, sin descargar nada.","Aquí no se nombra ninguna app, ni tampoco en el archivo de datos. Cada cifra lleva el método que la produjo, y el archivo del final reúne todos los agregados en una tabla por si quieres comprobar las cuentas.",{"type":10,"value":11,"toc":224},"minimark",[12,17,21,24,27,31,34,37,40,44,47,50,53,56,60,63,66,70,73,76,79,82,86,89,92,95,98,102,105,108,111,125,129,132,135,138,142,214,218,221],[13,14,16],"h2",{"id":15},"seis-cifras-que-lo-cuentan-todo","Seis cifras que lo cuentan todo",[18,19,20],"p",{},"Estas seis cifras son el informe. Todo lo que viene después es la base sobre la\nque se apoya cada una, y cómo la obtuvimos.",[22,23],"research-key-findings",{},[18,25,26],{},"Los ajustes por defecto de la plataforma fallan casi en todas partes, y la\nmayoría de esos fallos son moderados. Lo que solo puede cambiar quien construyó\nla app falla mucho menos, y es lo que pone los datos de otra gente en internet\nabierto.",[13,28,30],{"id":29},"cómo-puntúan-estas-apps-de-la-a-a-la-f","Cómo puntúan estas apps, de la A a la F",[18,32,33],{},"Reeve califica una app como lo haría un boletín de notas. Los descuentos se\nrestan de cien puntos según la gravedad. Después, el hallazgo más grave pone un\ntecho: con un hallazgo crítico la app no pasa de D, y con uno alto no pasa de C.",[35,36],"research-grades",{},[18,38,39],{},"La mayoría de las apps caen en A o B. La franja de D y F es pequeña. Son las\napps donde un desconocido ya puede leer las filas de otra gente.",[13,41,43],{"id":42},"qué-comprobamos-y-cuántas-apps-fallaron-en-cada-comprobación","Qué comprobamos, y cuántas apps fallaron en cada comprobación",[18,45,46],{},"Cada comprobación hace una pregunta sobre la app desde fuera, y cada una se\ncuenta sobre las apps donde obtuvo respuesta. Una app a la que una comprobación\nno pudo llegar sale de la base de esa comprobación en vez de contarse como\nlimpia. El escaneo dice de esas apps que no pudo comprobarlas, y esta página\nhace lo mismo.",[48,49],"research-checks-table",{},[18,51,52],{},"Dos filas asustan más de lo que deben. Las cabeceras de seguridad son\ninstrucciones que la plataforma de hosting envía al navegador, y que falte una\ndeja a un tipo de ataque con un obstáculo menos delante. Una source map\npublicada es el código original de la app puesto junto a la versión compilada:\nle enseña a un atacante dónde mirar, y por sí sola no entrega nada.",[18,54,55],{},"Una fila también puede parecer grave porque un puñado de apps entregó algo serio\nmientras el resto entregaba algo corriente. El archivo de datos desglosa cada\nfila por tipo de clave para que se vea cuál es cuál.",[13,57,59],{"id":58},"más-de-la-mitad-de-las-apps-con-supabase-comprobables-filtran-datos-de-sus-tablas","Más de la mitad de las apps con Supabase comprobables filtran datos de sus tablas",[18,61,62],{},"Es la cifra a la que volvimos una y otra vez.",[18,64,65],{},"Un proyecto de Supabase está abierto a internet por diseño. La app que corre en\nel navegador habla directamente con la base de datos usando una clave pensada\npara ser pública, y lo que hay entre un desconocido y las filas es Row Level\nSecurity: una regla en cada tabla. Desactiva esa regla, o escribe una política\nque deje pasar a todo el mundo, y cualquier tabla del proyecto se lee con una\npetición y sin contraseña.",[67,68],"research-stat",{"id":69},"supabase",[18,71,72],{},"De las apps que nombran un proyecto de Supabase, menos de la mitad se pueden\ncomprobar. Algunas mandan el tráfico de su base de datos por su propio backend,\ndonde una comprobación desde fuera no puede seguir, así que de esas no decimos\nnada. La proporción de arriba es sobre las apps que respondieron.",[67,74],{"id":75},"rlsSplit",[18,77,78],{},"El desglose es la parte útil. Una tabla legible llamada settings o content es un\nerror. Una tabla legible llamada users, profiles u orders son los datos\npersonales de otra gente en internet abierto, y quien construyó la app casi\nseguro que los cree privados.",[18,80,81],{},"La comprobación nunca lee una fila. Le pregunta a la base de datos cuántas filas\nserían visibles y lee el recuento en una cabecera de respuesta. Con eso basta\npara distinguir una tabla con regla de RLS de una tabla sin ella, y la\ncomprobación no va más allá.",[13,83,85],{"id":84},"las-mismas-nueve-comprobaciones-herramienta-por-herramienta","Las mismas nueve comprobaciones, herramienta por herramienta",[18,87,88],{},"Cada app está agrupada por la herramienta con la que se publicó, y medida contra\nlas demás apps de esa herramienta.",[90,91],"research-builders-table",{},[18,93,94],{},"Casi todo lo que compara esta tabla son ajustes por defecto. Nadie elige Lovable\no Bolt por sus cabeceras de seguridad. Las fija la plataforma para todas las\napps que aloja, así que un solo cambio ahí mueve una columna entera de esta\ntabla.",[18,96,97],{},"Dos límites antes de que nadie cite una fila. Atribuimos las apps por el dominio\nde publicación, así que una app que se mudó a un dominio propio queda por\ncompleto fuera de esta tabla, y esas suelen ser las más terminadas. Y una\nherramienta que enruta el tráfico de base de datos por su propio backend no se\npuede comprobar desde fuera en absoluto. Un hueco ahí significa que no pudimos\nmedir, y no dice nada sobre lo seguras que son esas apps.",[13,99,101],{"id":100},"dos-clases-de-hallazgos-dos-clases-de-arreglos","Dos clases de hallazgos, dos clases de arreglos",[18,103,104],{},"Los hallazgos de esta página caen en dos grupos, y cada uno pide manos\ndistintas.",[106,107],"research-controls",{},[18,109,110],{},"El primer grupo es una decisión de producto tomada en una empresa. Un solo\ncambio en un ajuste por defecto del hosting mueve de golpe todas las apps de esa\nplataforma, y por eso esas filas salen tan parejas y son las más baratas de\narreglar.",[18,112,113,114,119,120,124],{},"El segundo grupo está en manos de quien construyó la app. Ninguna plataforma de\nhosting puede saber cuáles de tus tablas deben ser públicas, ni qué clave va en\nun servidor. Todos los hallazgos críticos de este informe están en ese grupo.\nLas ",[115,116,118],"a",{"href":117},"\u002Fis","guías de seguridad por herramienta"," y la\n",[115,121,123],{"href":122},"\u002Fchecklist","checklist de lanzamiento"," empiezan las dos ahí.",[13,126,128],{"id":127},"lo-que-las-apps-de-vibe-coding-hacen-bien","Lo que las apps de vibe coding hacen bien",[18,130,131],{},"También contamos lo que salió limpio, sobre las mismas apps.",[133,134],"research-clean-rates",{},[18,136,137],{},"La última tarjeta es la que los escáneres genéricos entienden mal. Una clave\npublicable en el frontend (una clave anon de Supabase, una clave publicable de\nStripe) está donde tiene que estar: está hecha para que se lea, y la protección\nvive en las reglas que hay detrás. Señalarla manda a alguien a cambiar un ajuste\nque ya estaba bien.",[13,139,141],{"id":140},"cómo-lo-medimos-y-dónde-están-los-límites","Cómo lo medimos, y dónde están los límites",[143,144,145,160,175,194],"research-method",{},[146,147,149,154,157],"template",{"v-slot:origin":148},"",[150,151,153],"h3",{"id":152},"de-dónde-salieron-las-apps","De dónde salieron las apps",[18,155,156],{},"Tres listas, fusionadas y sin duplicados: apps que la gente publicó en X y\nReddit, apps presentadas en Show HN, y apps que enumeramos desde los propios\ndominios de publicación de las herramientas. Los dominios de publicación son el\ngrueso de la muestra y la única lista que escala. Las otras dos solo encuentran\napps de las que alguien decidió hablar.",[18,158,159],{},"Los hosts muertos salieron primero, y eso lo juzgamos leyendo la página misma.\nUn despliegue borrado responde a menudo con un 200 OK de lo más animado.",[146,161,162,166,169,172],{"v-slot:denominator":148},[150,163,165],{"id":164},"la-regla-del-denominador","La regla del denominador",[18,167,168],{},"Cada proporción de esta página es sobre las apps donde esa comprobación pudo\nresponder, nunca sobre la muestra entera. Una comprobación que no pudo llegar a\nuna app deja esa app fuera de su propia base, y nunca la cuenta como limpia. Las\ndos cifras que hay junto a cada barra son esa base, para que cualquiera vea cuál\nestá leyendo.",[67,170],{"id":171},"inconclusive",[18,173,174],{},"Las notas se cuentan sobre un número menor por la misma razón. Una app que\ndevolvió muy poco como para clasificarla sale de todas las cifras de arriba en\nvez de recibir una nota a ojo.",[146,176,177,181],{"v-slot:scope":148},[150,178,180],{"id":179},"qué-hicimos-y-qué-no","Qué hicimos y qué no",[182,183,184,188,191],"ul",{},[185,186,187],"li",{},"Solo lecturas pasivas: las peticiones que ya hace el navegador de un visitante,\nmás los puntos de acceso públicos que la propia app señala.",[185,189,190],{},"La comprobación de base de datos toma un recuento de filas de una cabecera de\nrespuesta. Nunca leímos una fila, nunca descargamos un archivo, nunca iniciamos\nsesión y nunca adivinamos una contraseña.",[185,192,193],{},"No se nombra ninguna app, ni aquí ni en el archivo de datos. Una lista de apps\nemparejadas con sus debilidades es una lista de objetivos, y no guardamos\nninguna en forma publicable.",[146,195,196,200],{"v-slot:limits":148},[150,197,199],{"id":198},"límites-que-conviene-saber","Límites que conviene saber",[182,201,202,205,208,211],{},[185,203,204],{},"La muestra se inclina hacia apps más nuevas. Una app que se ha mudado a un\ndominio propio no se puede atribuir a una herramienta desde fuera, y esas\nsuelen ser las más asentadas.",[185,206,207],{},"El color de una fila marca el caso más grave que vimos, que puede ser una app\nentre cientos. El archivo de datos desglosa cada fila por tipo exacto de clave.",[185,209,210],{},"Esto es una ventana de tres días de agosto. Una app arreglada a la semana\nsiguiente cuenta aquí tal como estaba el día que miramos.",[185,212,213],{},"Una comprobación externa automatizada no es una auditoría. Que no haya\nhallazgos no es garantía.",[13,215,217],{"id":216},"usa-estas-cifras","Usa estas cifras",[18,219,220],{},"Periodistas, investigadores y cualquiera que escriba sobre esto pueden\nreutilizar los datos citando la fuente. El archivo de abajo tiene todos los\nagregados de esta página en una sola tabla plana, y no nombra ninguna app.",[222,223],"research-cite",{},{"title":148,"searchDepth":225,"depth":225,"links":226},3,[227,229,230,231,232,233,234,235,241],{"id":15,"depth":228,"text":16},2,{"id":29,"depth":228,"text":30},{"id":42,"depth":228,"text":43},{"id":58,"depth":228,"text":59},{"id":84,"depth":228,"text":85},{"id":100,"depth":228,"text":101},{"id":127,"depth":228,"text":128},{"id":140,"depth":228,"text":141,"children":236},[237,238,239,240],{"id":152,"depth":225,"text":153},{"id":164,"depth":225,"text":165},{"id":179,"depth":225,"text":180},{"id":198,"depth":225,"text":199},{"id":216,"depth":228,"text":217},"Una tarjeta oscura para compartir con la marca Reeve, el título del informe y el número de apps activas del análisis en una cifra grande.","Pasamos decenas de miles de apps activas hechas con Lovable, Bolt, v0, Replit y Base44 por las mismas nueve comprobaciones externas. Esto es lo que salió.","md",[246,249,252,255,258],{"q":247,"a":248},"¿Se puede saber qué apps tenían qué problemas?","No. Solo recuentos y proporciones, nunca nombres, y el archivo de datos contiene exactamente lo que muestra la página. Una lista de apps emparejadas con sus debilidades es una lista de objetivos, y no la vamos a producir.",{"q":250,"a":251},"Puede que mi app esté en estos datos. ¿Qué hago?","Analízala tú mismo. Son las mismas nueve comprobaciones, tarda unos veinte segundos y te da tu nota y lo que un desconocido ya puede ver. Nada de esta página identifica a nadie, así que esa es la única forma de saber dónde estás.",{"q":253,"a":254},"¿De verdad es tan grave una tabla de base de datos legible?","Si cualquiera en internet puede sacar esas filas con una petición y sin contraseña, sí. Una tabla legible llamada settings es dejadez. Una tabla legible llamada users u orders es una fuga de datos que todavía no ha visto nadie.",{"q":256,"a":257},"¿Por qué las claves publicables cuentan como correctas?","La clave anon de Supabase está pensada para ser pública. La protección son las reglas de la base de datos que hay detrás, no la clave en sí. Las herramientas que señalan esas claves enseñan a la gente a saltarse el siguiente aviso, que puede ser el que importa.",{"q":259,"a":260},"¿Habrá otra edición de este informe?","Sí. Los escaneos siguen corriendo y la siguiente edición irá detrás. El archivo de datos deja constancia de la ventana de la que salieron estas cifras, para que una copia antigua no pueda pasar por actual.","Buscamos apps activas hechas con Lovable, Bolt, v0, Replit o Base44, y pasamos cada una por las mismas nueve comprobaciones que cualquiera puede lanzar gratis desde la página de inicio de Reeve. Esta página es lo que salió.",{},true,"\u002Fresearch\u002Fvibe-coded-app-security-2026","2026-08-19",{"title":5,"description":243},"research\u002Fvibe-coded-app-security-2026","wr2NtXXfFGVNn_dtEjtTshxmWTkHecQho17bftNqIA4",1787826048205]