[{"data":1,"prerenderedAt":905},["ShallowReactive",2],{"blog-es-is-v0-safe":3,"blog-index-es":554},{"id":4,"title":5,"body":6,"category":508,"cover":509,"coverAlt":510,"description":511,"draft":512,"extension":513,"faq":514,"image":532,"keywords":533,"meta":543,"navigation":544,"ogTitle":5,"path":545,"published":546,"seo":547,"stem":548,"tldr":549,"updated":546,"__hash__":553},"blog_es\u002Fblog\u002Fis-v0-safe.md","Seguridad de v0: las 1.790 aplicaciones escaneadas sacaron una A",{"type":7,"value":8,"toc":494},"minimark",[9,18,21,29,34,37,40,63,66,91,95,98,122,134,147,153,164,168,171,174,186,190,193,206,212,224,228,231,240,243,248,265,272,276,279,291,294,318,326,330,333,374,381,385,391,400,418,421,431,448,451,459,463,486],[10,11,12,13,17],"p",{},"Le describiste una aplicación a v0, viste cómo la construía y te devolvió un\nenlace que termina en ",[14,15,16],"code",{},"vusercontent.net",". Funciona, parece terminada, y puede que\nya se la hayas mandado a alguien. Antes de que clientes reales escriban sus\ndatos en ella, buscaste la seguridad de v0, y parte de lo que salió era una\nhistoria sobre atacantes que usaban v0 para construir páginas de inicio de sesión\nfalsas.",[10,19,20],{},"Esa historia trata de lo que otras personas hacen con la herramienta. Este\nartículo trata de la aplicación que tú hiciste con ella, y para eso tenemos una\nmedición. Entre el 12 y el 14 de agosto de 2026 pasamos las mismas nueve\ncomprobaciones externas que cualquiera puede lanzar gratis en nuestra página de\ninicio sobre 30.998 aplicaciones en vivo, y 1.790 de ellas eran aplicaciones v0.\nLas 1.790 sacaron A.",[10,22,23,24,28],{},"Esta es la parte que una clasificación entiende mal: ",[25,26,27],"strong",{},"esa A dice más sobre lo\nque había que comprobar que sobre v0."," Leída como clasificación, convierte a v0\nen el builder más seguro que medimos. Leída con sus denominadores, describe\nfrontends sin nada detrás, y deja de describir el tuyo el día que conectas una\nbase de datos.",[30,31,33],"h2",{"id":32},"es-seguro-v0","¿Es seguro v0?",[10,35,36],{},"En todo lo que pudimos medir sobre el propio v0, sí. Su único hallazgo pertenece\nal dominio desde el que v0 sirve tu aplicación, y no apareció nada más en\nninguna de las 1.790, en ninguna de las nueve comprobaciones. Lo que eso no\npuede decirte es cómo se comporta tu aplicación cuando guarda datos, porque casi\nninguna de estas guardaba ninguno.",[10,38,39],{},"Piensa en una vista previa de v0 como en un archivador en una sala de\nexposición. Los cajones se deslizan, las etiquetas están puestas, cualquiera que\npase puede abrir uno, y todos los cajones están vacíos. Nuestras comprobaciones\nprobaron cada cajón y no encontraron nada en ninguno, y eso es un informe\ncorrecto sobre un archivador vacío.",[10,41,42,43,45,46,53,54,57,58,62],{},"Cuánto de vacío, lo dicen los números. Solo 17 de las 1.790 nombraban un\nproyecto de Supabase en algún lugar del código que publican, y en las 17 nuestra\ncomprobación de base de datos no obtuvo una respuesta que pudiera juzgar, así\nque el recuento de tablas legibles en v0 es cero de cero. Las 1.790 se servían\ndesde ",[14,44,16],{},", que Vercel describe en su\n",[47,48,52],"a",{"href":49,"rel":50},"https:\u002F\u002Fgithub.com\u002Fpublicsuffix\u002Flist\u002Fpull\u002F2121",[51],"nofollow","solicitud a la Public Suffix List","\ncomo el lugar \"donde alojamos el contenido enviado por los usuarios\" de v0. Una\naplicación que publicas va a una dirección ",[14,55,56],{},"vercel.app"," o a un dominio tuyo,\ndonde nada la marca como v0 desde fuera, así que esas no están en el recuento.\nEl método y los datos completos están\n",[47,59,61],{"href":60},"\u002Fresearch\u002Fvibe-coded-app-security-2026","en el informe",".",[10,64,65],{},"Así que \"¿es seguro v0?\" son tres preguntas:",[67,68,69,76,85],"ol",{},[70,71,72,75],"li",{},[25,73,74],{},"La herramienta."," Lo que v0 revisa en el código que escribe y lo que se\nniega a publicar. Esa parte es de Vercel, y está documentada.",[70,77,78,81,82,84],{},[25,79,80],{},"La vista previa."," El archivador en la sala de exposición, en su dirección\n",[14,83,16],{},". Todas las aplicaciones que medimos estaban en esta etapa.",[70,86,87,90],{},[25,88,89],{},"La aplicación que llenas."," El mismo código cuando guarda los datos de tus\nclientes, o cuando corre en un dominio propio. Casi nada de lo que medimos\nhabía llegado tan lejos.",[30,92,94],{"id":93},"lo-que-cubre-la-seguridad-de-v0-antes-de-publicar","Lo que cubre la seguridad de v0 antes de publicar",[10,96,97],{},"Tres cosas, y la propia documentación de v0 nombra cada una.",[10,99,100,103,104,109,110,113,114,116,117,121],{},[25,101,102],{},"Lee el código que escribió."," La\n",[47,105,108],{"href":106,"rel":107},"https:\u002F\u002Fv0.app\u002Fdocs\u002Fsecurity",[51],"página de seguridad"," de v0 dice que todo el\ncódigo generado \"pasa por un análisis de seguridad antes de ejecutarse\", y que\nv0 \"analiza el uso de ",[14,111,112],{},"NEXT_PUBLIC_"," y avisa a los usuarios de posibles riesgos\nde seguridad\". ",[14,115,112],{}," es el prefijo que le dice a Next.js, el framework\nen el que escribe v0, que meta un valor en el código que descarga cada\nvisitante. ",[47,118,120],{"href":119},"\u002Fblog\u002Fvite-and-next-public-env-vars","Lo que ese prefijo le hace a una clave","\ntiene su propio artículo.",[10,123,124,127,128,133],{},[25,125,126],{},"Rechaza algunos despliegues."," En\n",[47,129,132],{"href":130,"rel":131},"https:\u002F\u002Fvercel.com\u002Fblog\u002Fv0-vibe-coding-securely",[51],"agosto de 2025"," Vercel\nescribió que v0 había bloqueado más de 17.000 despliegues en los 30 días\nanteriores solo por secretos expuestos, y más de 100.000 despliegues inseguros\ndesde su lanzamiento. Son cifras de Vercel sobre el bloqueo de Vercel, que se\naplica a los despliegues en Vercel. Parte de nuestro cero puede ser obra de ese\nbloqueo. Desde fuera no podemos saber cuánto.",[10,135,136,139,140,142,143,146],{},[25,137,138],{},"La integración de Supabase pone el prefijo en el sitio correcto."," Conectada a\ntravés del Vercel Marketplace, añade una docena de variables de entorno, y solo\ndos llevan ",[14,141,112],{},": la dirección del proyecto y la clave publicable, que\nestán hechas para ser públicas. ",[14,144,145],{},"SUPABASE_SECRET_KEY"," y la contraseña de la base\nde datos se quedan sin él, en el servidor.",[148,149],"diagram",{"alt":150,"caption":151,"src":152},"Doce filas de ajustes dentro de una caja. Diez tienen valores enmascarados y se quedan en la caja. Dos llevan la etiqueta NEXT_PUBLIC_ y valores legibles, y unas flechas llevan esas dos a través de una pared discontinua hasta un visitante fuera.","La integración de Supabase añade doce variables. Dos llegan a cada visitante, y las dos deben hacerlo: la dirección del proyecto y la clave publicable.","\u002Fblog\u002Fis-v0-safe\u002Ftwo-of-twelve-1600x720.png",[154,155,157],"callout",{"type":156},"note",[10,158,159,160,62],{},"Gratis, sin cuenta, unos 20 segundos: el escaneo de nuestra página de inicio\nlanza las nueve comprobaciones contra tu aplicación en vivo y escribe \"No se\npudo comprobar\" en vez de una marca para todo lo que no obtuvo respuesta.\n",[47,161,163],{"href":162},"\u002Fsecurity-scanner","Escanea tu aplicación",[30,165,167],{"id":166},"por-qué-a-una-vista-previa-de-v0-le-faltan-cabeceras-de-seguridad","Por qué a una vista previa de v0 le faltan cabeceras de seguridad",[10,169,170],{},"Porque las pone el dominio de vistas previas de v0, cada aplicación que vive en\nél recibe la misma respuesta, y no puedes cambiarla desde dentro de una vista\nprevia.",[10,172,173],{},"Las cabeceras de seguridad son instrucciones que un sitio envía con cada página:\nusa siempre HTTPS, no dejes que otro sitio muestre esta página dentro de la\nsuya, no adivines qué tipo de archivo es esto. Las envía quien sirve la página.\nLas vistas previas que abrimos el 3 de octubre de 2026 enviaban una de las cinco\nque busca nuestra comprobación, la que obliga a usar HTTPS, y ninguna de las\notras cuatro. Ese es el hallazgo en las 1.790 aplicaciones v0, y es el único.",[10,175,176,177,180,181,185],{},"La sala de exposición decide sus propias puertas y alarmas, y no puedes\nrecablearlas para un solo archivador de su suelo. En cuanto publicas, el\narchivador está en tu oficina, y las cabeceras son un ajuste en ",[14,178,179],{},"vercel.json"," o\nen tu configuración de Next.js.\n",[47,182,184],{"href":183},"\u002Fblog\u002Fmissing-security-headers","Qué hace cada cabecera, y las dos que no cuestan nada",",\nes otro artículo.",[30,187,189],{"id":188},"es-pública-una-vista-previa-de-vusercontentnet","¿Es pública una vista previa de vusercontent.net?",[10,191,192],{},"Trátala como pública. Cualquiera que tenga la dirección puede abrirla, y las\ndirecciones viajan.",[10,194,195,196,201,202,205],{},"Cada una de las 1.790 se abrió para nosotros sin iniciar sesión, y no tuvimos\nque adivinar ninguna: sus direcciones salieron de un archivo web público que ya\nhabía guardado una copia de cada una. Los\n",[47,197,200],{"href":198,"rel":199},"https:\u002F\u002Fv0.app\u002Fdocs\u002Fsharing",[51],"ajustes para compartir"," de v0 deciden quién puede\nver tu ",[25,203,204],{},"chat",": privado por defecto, luego tu equipo, cualquiera con el enlace\no cualquiera en la web. La documentación no dice que esos ajustes lleguen a la\nvista previa.",[10,207,208,209,211],{},"Así que una vista previa es el archivador en la sala de exposición. Sirve para\nenseñarle el diseño a alguien y no sirve para los documentos reales de nadie.\nVercel incluyó ",[14,210,16],{}," en la Public Suffix List en septiembre de\n2024, lo que hace que los navegadores traten cada vista previa como un sitio\naparte, así que una vista previa no puede poner cookies para todas las demás.\nEso mantiene las vistas previas separadas entre sí, y no hace nada por mantener\nla tuya privada.",[10,213,214,215,217,218,223],{},"Si estás aquí porque alguien te mandó un enlace de ",[14,216,16],{},": el\ndominio es de Vercel, y la página que hay en él la hizo quien la pidió con un\nprompt. El 1 de julio de 2025\n",[47,219,222],{"href":220,"rel":221},"https:\u002F\u002Fwww.okta.com\u002Fblog\u002Fthreat-intelligence\u002Fokta-observes-v0-ai-tool-used-to-build-phishing-sites\u002F",[51],"Okta informó","\nde atacantes que usaban v0 para construir copias de páginas de inicio de sesión\nreales, y Vercel restringió el acceso a las que encontró. No escribas una\ncontraseña en un formulario de inicio de sesión en una dirección así salvo que\nlo estuvieras esperando.",[30,225,227],{"id":226},"qué-cambia-cuando-conectas-supabase-a-v0","Qué cambia cuando conectas Supabase a v0",[10,229,230],{},"Empiezas a llenar los cajones, y las comprobaciones que volvieron vacías en v0\nempiezan a tener algo que comprobar.",[10,232,233,234,239],{},"v0 añade Supabase con un clic y, en palabras de\n",[47,235,238],{"href":236,"rel":237},"https:\u002F\u002Fv0.app\u002Fdocs\u002Fdatabases",[51],"su propia documentación",", \"puede generar y\nejecutar SQL. Esto te permite crear, actualizar y eliminar tablas\". Así se crean\ntus tablas. Cada tabla es un cajón, y Row Level Security es la cerradura que\ntiene: un ajuste por tabla que decide qué filas puede leer la clave publicable\nde tu página. Esa clave está hecha para ser pública, así que la cerradura es lo\núnico que decide qué recibe un desconocido.",[10,241,242],{},"Supabase pone esa cerradura por defecto en las tablas creadas en su Table\nEditor, y la deja fuera en las tablas creadas ejecutando SQL, que es como las\ncrea v0.",[148,244],{"alt":245,"caption":246,"src":247},"Dos carriles. En el de arriba, un icono de cuadrícula crea tres tablas, cada una con un candado cerrado al lado. En el de abajo, un icono de terminal con el logo de v0 al lado crea tres tablas, cada una con el candado abierto y dibujado en rojo.","Una tabla creada en el Table Editor de Supabase llega cerrada. Una tabla creada ejecutando SQL, que es como las crea v0, llega con el candado abierto.","\u002Fblog\u002Fis-v0-safe\u002Ftwo-ways-to-make-a-table-1600x620.png",[10,249,250,251,255,256,259,260,264],{},"Ahí es donde cayeron los hallazgos graves en todos los demás builders. De las\n3.553 aplicaciones Lovable cuya base de datos pudimos consultar, 2.017\nentregaron filas a una petición sin inicio de sesión, y\n",[47,252,254],{"href":253},"\u002Fblog\u002Fis-lovable-safe","los números de Lovable"," son el aspecto que tienen los\nresultados de un builder cuando ya hay documentos en los cajones. Una cerradura\nque abre cualquier llave tampoco es una cerradura: una política que dice\n",[14,257,258],{},"using (true)"," deja pasar a todo el mundo mientras el panel muestra la tabla como\nprotegida.\n",[47,261,263],{"href":262},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","RLS está activado y tu tabla sigue siendo pública","\ncuenta la historia entera.",[10,266,267,268,62],{},"Si tus datos están detrás de rutas que responde tu propio código de servidor, la\nmisma pregunta se hace a esas rutas:\n",[47,269,271],{"href":270},"\u002Fblog\u002Fopen-api-endpoint-exposed","qué significa un endpoint de API abierto",[30,273,275],{"id":274},"qué-cambia-cuando-publicas-o-despliegas-tú-mismo","Qué cambia cuando publicas o despliegas tú mismo",[10,277,278],{},"El archivador sale de la sala de exposición y entra en tu oficina, y las\ndecisiones que tomaba el dominio de v0 pasan a ser tuyas.",[10,280,281,282,287,288,290],{},"Publicar desde v0 crea un proyecto de Vercel y pregunta tres cosas, según\n",[47,283,286],{"href":284,"rel":285},"https:\u002F\u002Fv0.app\u002Fdocs\u002Fdeployments",[51],"la documentación de despliegues de v0",": el\nnombre del proyecto, quién puede acceder a la aplicación desplegada y el\ndominio, ya sea una dirección ",[14,289,56],{}," o uno propio. Detente en la segunda.\nLas opciones que ves dependen de tu plan, y dejar la aplicación solo para tu\nequipo o detrás de una contraseña hasta que la hayas revisado mantiene fuera a\nlos desconocidos mientras miras.",[10,292,293],{},"Tres cosas pasan a ti cuando publicas:",[295,296,297,303,312],"ul",{},[70,298,299,302],{},[25,300,301],{},"Las cabeceras."," Las puertas y alarmas de la oficina las configuras tú\nahora.",[70,304,305,308,309,311],{},[25,306,307],{},"Las variables de entorno."," Viven en los ajustes de tu proyecto, y esa lista\nes donde una clave recibe el prefijo ",[14,310,112],{}," o no.",[70,313,314,317],{},[25,315,316],{},"La comprobación de tu despliegue, si sales de Vercel."," Vercel describe su\nbloqueo como algo que detiene despliegues en Vercel, así que el código que\ndescargas y alojas en otro sitio sale sin esa comprobación.",[10,319,320,321,325],{},"En cualquier caso, has salido de la muestra que medimos. Una aplicación v0 en su\npropio dominio con una base de datos detrás se parece más a las\n",[47,322,324],{"href":323},"\u002Fblog\u002Fis-bolt-safe","aplicaciones Bolt que medimos"," que a estas 1.790 vistas\nprevias.",[30,327,329],{"id":328},"cómo-revisar-tu-propia-aplicación-v0","Cómo revisar tu propia aplicación v0",[10,331,332],{},"Cinco cosas, y las tres primeras solo importan cuando ya has conectado una base\nde datos o publicado. Usa una ventana privada, para que tu propio inicio de\nsesión no responda por un desconocido.",[67,334,335,347,353,359,365],{},[70,336,337,340,341,343,344,346],{},[25,338,339],{},"Lee tus variables de entorno."," En v0 están en el menú del proyecto, en\nSettings, Environment Variables. Todo lo que empieza por ",[14,342,112],{}," está\nen el código que descarga cada visitante. La dirección de un proyecto y una\nclave publicable van ahí. Una clave que te cobra, ",[14,345,145],{}," y\ncualquier cosa que guarde una contraseña, nunca. Si alguna llevó alguna vez\nel prefijo, rótala primero con el proveedor, porque el valor antiguo sigue\nfuncionando hasta que lo hagas.",[70,348,349,352],{},[25,350,351],{},"Lee la cerradura de cada tabla."," En Supabase, abre Authentication →\nPolicies y recorre la lista. Una tabla con Row Level Security desactivado la\npuede leer cualquiera que tenga la dirección de tu proyecto, y esa dirección\nestá en tu página. Una política que lo permite todo a todo el mundo cuenta\ncomo desactivada.",[70,354,355,358],{},[25,356,357],{},"Elige quién puede verla cuando publiques."," Solo tu equipo, o una\ncontraseña, hasta que las dos primeras estén hechas.",[70,360,361,364],{},[25,362,363],{},"Pon tus cabeceras cuando el dominio sea tuyo."," Dos de ellas son una línea\ncada una.",[70,366,367,370,371,62],{},[25,368,369],{},"Luego mira desde fuera."," Nuestro escaneo pasa las nueve comprobaciones\ncontra la dirección publicada como lo haría un desconocido, tarda unos 20\nsegundos y no pide cuenta: ",[47,372,373],{"href":162},"escanea tu aplicación gratis",[10,375,376,377,62],{},"Un escaneo desde fuera no ve el código que escribió v0, ni el chat en el que lo\nescribiste, ni una tabla que tus páginas nunca mencionan. Las comprobaciones de\nv0 ven el código desde dentro y no ven lo que un desconocido obtiene de la\ndirección. Usa las de v0 mientras construyes, mira desde fuera después de\npublicar y, si alguna vez no coinciden sobre si una tabla se puede leer, quédate\ncon la respuesta de fuera, porque es la que recibe un desconocido. La versión en\nlenguaje sencillo para esta plataforma es\n",[47,378,380],{"href":379},"\u002Fis-your-v0-app-safe","¿es segura tu aplicación v0?",[30,382,384],{"id":383},"para-que-siga-así-después-de-publicar","Para que siga así después de publicar",[10,386,387,390],{},[25,388,389],{},"Una A en una vista previa describe una vista previa."," El día que conectas una\nbase de datos o publicas en tu propio dominio, tu nota puede cambiar, y nada en\ntu pantalla te avisa de que ha cambiado.",[10,392,393],{},[25,394,395,399],{},[47,396,398],{"href":397},"\u002Fpricing","Reeve Monitor"," vuelve a pasar las nueve comprobaciones por ti:",[295,401,402,405,408,415],{},[70,403,404],{},"las nueve comprobaciones cada hora, en hasta tres aplicaciones",[70,406,407],{},"si la aplicación responde, cada 60 segundos",[70,409,410,411,414],{},"un mensaje cuando un resultado ",[25,412,413],{},"cambia",", para que una tabla o una clave nueva no espere a que mires",[70,416,417],{},"un informe mensual de lo que vio",[10,419,420],{},"Monitor cuesta $12 al mes de tarifa de lista, con siete días gratis antes de\ncobrarte. La página de precios a veces está por debajo de la cifra de aquí y\nnunca por encima.",[10,422,423],{},[25,424,425,426,430],{},"Si tu aplicación v0 guarda sus datos en Supabase,\n",[47,427,429],{"href":428},"\u002Fsupabase-backups","Reeve Care"," guarda una copia de tu base de datos de\nSupabase.",[295,432,433,436,439,442,445],{},[70,434,435],{},"una copia cifrada cada noche, guardada donde tu proyecto no puede llegar",[70,437,438],{},"cada copia verificada antes de contar, con un recuento de las filas de cada tabla",[70,440,441],{},"una restauración con un clic cuando la necesites",[70,443,444],{},"también tus archivos subidos, en cuanto conectes una credencial de Storage",[70,446,447],{},"todo lo que hace Monitor",[10,449,450],{},"Care cuesta $49 al mes de tarifa de lista por una aplicación, con los mismos\nsiete días gratis.",[10,452,453,454,458],{},"La documentación de v0 dice que puede eliminar tablas además de crearlas, y\nninguna de las nueve comprobaciones de arriba traería de vuelta sus filas.\n",[47,455,457],{"href":456},"\u002Fblog\u002Fai-agent-deleted-my-database","El día en que un agente de IA borró una base de datos de producción","\nmuestra cómo se ve eso desde dentro.",[30,460,462],{"id":461},"qué-hacer-esta-semana","Qué hacer esta semana",[464,465,466],"key-takeaways",{},[295,467,468,471,477,480,483],{},[70,469,470],{},"Si tu aplicación v0 sigue siendo una vista previa, trata su dirección como pública y deja fuera los datos de personas reales.",[70,472,473,474,476],{},"Antes de conectar una base de datos, decide dónde vive cada clave: ",[14,475,112],{}," para la dirección del proyecto y la clave publicable, y nada cerca del navegador para todo lo demás.",[70,478,479],{},"Después de conectar Supabase, lee la política de cada tabla que creó v0, y trata como desactivada una que lo permita todo a todo el mundo.",[70,481,482],{},"Publica solo para tu equipo o detrás de una contraseña hasta que eso esté hecho, y luego revisa la dirección publicada desde fuera.",[70,484,485],{},"Guarda una copia de tu base de datos donde v0 y tu proyecto no puedan llegar, y comprueba que la copia se restaura.",[10,487,488,489,493],{},"Empieza por las variables de entorno, porque deciden lo que descarga cada\nvisitante. Si todavía estás eligiendo builder,\n",[47,490,492],{"href":491},"\u002Fblog\u002Fsafest-ai-app-builder","cuál es el builder de apps con IA más seguro"," pone\nlos cinco uno al lado del otro.",{"title":495,"searchDepth":496,"depth":496,"links":497},"",3,[498,500,501,502,503,504,505,506,507],{"id":32,"depth":499,"text":33},2,{"id":93,"depth":499,"text":94},{"id":166,"depth":499,"text":167},{"id":188,"depth":499,"text":189},{"id":226,"depth":499,"text":227},{"id":274,"depth":499,"text":275},{"id":328,"depth":499,"text":329},{"id":383,"depth":499,"text":384},{"id":461,"depth":499,"text":462},"Fundamentos de seguridad","\u002Fblog\u002Fis-v0-safe\u002Fcover-1200x630.png","Un archivador con el logo de v0 y un cajón vacío abierto, junto a otro archivador con todos los cajones cerrados con llave.","Seguridad de v0, medida en 1.790 aplicaciones v0 en vivo: todas sacaron A. Solo 17 nombraban una base de datos, y eso es casi todo lo que mide la A.",false,"md",[515,517,520,523,526,529],{"q":33,"a":516},"En lo que pudimos medir, v0 salió más limpio que cualquier otro builder que escaneamos. Las 1.790 aplicaciones v0 en vivo sacaron A, y el único hallazgo que compartían era un ajuste de cabeceras del navegador en el dominio desde el que v0 sirve las vistas previas. Pero solo 17 nombraban una base de datos, y ninguna de esas 17 le dio una respuesta a nuestra comprobación de base de datos, así que la A describe sobre todo frontends sin nada detrás. En cuanto conectas Supabase o publicas en tu propio dominio, las comprobaciones que deciden una nota grave empiezan a aplicarse a ti.",{"q":518,"a":519},"¿Las aplicaciones de v0 son seguras por defecto?","Las partes que controla v0 están en buen estado. Su documentación dice que el código generado pasa por un análisis de seguridad antes de ejecutarse y que avisa del uso arriesgado del prefijo NEXT_PUBLIC_, y en agosto de 2025 Vercel dijo que v0 había bloqueado más de 17.000 despliegues en 30 días por secretos expuestos. Lo que ningún ajuste por defecto decide es la cerradura de tus tablas. Supabase no activa Row Level Security en las tablas creadas ejecutando SQL, que es como las crea v0, así que lee la política de cada tabla después de conectar una base de datos.",{"q":521,"a":522},"¿Es pública una URL de vista previa de vusercontent.net?","Trátala como pública. Cada una de las 1.790 vistas previas de v0 que escaneamos se abrió sin iniciar sesión, y encontramos sus direcciones en un archivo web público. Los ajustes para compartir de v0 controlan quién puede ver tu chat, y su documentación no dice que lleguen a la vista previa. Deja los datos de personas reales fuera de una vista previa y, cuando publiques, elige visibilidad solo para el equipo o con contraseña hasta que la aplicación esté lista para desconocidos.",{"q":524,"a":525},"¿Es seguro vusercontent.net?","El dominio es real y pertenece a Vercel, que lo usa para alojar lo que la gente genera con v0. Pero la página de cada dirección la hizo quien la pidió con un prompt, y en julio de 2025 Okta informó de atacantes que usaban v0 para construir copias de páginas de inicio de sesión. Vercel restringió el acceso a las que encontró. Si un enlace que no esperabas abre un formulario de inicio de sesión en una dirección de vusercontent.net, no escribas una contraseña en él.",{"q":527,"a":528},"¿Qué cambia cuando conecto Supabase a v0?","Ahora hay datos detrás de tu frontend, así que las comprobaciones que volvieron vacías en las aplicaciones v0 empiezan a tener algo que comprobar. v0 puede ejecutar SQL para crear tablas, y Supabase no activa Row Level Security en las tablas creadas así. Tu clave publicable está hecha para ir en la página, así que la política de cada tabla es lo único que decide qué puede leer un desconocido. De las 3.553 aplicaciones Lovable cuya base de datos pudimos consultar, 2.017 entregaron filas a una petición sin inicio de sesión.",{"q":530,"a":531},"¿Qué cambia cuando despliego yo mismo el código de v0?","Tres cosas pasan a ser tuyas. Las cabeceras de seguridad que elegía el dominio de vistas previas de v0 se convierten en un ajuste de vercel.json o de tu configuración de Next.js. Tus variables de entorno, y cuáles llevan el prefijo NEXT_PUBLIC_, viven en tu propio proyecto. Y el código que descargas y alojas fuera de Vercel ya no pasa por la comprobación de despliegue que Vercel describe para v0. Mira la dirección publicada desde fuera en cuanto esté en línea.","\u002Fblog\u002Fis-v0-safe\u002Fcard-800x500.png",[534,535,536,537,538,539,540,541,542],"seguridad de v0","es seguro v0","seguridad v0.dev","es seguro usar v0","seguridad vercel v0","son seguras las aplicaciones v0","seguridad de aplicaciones v0","seguridad del despliegue en v0","vusercontent.net es seguro",{},true,"\u002Fblog\u002Fis-v0-safe","2026-10-03",{"title":5,"description":511},"blog\u002Fis-v0-safe",[550,551,552],"En seguridad, v0 salió más limpio que cualquier otro builder que medimos: las 1.790 aplicaciones v0 en vivo que escaneamos sacaron A, y el único hallazgo que compartían es un ajuste de cabeceras en el dominio desde el que v0 las sirve.","Eso dice sobre todo qué son esas aplicaciones. Solo 17 de las 1.790 nombraban una base de datos, y ninguna de esas 17 le dio a nuestra comprobación de base de datos una respuesta que pudiera juzgar.","Conecta Supabase, o publica en un dominio propio, y las comprobaciones que volvieron vacías empiezan a tener algo que comprobar.","1hJGjeFBYa0PQNu--7kgjebMIi677-1wiGA6vQYxa-k",[555,561,567,573,579,585,591,597,603,604,609,615,621,627,634,640,646,651,656,662,668,674,679,685,691,696,702,708,714,720,726,732,737,743,749,755,761,767,773,778,784,790,796,802,808,814,820,826,832,838,844,850,856,861,867,872,878,884,889,894,900],{"path":556,"title":557,"description":558,"published":559,"category":508,"image":560,"draft":512},"\u002Fblog\u002Fstorage-upload-violates-row-level-security","\"Row-level security policy for table objects\" al subir","\"New row violates row-level security policy for table objects\" significa que tu subida no tiene regla insert. Hacer público el bucket no añade ninguna.","2026-10-11","\u002Fblog\u002Fstorage-upload-violates-row-level-security\u002Fcard-800x500.png",{"path":562,"title":563,"description":564,"published":565,"category":508,"image":566,"draft":512},"\u002Fblog\u002Fbase44-security-scan","Escaneo de seguridad de Base44: lo que solo él ve","El escaneo de seguridad de Base44 revisa siete tipos de problema desde dentro. Esta es la mitad que lee y nadie más puede leer, y la mitad que nunca mira.","2026-10-10","\u002Fblog\u002Fbase44-security-scan\u002Fcard-800x500.png",{"path":568,"title":569,"description":570,"published":571,"category":508,"image":572,"draft":512},"\u002Fblog\u002Fapi-key-leaked-what-to-do","Tu clave API se filtró. El orden en el que hay que actuar","Una clave API se filtró y no sabes por dónde empezar. No todas las claves de tu frontend lo son, y el orden importa más que la velocidad.","2026-10-09","\u002Fblog\u002Fapi-key-leaked-what-to-do\u002Fcard-800x500.png",{"path":574,"title":575,"description":576,"published":577,"category":508,"image":578,"draft":512},"\u002Fblog\u002Finfinite-recursion-in-policy-for-relation","\"Infinite recursion detected in policy\" sin desactivar RLS","\"Infinite recursion detected in policy for relation\" significa que tu policy preguntó a la tabla que protege. Así se rompe el círculo.","2026-10-08","\u002Fblog\u002Finfinite-recursion-in-policy-for-relation\u002Fcard-800x500.png",{"path":580,"title":581,"description":582,"published":583,"category":508,"image":584,"draft":512},"\u002Fblog\u002Fno-api-key-found-in-request","\"No API key found in request\" en Supabase, y el arreglo equivocado","\"No API key found in request\" significa que tu petición llegó a Supabase sin clave. Casi todas las respuestas apuntan a las reglas de tu base de datos.","2026-10-07","\u002Fblog\u002Fno-api-key-found-in-request\u002Fcard-800x500.png",{"path":586,"title":587,"description":588,"published":589,"category":508,"image":590,"draft":512},"\u002Fblog\u002Fis-base44-safe","¿Es seguro Base44? Lo que vimos en 5.442 apps Base44","¿Es seguro Base44? Pasamos nueve comprobaciones a 5.442 apps Base44 en producción. Casi todas sacaron B por motivos que su dueño nunca eligió.","2026-10-06","\u002Fblog\u002Fis-base44-safe\u002Fcard-800x500.png",{"path":592,"title":593,"description":594,"published":595,"category":508,"image":596,"draft":512},"\u002Fblog\u002Fmove-a-secret-to-an-edge-function","Ocultar una clave API: muévela a una Edge Function de Supabase","Ocultar una clave API significa sacarla del navegador, y una Edge Function de Supabase es el sitio más pequeño donde ponerla. Dos pasos importan más.","2026-10-05","\u002Fblog\u002Fmove-a-secret-to-an-edge-function\u002Fcard-800x500.png",{"path":598,"title":599,"description":600,"published":601,"category":508,"image":602,"draft":512},"\u002Fblog\u002Fenv-file-exposed-on-your-server","¿Tu archivo .env está expuesto? Las doce rutas a revisar","¿Tu archivo .env está expuesto en tu propio servidor web? Doce direcciones te lo dicen, y un acierto significa que todo lo que contiene ya es público.","2026-10-04","\u002Fblog\u002Fenv-file-exposed-on-your-server\u002Fcard-800x500.png",{"path":545,"title":5,"description":511,"published":546,"category":508,"image":532,"draft":512},{"path":323,"title":605,"description":606,"published":607,"category":508,"image":608,"draft":512},"¿Es seguro Bolt? Lo que vimos en 1.123 aplicaciones Bolt","¿Es seguro Bolt? Pasamos 1.123 aplicaciones Bolt en vivo por nueve comprobaciones. El hosting salió limpio. Los hallazgos eran claves y tablas abiertas dentro.","2026-10-02","\u002Fblog\u002Fis-bolt-safe\u002Fcard-800x500.png",{"path":610,"title":611,"description":612,"published":613,"category":508,"image":614,"draft":512},"\u002Fblog\u002Fis-supabase-down-or-your-app","¿Supabase está caído o es tu app? Cómo distinguirlo","¿Supabase está caído o es tu app? Un proyecto pausado, una base de datos llena y un fallo tuyo parecen lo mismo. Cuatro comprobaciones los separan.","2026-10-01","\u002Fblog\u002Fis-supabase-down-or-your-app\u002Fcard-800x500.png",{"path":616,"title":617,"description":618,"published":619,"category":508,"image":620,"draft":512},"\u002Fblog\u002Fdoes-supabase-encrypt-my-data","¿Supabase cifra mis datos? Sí. Esto es lo que detiene","¿Supabase cifra los datos? Sí: AES-256 en reposo, TLS en tránsito, SOC 2 e ISO 27001. Qué cubre cada uno, y la fuga que ninguno de ellos detiene.","2026-09-30","\u002Fblog\u002Fdoes-supabase-encrypt-my-data\u002Fcard-800x500.png",{"path":622,"title":623,"description":624,"published":625,"category":508,"image":626,"draft":512},"\u002Fblog\u002Fsupabase-free-plan-limits","¿Cuánto cuesta Supabase? Los límites del plan gratuito","Los límites del plan gratuito de Supabase: 500 MB de base de datos, 5 GB de egress y ningún backup. Qué pasa en cada uno y qué cambia Pro por $25.","2026-09-29","\u002Fblog\u002Fsupabase-free-plan-limits\u002Fcard-800x500.png",{"path":628,"title":629,"description":630,"published":631,"category":632,"image":633,"draft":512},"\u002Fblog\u002Ftest-your-supabase-backup","Prueba tu backup de Supabase antes del día que lo necesites","Cómo probar tu backup de Supabase: restaurarlo en un proyecto de prueba, contar filas, iniciar sesión y buscar la línea que le falta a un archivo cortado.","2026-09-28","Backups","\u002Fblog\u002Ftest-your-supabase-backup\u002Fcard-800x500.png",{"path":635,"title":636,"description":637,"published":638,"category":632,"image":639,"draft":512},"\u002Fblog\u002Fsupabase-backup-github-action","Backup gratis de Supabase con una GitHub Action, y la trampa","Un backup de Supabase con GitHub Action es gratis y sirve a muchas apps. El workflow, el connection string correcto y el egress de cada ejecución.","2026-09-27","\u002Fblog\u002Fsupabase-backup-github-action\u002Fcard-800x500.png",{"path":641,"title":642,"description":643,"published":644,"category":632,"image":645,"draft":512},"\u002Fblog\u002Fdownload-your-supabase-backup","Por qué no puedes descargar tu backup de Supabase","No puedes descargar tu backup de Supabase en un proyecto actual: la copia diaria es una instantánea física. Cómo comprobarlo y tener tu propia copia.","2026-09-26","\u002Fblog\u002Fdownload-your-supabase-backup\u002Fcard-800x500.png",{"path":647,"title":648,"description":649,"published":644,"category":508,"image":650,"draft":512},"\u002Fblog\u002Fsupabase-permission-denied-for-table","Supabase \"permission denied for table\": el grant que falta","Desde el 30 de octubre, una tabla nueva de Supabase responde \"permission denied for table\" hasta que le das acceso. El grant del email es la mitad del arreglo.","\u002Fblog\u002Fsupabase-permission-denied-for-table\u002Fcard-800x500.png",{"path":270,"title":652,"description":653,"published":654,"category":508,"image":655,"draft":512},"¿Un endpoint de API abierto es un problema? Mira el JSON","Tu escaneo señaló un endpoint de API abierto. Que importe depende de lo que devolvió, y la mayoría de los que encontramos eran de la plataforma.","2026-09-25","\u002Fblog\u002Fopen-api-endpoint-exposed\u002Fcard-800x500.png",{"path":657,"title":658,"description":659,"published":660,"category":508,"image":661,"draft":512},"\u002Fblog\u002Flovable-security-scan","Escaneo de seguridad de Lovable: lo que no puede probar","Escaneo de seguridad de Lovable: qué revisan el Quick scan y el Deep scan, cuándo corre cada uno, y lo único que ningún escaneo desde dentro puede probar.","2026-09-24","\u002Fblog\u002Flovable-security-scan\u002Fcard-800x500.png",{"path":663,"title":664,"description":665,"published":666,"category":632,"image":667,"draft":512},"\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","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":669,"title":670,"description":671,"published":672,"category":508,"image":673,"draft":512},"\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":253,"title":675,"description":676,"published":677,"category":508,"image":678,"draft":512},"¿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":680,"title":681,"description":682,"published":683,"category":508,"image":684,"draft":512},"\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":686,"title":687,"description":688,"published":689,"category":508,"image":690,"draft":512},"\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":119,"title":692,"description":693,"published":694,"category":508,"image":695,"draft":512},"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":697,"title":698,"description":699,"published":700,"category":508,"image":701,"draft":512},"\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":703,"title":704,"description":705,"published":706,"category":508,"image":707,"draft":512},"\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":709,"title":710,"description":711,"published":712,"category":508,"image":713,"draft":512},"\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":715,"title":716,"description":717,"published":718,"category":632,"image":719,"draft":512},"\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":721,"title":722,"description":723,"published":724,"category":632,"image":725,"draft":512},"\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":727,"title":728,"description":729,"published":730,"category":632,"image":731,"draft":512},"\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":491,"title":733,"description":734,"published":735,"category":508,"image":736,"draft":512},"¿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":738,"title":739,"description":740,"published":741,"category":508,"image":742,"draft":512},"\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":744,"title":745,"description":746,"published":747,"category":508,"image":748,"draft":512},"\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":750,"title":751,"description":752,"published":753,"category":508,"image":754,"draft":512},"\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":756,"title":757,"description":758,"published":759,"category":508,"image":760,"draft":512},"\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":762,"title":763,"description":764,"published":765,"category":508,"image":766,"draft":512},"\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":768,"title":769,"description":770,"published":771,"category":508,"image":772,"draft":512},"\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":183,"title":774,"description":775,"published":776,"category":508,"image":777,"draft":512},"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":779,"title":780,"description":781,"published":782,"category":508,"image":783,"draft":512},"\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":785,"title":786,"description":787,"published":788,"category":508,"image":789,"draft":512},"\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":791,"title":792,"description":793,"published":794,"category":632,"image":795,"draft":512},"\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":797,"title":798,"description":799,"published":800,"category":508,"image":801,"draft":512},"\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":803,"title":804,"description":805,"published":806,"category":632,"image":807,"draft":512},"\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":809,"title":810,"description":811,"published":812,"category":508,"image":813,"draft":512},"\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":815,"title":816,"description":817,"published":818,"category":508,"image":819,"draft":512},"\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":821,"title":822,"description":823,"published":824,"category":508,"image":825,"draft":512},"\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":827,"title":828,"description":829,"published":830,"category":508,"image":831,"draft":512},"\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":833,"title":834,"description":835,"published":836,"category":632,"image":837,"draft":512},"\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":839,"title":840,"description":841,"published":842,"category":632,"image":843,"draft":512},"\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":845,"title":846,"description":847,"published":848,"category":508,"image":849,"draft":512},"\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":851,"title":852,"description":853,"published":854,"category":508,"image":855,"draft":512},"\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":456,"title":857,"description":858,"published":859,"category":632,"image":860,"draft":512},"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":862,"title":863,"description":864,"published":865,"category":508,"image":866,"draft":512},"\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":868,"title":869,"description":870,"published":865,"category":508,"image":871,"draft":512},"\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":873,"title":874,"description":875,"published":876,"category":508,"image":877,"draft":512},"\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":879,"title":880,"description":881,"published":882,"category":632,"image":883,"draft":512},"\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":262,"title":885,"description":886,"published":887,"category":508,"image":888,"draft":512},"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":890,"title":891,"description":892,"published":887,"category":632,"image":893,"draft":512},"\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":895,"title":896,"description":897,"published":898,"category":632,"image":899,"draft":512},"\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":901,"title":902,"description":903,"published":898,"category":508,"image":904,"draft":512},"\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",1791705962977]