[{"data":1,"prerenderedAt":1086},["ShallowReactive",2],{"blog-es-is-bolt-safe":3,"blog-index-es":736},{"id":4,"title":5,"body":6,"category":694,"cover":695,"coverAlt":696,"description":697,"draft":698,"extension":699,"faq":700,"image":715,"keywords":716,"meta":725,"navigation":726,"ogTitle":5,"path":727,"published":728,"seo":729,"stem":730,"tldr":731,"updated":728,"__hash__":735},"blog_es\u002Fblog\u002Fis-bolt-safe.md","¿Es seguro Bolt? Lo que vimos en 1.123 aplicaciones Bolt",{"type":7,"value":8,"toc":678},"minimark",[9,18,26,29,34,37,40,62,65,69,82,218,221,227,243,247,250,260,271,283,286,297,301,304,307,367,374,382,389,394,398,401,404,426,434,438,441,444,449,459,463,466,469,485,492,496,499,506,513,516,520,523,561,565,571,580,599,602,613,630,633,641,645,667],[10,11,12,13,17],"p",{},"Construiste algo en Bolt, pulsaste Publish, y ahora vive en una dirección que\ntermina en ",[14,15,16],"code",{},"bolt.host",". Antes de mandar ese enlace a clientes de verdad\nescribiste \"es seguro bolt\" en un buscador, y lo que volvió fue una lista de\ncinco vulnerabilidades que, según dicen, están en casi todas las aplicaciones\nBolt, con un escáner a la venta al final de la página.",[10,19,20,21,25],{},"Esto es lo que esas listas hacen mal: ",[22,23,24],"strong",{},"ponen todos los riesgos al mismo nivel,\ny en las aplicaciones Bolt en vivo la mayoría apenas aparece."," Source maps,\ncabeceras cross-origin abiertas y rutas de API sin proteger figuran ahí al mismo\nnivel que las claves filtradas y las tablas abiertas. En nuestros datos las tres\nprimeras aparecieron en 13, 1 y 4 aplicaciones de más de mil. Las otras dos son\ndonde estaban los hallazgos.",[10,27,28],{},"Entre el 12 y el 14 de agosto de 2026 pasamos las mismas nueve comprobaciones\nexternas que cualquiera puede lanzar gratis desde nuestra página de inicio sobre\n30.998 aplicaciones en vivo, y 1.123 de ellas estaban publicadas en el hosting\npropio de Bolt. Esto es lo que volvió de ellas, y hasta aquí llega nuestra\nvista.",[30,31,33],"h2",{"id":32},"es-seguro-bolt","¿Es seguro Bolt?",[10,35,36],{},"En todo lo que decide Bolt, sí. Su hosting salió tan limpio como el de Lovable,\ny todo lo que bajó una nota estaba dentro de una aplicación construida por su\ndueño.",[10,38,39],{},"Piensa en una aplicación Bolt como en una tienda. Bolt levanta el edificio: la\ndirección, el certificado, el hosting. Tú llenas el escaparate, es decir, cada\npágina, imagen y script que tu aplicación le entrega a un visitante, y cualquiera\nque pase por delante puede leer lo que hay dentro. Detrás de la tienda está el\nalmacén, tu base de datos, con su propia puerta y su propia cerradura. \"¿Es\nseguro Bolt?\" son en realidad tres preguntas, una por cada uno.",[41,42,43,50,56],"ol",{},[44,45,46,49],"li",{},[22,47,48],{},"El edificio."," ¿Publica Bolt tu aplicación como debe? Un certificado\nválido, un dominio que no caduque, nada olvidado en una dirección pública.\nEsto es trabajo de Bolt.",[44,51,52,55],{},[22,53,54],{},"El escaparate."," Lo que descarga el navegador de un visitante. Una clave\nque se quede ahí la puede leer cualquiera que mire, llegara como llegara.",[44,57,58,61],{},[22,59,60],{},"El almacén."," Si tu base de datos le responde a un desconocido que da la\nvuelta por detrás y pregunta. Eso depende de una cerradura que pones tú,\ntabla por tabla.",[10,63,64],{},"Nuestras comprobaciones leen las tres desde fuera. Ninguna lee el código que\nescribió el agente de Bolt como lo leerías tú en el editor, y este artículo no\nintenta adivinarlo.",[30,66,68],{"id":67},"lo-que-encontramos-en-1123-aplicaciones-bolt","Lo que encontramos en 1.123 aplicaciones Bolt",[10,70,71,72,75,76,81],{},"Nueve comprobaciones, desde fuera, sin iniciar sesión y sin acceso a la cuenta\nde nadie. Cuando una base de datos respondía, le preguntábamos cuántas filas\nentregaría y nos deteníamos ahí; no leímos ninguna. Ninguna aplicación se nombra\naquí ni en nada de lo que publicamos. Cada proporción de abajo es sobre las\naplicaciones en las que esa comprobación ",[22,73,74],{},"respondió",", porque una comprobación\nque no pudo terminar es desconocida, no superada, y por eso se mueven los\ndenominadores. El método y los datos están\n",[77,78,80],"a",{"href":79},"\u002Fresearch\u002Fvibe-coded-app-security-2026","en el informe",".",[83,84,85,102],"table",{},[86,87,88],"thead",{},[89,90,91,95,99],"tr",{},[92,93,94],"th",{},"Qué comprobamos",[92,96,98],{"align":97},"right","Aplicaciones Bolt",[92,100,101],{},"Quién lo decide",[103,104,105,117,128,138,149,159,169,179,197,208],"tbody",{},[89,106,107,111,114],{},[108,109,110],"td",{},"Faltan cabeceras de seguridad del navegador",[108,112,113],{"align":97},"1.121 de 1.123",[108,115,116],{},"El hosting de Bolt",[89,118,119,122,125],{},[108,120,121],{},"Algo con forma de clave en el código que descarga un visitante",[108,123,124],{"align":97},"75 de 1.123 (7 %)",[108,126,127],{},"Tu aplicación",[89,129,130,133,136],{},[108,131,132],{},"Una tabla de la base de datos legible sin iniciar sesión",[108,134,135],{"align":97},"27 de 35",[108,137,127],{},[89,139,140,143,146],{},[108,141,142],{},"Código fuente original publicado (source maps)",[108,144,145],{"align":97},"13 de 1.123 (1 %)",[108,147,148],{},"Un ajuste de build",[89,150,151,154,157],{},[108,152,153],{},"Un bucket de almacenamiento que lista sus archivos",[108,155,156],{"align":97},"6 de 901",[108,158,127],{},[89,160,161,164,167],{},[108,162,163],{},"Una ruta de API que entregó datos a un desconocido",[108,165,166],{"align":97},"4 de 1.120",[108,168,127],{},[89,170,171,174,177],{},[108,172,173],{},"Cualquier web autorizada a llamar a tu API",[108,175,176],{"align":97},"1 de 1.120",[108,178,127],{},[89,180,181,192,195],{},[108,182,183,184,187,188,191],{},"Un archivo privado como ",[14,185,186],{},".env"," o ",[14,189,190],{},".git\u002Fconfig"," en una URL pública",[108,193,194],{"align":97},"0 de 1.109",[108,196,127],{},[89,198,199,202,205],{},[108,200,201],{},"Certificado caducado o no fiable",[108,203,204],{"align":97},"0 de 1.119",[108,206,207],{},"Bolt",[89,209,210,213,216],{},[108,211,212],{},"Dominio a punto de caducar",[108,214,215],{"align":97},"0 de 1.123",[108,217,207],{},[10,219,220],{},"Las notas: 1.051 A, 33 B, 24 C, 15 D y ninguna F.",[222,223],"diagram",{"alt":224,"caption":225,"src":226},"Siete barras horizontales en una misma escala, cada una precedida de un pequeño icono y seguida de un número: 1.121 para las cabeceras, 75 para las claves, 27 para las tablas legibles, 13 para los source maps, 6 para los buckets, 4 para las rutas abiertas y 1 para la cabecera cross-origin abierta. La barra de arriba es larga y gris pálido, las demás son cortas y turquesa, y las tres últimas son líneas finas rodeadas por un círculo.","Número de aplicaciones en una sola escala. La barra gris la decide el hosting de Bolt. Cada barra turquesa salió de algo dentro de la aplicación, y la fila de tablas legibles se mide sobre una base mucho menor, que una imagen más abajo desmonta.","\u002Fblog\u002Fis-bolt-safe\u002Fwhat-we-found-1600x720.png",[10,228,229,230,233,234,238,239,242],{},"Esa primera fila la decide quien sirve tus páginas, y en ",[14,231,232],{},"yourapp.bolt.host"," ese\nes Bolt, así que 1.121 aplicaciones recibieron la misma respuesta. Las cabeceras\n",[77,235,237],{"href":236},"\u002Fblog\u002Fmissing-security-headers","merece la pena tenerlas",", y no son lo que\nconvierte una nota en D. Quita esa fila y ",[22,240,241],{},"1.008 de las 1.123 aplicaciones Bolt\nno tenían nada más",". Las 115 restantes son el tema del resto de este artículo.",[30,244,246],{"id":245},"lo-que-bolt-hace-bien","Lo que Bolt hace bien",[10,248,249],{},"Las comprobaciones que dependen de Bolt volvieron casi vacías, y en el único\najuste de build que medimos Bolt empata con Lovable.",[10,251,252,255,256,81],{},[22,253,254],{},"Source maps."," 13 de 1.123 aplicaciones Bolt publican los archivos originales\ndetrás de la aplicación, comentarios incluidos. Es algo más de una de cada cien,\nmás o menos la misma tasa que las 225 de 18.553 de Lovable, y\n",[77,257,259],{"href":258},"\u002Fblog\u002Fsource-maps-exposed-in-production","un map revela más de lo que se suele pensar",[10,261,262,265,266,270],{},[22,263,264],{},"Cabeceras cross-origin."," Una aplicación de 1.120 le decía a cualquier web del\nmundo que podía llamar a su API. Es el hallazgo\n",[77,267,269],{"href":268},"\u002Fblog\u002Fcors-wildcard-security-risk","que más fácilmente deja a otro sitio actuar como tu usuario",",\ny en Bolt apareció una vez.",[10,272,273,276,277,279,280,282],{},[22,274,275],{},"El edificio en sí."," El certificado era válido en las 1.119 aplicaciones en\nlas que pudimos leer uno, ningún dominio de 1.123 estaba a punto de caducar, y\nninguna aplicación servía un archivo ",[14,278,186],{}," o un ",[14,281,190],{}," en una dirección\ncualquiera.",[10,284,285],{},"Nada de eso te pidió nada a ti, y en algunos otros builders sí.",[287,288,290],"callout",{"type":289},"note",[10,291,292,293,81],{},"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",[77,294,296],{"href":295},"\u002Fsecurity-scanner","Escanea tu aplicación",[30,298,300],{"id":299},"de-qué-estaban-hechas-las-75-claves","De qué estaban hechas las 75 claves",[10,302,303],{},"Casi todas estaban bien, y las pocas que no lo estaban son lo más caro de este\nartículo.",[10,305,306],{},"75 de las 1.123 aplicaciones Bolt tenían algo con forma de clave en el código\nque descarga un visitante. Contadas como formas, son el 7 % de las aplicaciones\nBolt \"filtrando secretos\". Contadas por lo que puede hacer cada clave, se\nreparten así, con cada aplicación contada una sola vez, bajo lo más grave que\ncontiene:",[83,308,309,322],{},[86,310,311],{},[89,312,313,316,319],{},[92,314,315],{},"Lo que encontramos en el bundle",[92,317,318],{"align":97},"Aplicaciones",[92,320,321],{},"Qué significa",[103,323,324,335,346,357],{},[89,325,326,329,332],{},[108,327,328],{},"Una clave de API de Google, y nada más",[108,330,331],{"align":97},"38",[108,333,334],{},"Suele ser correcto, una vez restringida a tu dominio",[89,336,337,340,343],{},[108,338,339],{},"Un secreto que no pudimos atribuir",[108,341,342],{"align":97},"26",[108,344,345],{},"No pudimos decir a qué proveedor pertenece",[89,347,348,351,354],{},[108,349,350],{},"Una clave de OpenAI",[108,352,353],{"align":97},"10",[108,355,356],{},"Cobra a tu cuenta, directamente",[89,358,359,362,365],{},[108,360,361],{},"Una clave de Anthropic",[108,363,364],{"align":97},"1",[108,366,356],{},[10,368,369,370,81],{},"Las 38 claves de Google son la razón por la que clasificamos cada clave en lugar\nde limitarnos a buscar un patrón. Una clave de Google Maps en el navegador está\ndonde tiene que estar, y el arreglo es\n",[77,371,373],{"href":372},"\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend","restringirla a tu propio dominio",[10,375,376,377,381],{},"Las diez claves de OpenAI son el caso contrario. Una clave de OpenAI es un\nbearer token: quien la tiene puede gastarla, desde cualquier sitio, y OpenAI no\nofrece ningún ajuste que ate una clave a tu web. Las diez aplicaciones sacaron\nuna D, porque un solo hallazgo crítico pone techo a la nota, haga lo que haga\nbien la aplicación en lo demás.\n",[77,378,380],{"href":379},"\u002Fblog\u002Fopenai-api-key-exposed-in-frontend","Qué hacer con una, en orden"," empieza\npor rotarla hoy mismo.",[10,383,384,385,388],{},"Este es el número que convierte esto en el hallazgo de Bolt. Las aplicaciones\nBolt eran menos de 4 de cada 100 aplicaciones escaneadas, y llevaban ",[22,386,387],{},"10 de las\n33 claves de OpenAI"," que encontramos en total. Por aplicación, sale más o menos\nuna aplicación Bolt de cada 110, frente a 18 de las 18.554 aplicaciones Lovable,\nmás o menos una de cada mil. Diez aplicaciones son una muestra pequeña, y unas\npocas más o menos moverían mucho esa proporción. Aun así Bolt seguiría por\ndelante de todos los demás builders que medimos.",[222,390],{"alt":391,"caption":392,"src":393},"Dos barras de la misma longitud, una encima de la otra, cada una precedida de un icono. La de arriba representa 30.998 aplicaciones escaneadas y tiene en su extremo izquierdo una franja turquesa fina marcada 1.123, con el logo de Bolt al lado. La de abajo representa 33 claves de OpenAI y tiene una franja roja de casi un tercio de su longitud marcada 10.","Bolt era una franja fina de las aplicaciones escaneadas y casi un tercio de las claves de OpenAI encontradas. Los números son pequeños, por eso se muestran los dos en lugar de convertirlos en una tasa.","\u002Fblog\u002Fis-bolt-safe\u002Fshare-of-openai-keys-1600x620.png",[30,395,397],{"id":396},"por-qué-las-aplicaciones-bolt-filtran-claves-de-api","¿Por qué las aplicaciones Bolt filtran claves de API?",[10,399,400],{},"Desde fuera no vemos cómo llegó ahí cada una de esas diez claves, y las propias\ninstrucciones de Bolt dicen que ninguna debería estar ahí.",[10,402,403],{},"La documentación de Bolt describe el camino previsto. Pídele al agente que\nintegre OpenAI y, en palabras de la documentación, \"terminará el código y luego\nmostrará un mensaje pidiéndote que añadas tu secreto\". Ese secreto va en el\npanel Secrets, donde solo una función de servidor puede leerlo. Una función de\nservidor se ejecuta del lado de Bolt, así que el navegador del visitante nunca\nrecibe la clave. Construida así, la clave se queda en el almacén.",[10,405,406,407,410,411,414,415,418,419,421,422,425],{},"El atajo que sí podemos nombrar es la variable de entorno. La introducción de\nBolt a las bases de datos dice que las variables de entorno mantienen privados\nestos valores, y dos de los tres nombres que cita, ",[14,408,409],{},"VITE_SUPABASE_URL"," y\n",[14,412,413],{},"VITE_SUPABASE_ANON_KEY",", empiezan por ",[14,416,417],{},"VITE_",". Ese prefijo es de Vite, la\nherramienta de build, y la documentación de Vite dice lo contrario sobre él: una\nvariable ",[14,420,417],{}," se escribe en el código que descarga el navegador, y nunca debe\ncontener una clave de API. Para esos dos nombres no pasa nada, porque la\ndirección de un proyecto y una clave publicable están hechas para ser públicas.\nCopia el mismo patrón para ",[14,423,424],{},"VITE_OPENAI_API_KEY"," y la clave queda en el\nescaparate.",[10,427,428,429,433],{},"Una clave pegada en el chat mientras arreglabas otra cosa también puede acabar\nescrita directamente en una página. En los dos casos el resultado es el mismo\narchivo. ",[77,430,432],{"href":431},"\u002Fblog\u002Fvite-and-next-public-env-vars","Cómo funciona el prefijo"," explica\nqué valores van detrás de él y cuáles nunca.",[30,435,437],{"id":436},"_27-de-35-las-bases-de-bolt-que-pudimos-consultar","27 de 35: las bases de Bolt que pudimos consultar",[10,439,440],{},"De las bases de datos de Bolt que nos dieron una respuesta utilizable, 27 de 35\nentregaron filas a una petición sin ningún inicio de sesión. Es un recuento, y\nla base es demasiado pequeña para imprimirlo como porcentaje.",[10,442,443],{},"Los denominadores importan aquí más que en cualquier otro punto del artículo.\n266 de las 1.123 aplicaciones Bolt nombraban un proyecto de Supabase en el código\nque publican. Solo 35 de ellas respondieron lo bastante bien como para poder\njuzgarlas. Las otras 231 no se pudieron juzgar, lo que las deja como\ndesconocidas, y no las contamos ni como limpias ni como expuestas.",[222,445],{"alt":446,"caption":447,"src":448},"Cuatro barras apiladas que se estrechan de izquierda a derecha en una misma escala: 1.123 aplicaciones Bolt, 266 que nombraban un proyecto de Supabase, 35 cuya base dio una respuesta utilizable y 27 que devolvieron filas sin iniciar sesión. La tercera barra continúa como un contorno discontinuo hasta el ancho de la segunda, marcada con un signo de interrogación y el número 231. La última barra es roja.","Cuatro denominadores. El 27 se mide sobre el 35, y las 231 que no pudimos juzgar están dibujadas como desconocidas en lugar de dejarse fuera.","\u002Fblog\u002Fis-bolt-safe\u002Fwhere-it-lands-1600x620.png",[10,450,451,452,187,455,458],{},"En 4 de las 27, la tabla que respondió tenía el tipo de nombre que llevan las\ntablas sobre personas, como ",[14,453,454],{},"users",[14,456,457],{},"profiles",". Esas cuatro y las once\naplicaciones con una clave de OpenAI o de Anthropic suman las 15 notas D. En las\notras 23 era una tabla que no podíamos identificar desde fuera, quizá una lista\nde productos que siempre tuvo que ser pública, quizá cualquier otra cosa.",[30,460,462],{"id":461},"por-qué-todo-se-decide-en-la-base-de-datos","Por qué todo se decide en la base de datos",[10,464,465],{},"Porque la dirección del almacén está impresa en el escaparate, y tiene que\nestarlo.",[10,467,468],{},"Cuando una aplicación Bolt lee sus datos desde la página, la página necesita la\ndirección de la base de datos y una clave publicable, así que las dos viajan\nhasta cada visitante. Que esa clave sea pública es correcto; es por donde entra\ntu propia aplicación. Lo que recibe a cambio lo decide un ajuste por tabla\nllamado Row Level Security. Activado y con una policy escrita, la clave pública\nsolo lee las filas que la policy permite. Desactivado, lee la tabla.",[10,470,471,472,475,476,479,480,484],{},"Supabase activa la Row Level Security por defecto en las tablas que creas a base\nde clics en su Table Editor. Las tablas creadas ",[22,473,474],{},"ejecutando SQL"," no la\nreciben, y ejecutar SQL es justo la forma en que un builder crea tablas por ti.\nActivarla, además, es solo el primer paso, porque la policy que escribe un\nasistente para quitarse de encima un error de permisos suele ser\n",[14,477,478],{},"using (true)",", que deja pasar a todo el mundo mientras el panel muestra la tabla\ncomo protegida.\n",[77,481,483],{"href":482},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","La RLS está activada y tu tabla sigue siendo pública","\ncuenta esa historia entera.",[10,486,487,488,81],{},"La comprobación de base de datos de Bolt busca exactamente esto: su\ndocumentación la describe como capaz de encontrar \"una policy de Row Level\nSecurity (RLS) que falta o un permiso demasiado abierto\". La guía en lenguaje\nsencillo para esta plataforma es\n",[77,489,491],{"href":490},"\u002Fis-your-bolt-app-safe","¿es segura tu aplicación Bolt?",[30,493,495],{"id":494},"qué-revisa-la-auditoría-de-seguridad-de-bolt","Qué revisa la auditoría de seguridad de Bolt",[10,497,498],{},"Lee tu proyecto desde dentro, y se ejecuta cuando pulsas el botón.",[10,500,501,502,505],{},"Bolt anunció la auditoría el 30 de julio de 2026. En un plan de pago está en el\nmenú Publish como ",[22,503,504],{},"Run security audit",": revisa tu código y tu base de datos,\ncorrige sola la mayoría de los problemas, señala el resto y no gasta tus tokens.\nEn todos los planes, también en el gratuito, los ajustes de una base de datos de\nBolt tienen una sección Security que ejecuta la comprobación de Row Level\nSecurity descrita arriba.",[10,507,508,509,512],{},"Nuestro escaneo se hizo dos semanas después de que apareciera ese botón, así\nque los números de arriba no pueden decir cuánto ha cambiado las cosas desde\nentonces. Lo que sí podemos decir es cómo encajan las dos miradas. La auditoría\nve tu proyecto desde dentro, incluidas tablas que tus páginas nunca mencionan,\nalgo que un escaneo desde fuera nunca puede hacer. Un escaneo desde fuera ve lo\nque un desconocido obtiene de la aplicación publicada. Cuando una auditoría\ntermina, el botón pasa a decir ",[22,510,511],{},"Security audit up to date",", y el siguiente\ncambio que publiques es uno que no ha visto.",[10,514,515],{},"Lanza la auditoría antes de publicar y mira desde fuera después. Si las dos no\ncoinciden sobre si una tabla es legible, quédate con la respuesta de fuera,\nporque es la que obtiene un desconocido.",[30,517,519],{"id":518},"cómo-revisar-tu-propia-aplicación-bolt","Cómo revisar tu propia aplicación Bolt",[10,521,522],{},"Cinco cosas que mirar. Usa una ventana privada, para que tu propia sesión no\nresponda por un desconocido.",[41,524,525,531,537,546,552],{},[44,526,527,530],{},[22,528,529],{},"Averigua qué base de datos tienes."," Los proyectos nuevos de Bolt usan una\nbase de datos de Bolt por defecto. Si elegiste Supabase al crear el proyecto,\no conectaste uno después, tus tablas viven en un proyecto de Supabase en el\nque puedes iniciar sesión.",[44,532,533,536],{},[22,534,535],{},"Lee la cerradura de cada tabla."," Con una base de Bolt, abre la sección\nSecurity en los ajustes de la base de datos y ejecuta la comprobación. Con\nSupabase, abre Authentication → Policies y recorre la lista: una tabla con la\nRow Level Security desactivada la puede leer cualquiera que tenga la\ndirección de tu proyecto, y esa dirección está en tu aplicación. Una policy\nque deja pasar a todo el mundo cuenta como desactivada.",[44,538,539,545],{},[22,540,541,542,544],{},"Busca ",[14,543,417],{}," en tu proyecto."," Cada valor detrás de ese prefijo está en el\nescaparate. La dirección de un proyecto y una clave publicable van ahí. Una\nclave que te cobra va en el panel Secrets, leída por una función de servidor.\nSi alguna estuvo alguna vez detrás del prefijo, rótala primero en el\nproveedor, porque el valor antiguo sigue funcionando hasta que lo hagas.",[44,547,548,551],{},[22,549,550],{},"Mira tu almacenamiento."," Un bucket marcado como público le lista cada\narchivo a cualquiera que pregunte, incluidos los que tu aplicación nunca\nmuestra.",[44,553,554,557,558,81],{},[22,555,556],{},"O deja que lo haga el escaneo."," Hace esto desde fuera junto con otras cinco\ncomprobaciones, tarda unos 20 segundos, no pide cuenta y te muestra una nota y\nlo que la produjo: ",[77,559,560],{"href":295},"escanea tu aplicación gratis",[30,562,564],{"id":563},"para-que-siga-así-después-de-publicar","Para que siga así después de publicar",[10,566,567,570],{},[22,568,569],{},"Una comprobación del mes pasado describe la aplicación del mes pasado."," En\nBolt, publicar es un botón, así que una tabla añadida esta mañana o una clave\npegada a medianoche está en vivo en cuanto lo pulsas.",[10,572,573],{},[22,574,575,579],{},[77,576,578],{"href":577},"\u002Fpricing","Reeve Monitor"," vuelve a pasar las nueve comprobaciones por ti:",[581,582,583,586,589,596],"ul",{},[44,584,585],{},"las nueve comprobaciones cada hora, en hasta tres aplicaciones",[44,587,588],{},"si la aplicación responde, cada 60 segundos",[44,590,591,592,595],{},"un mensaje cuando un resultado ",[22,593,594],{},"cambia",", para que un hallazgo nuevo no espere a que mires",[44,597,598],{},"un informe mensual de lo que vio",[10,600,601],{},"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,603,604,612],{},[22,605,606,607,611],{},"Si tu aplicación Bolt guarda sus datos en tu propio proyecto de Supabase,\n",[77,608,610],{"href":609},"\u002Fsupabase-backups","Reeve Care"," guarda una copia."," Eso incluye un proyecto que\nconectaste desde el principio y una base de datos de Bolt que hayas reclamado en\nSupabase.",[581,614,615,618,621,624,627],{},[44,616,617],{},"una copia cifrada de tu base de Supabase cada noche, guardada donde tu proyecto no puede llegar",[44,619,620],{},"cada copia verificada antes de contar, con un recuento de las filas de cada tabla",[44,622,623],{},"una restauración con un clic cuando la necesites",[44,625,626],{},"también tus archivos subidos, en cuanto conectes una credencial de Storage",[44,628,629],{},"todo lo que hace Monitor",[10,631,632],{},"Care cuesta $49 al mes de tarifa de lista por una aplicación, con los mismos\nsiete días gratis.",[10,634,635,636,640],{},"Una tabla abierta es algo que un desconocido puede leer. Una migración que salió\nal revés, o un agente con acceso a la base de datos, es algo que puede vaciarla,\ny ninguna de las nueve comprobaciones de este artículo traería las filas de\nvuelta.\n",[77,637,639],{"href":638},"\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,642,644],{"id":643},"qué-hacer-esta-semana","Qué hacer esta semana",[646,647,648],"key-takeaways",{},[581,649,650,655,658,661,664],{},[44,651,541,652,654],{},[14,653,417],{}," en tu proyecto Bolt y lee cada valor que hay detrás. Una clave que te cobra va en el panel Secrets, leída por una función de servidor.",[44,656,657],{},"Si alguna vez hubo en esa lista una clave de OpenAI u otra clave de pago, rótala en el proveedor antes de quitarla del código.",[44,659,660],{},"Ejecuta la comprobación de seguridad de la base de datos, o abre Authentication → Policies en Supabase, y lee la cerradura de cada tabla. Una policy que deja pasar a todo el mundo deja la tabla abierta.",[44,662,663],{},"Lanza la auditoría de Bolt antes de publicar y luego revisa desde fuera la aplicación publicada.",[44,665,666],{},"Guarda una copia de tu base de datos donde ni tu proyecto ni tu agente puedan llegar, y comprueba que esa copia se restaura.",[10,668,669,670,672,673,677],{},"Empieza por la búsqueda de ",[14,671,417],{},", porque es el único hallazgo en Bolt que\ncuesta dinero por sí solo. Si todavía estás eligiendo entre builders,\n",[77,674,676],{"href":675},"\u002Fblog\u002Fsafest-ai-app-builder","qué builder de aplicaciones con IA es el más seguro","\npone a los cinco uno al lado del otro.",{"title":679,"searchDepth":680,"depth":680,"links":681},"",3,[682,684,685,686,687,688,689,690,691,692,693],{"id":32,"depth":683,"text":33},2,{"id":67,"depth":683,"text":68},{"id":245,"depth":683,"text":246},{"id":299,"depth":683,"text":300},{"id":396,"depth":683,"text":397},{"id":436,"depth":683,"text":437},{"id":461,"depth":683,"text":462},{"id":494,"depth":683,"text":495},{"id":518,"depth":683,"text":519},{"id":563,"depth":683,"text":564},{"id":643,"depth":683,"text":644},"Fundamentos de seguridad","\u002Fblog\u002Fis-bolt-safe\u002Fcover-1200x630.png","Una aplicación como escaparate con el logo de Bolt de letrero, una llave roja dentro, una base cerrada detrás y un visitante fuera.","¿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.",false,"md",[701,704,707,709,712],{"q":702,"a":703},"¿Es seguro usar Bolt?","En la parte que controla Bolt, nuestros números dicen que sí. En 1.123 aplicaciones en vivo en bolt.host no encontramos ningún certificado defectuoso ni dominios a punto de caducar, 13 aplicaciones publicaban source maps y una dejaba a cualquier web llamar a su API. Lo que decide tu propia aplicación está dentro de ella: si una clave que te cobra acabó en el código que descargan los visitantes, y si tus tablas le responden a un desconocido. Son dos ajustes que puedes revisar tú mismo.",{"q":705,"a":706},"¿Las aplicaciones Bolt son seguras por defecto?","Lo que Bolt publica por ti salió limpio en nuestro escaneo. El resto depende de lo que pasó en el chat. Se supone que Bolt guarda una clave de API de pago en su panel Secrets, detrás de una función de servidor, y tiene una comprobación de base de datos que busca Row Level Security ausente. Ninguna de las dos se ejecuta sola: la auditoría del proyecto es un botón del menú Publish en los planes de pago, y la comprobación de base de datos es una sección que abres tú. En agosto de 2026, 75 de 1.123 aplicaciones Bolt tenían algo con forma de clave en su front end, y 27 de las 35 bases que pudimos consultar le respondieron a un desconocido.",{"q":397,"a":708},"Desde fuera no vemos cómo llegó ahí cada clave. La vía que sí podemos nombrar es la variable de entorno. Una variable cuyo nombre empieza por VITE_ se escribe en el JavaScript que descarga cada visitante, y Vite, la herramienta de build detrás de ese prefijo, dice que esas variables nunca deben contener una clave de API. Para la dirección de un proyecto o una clave publicable no pasa nada. Para una clave de OpenAI es una factura. Diez de las 1.123 aplicaciones Bolt que escaneamos llevaban una.",{"q":710,"a":711},"¿Mis datos de Supabase están seguros en una aplicación Bolt?","Depende de un ajuste por tabla. Cuando una aplicación Bolt habla con Supabase desde la página, usa una clave publicable que está hecha para ser pública, así que solo la Row Level Security decide qué recibe un desconocido. Pudimos pedir filas a 35 bases de Bolt sin iniciar sesión, y 27 las entregaron. Es un recuento, y la base es demasiado pequeña para convertirlo en porcentaje. Tus propias policies las lees en unos minutos.",{"q":713,"a":714},"¿Es Bolt más seguro que Lovable?","En la parte de plataforma quedaron empatados: 13 de 1.123 aplicaciones Bolt y 225 de 18.553 aplicaciones Lovable publicaban source maps, algo más de una de cada cien en ambos casos, y ninguna tenía problemas de certificado o de dominio. La diferencia estuvo en las claves. Diez de las 1.123 aplicaciones Bolt llevaban una clave de OpenAI, frente a 18 de 18.554 en Lovable. Diez es un número pequeño, así que léelo como una dirección. La comparación completa de los cinco builders está en un artículo aparte.","\u002Fblog\u002Fis-bolt-safe\u002Fcard-800x500.png",[717,718,719,720,721,722,723,724],"bolt es seguro","seguridad bolt.new","es seguro bolt.new","seguridad de aplicaciones bolt","son seguras las aplicaciones bolt","seguridad bolt supabase","problemas de seguridad de bolt","seguridad del despliegue bolt",{},true,"\u002Fblog\u002Fis-bolt-safe","2026-10-02",{"title":5,"description":697},"blog\u002Fis-bolt-safe",[732,733,734],"¿Es seguro Bolt? En todo lo que decide Bolt, sí. En 1.123 aplicaciones Bolt en vivo encontramos 13 que publican sus source maps, una que dejaba a cualquier web llamar a su API y ni un solo certificado defectuoso.","75 de esas aplicaciones llevaban algo con forma de clave en el código que descarga un visitante. Casi todas eran claves de Google, que suelen estar bien. Diez eran claves de OpenAI, y quien encuentre una puede gastarla.","De las 35 bases de datos de Bolt que pudimos consultar de verdad, 27 entregaron filas a una petición sin iniciar sesión. Los dos problemas son ajustes de tu propio proyecto.","BGWupo4QP0QiPjm9IjmT3UtBXJN5s-fs7biJFj2ODRQ",[737,743,749,755,761,767,773,779,785,791,792,798,804,810,817,823,829,834,840,846,852,858,864,870,876,881,887,893,899,905,911,917,922,928,934,940,946,952,958,963,968,974,980,986,992,998,1004,1010,1015,1021,1027,1033,1038,1043,1049,1053,1059,1065,1070,1075,1081],{"path":738,"title":739,"description":740,"published":741,"category":694,"image":742,"draft":698},"\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":744,"title":745,"description":746,"published":747,"category":694,"image":748,"draft":698},"\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":750,"title":751,"description":752,"published":753,"category":694,"image":754,"draft":698},"\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":756,"title":757,"description":758,"published":759,"category":694,"image":760,"draft":698},"\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":762,"title":763,"description":764,"published":765,"category":694,"image":766,"draft":698},"\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":768,"title":769,"description":770,"published":771,"category":694,"image":772,"draft":698},"\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":774,"title":775,"description":776,"published":777,"category":694,"image":778,"draft":698},"\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":780,"title":781,"description":782,"published":783,"category":694,"image":784,"draft":698},"\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":786,"title":787,"description":788,"published":789,"category":694,"image":790,"draft":698},"\u002Fblog\u002Fis-v0-safe","Seguridad de v0: las 1.790 aplicaciones escaneadas sacaron una A","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.","2026-10-03","\u002Fblog\u002Fis-v0-safe\u002Fcard-800x500.png",{"path":727,"title":5,"description":697,"published":728,"category":694,"image":715,"draft":698},{"path":793,"title":794,"description":795,"published":796,"category":694,"image":797,"draft":698},"\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":799,"title":800,"description":801,"published":802,"category":694,"image":803,"draft":698},"\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":805,"title":806,"description":807,"published":808,"category":694,"image":809,"draft":698},"\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":811,"title":812,"description":813,"published":814,"category":815,"image":816,"draft":698},"\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":818,"title":819,"description":820,"published":821,"category":815,"image":822,"draft":698},"\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":824,"title":825,"description":826,"published":827,"category":815,"image":828,"draft":698},"\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":830,"title":831,"description":832,"published":827,"category":694,"image":833,"draft":698},"\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":835,"title":836,"description":837,"published":838,"category":694,"image":839,"draft":698},"\u002Fblog\u002Fopen-api-endpoint-exposed","¿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":841,"title":842,"description":843,"published":844,"category":694,"image":845,"draft":698},"\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":847,"title":848,"description":849,"published":850,"category":815,"image":851,"draft":698},"\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":853,"title":854,"description":855,"published":856,"category":694,"image":857,"draft":698},"\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":859,"title":860,"description":861,"published":862,"category":694,"image":863,"draft":698},"\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":865,"title":866,"description":867,"published":868,"category":694,"image":869,"draft":698},"\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":871,"title":872,"description":873,"published":874,"category":694,"image":875,"draft":698},"\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":431,"title":877,"description":878,"published":879,"category":694,"image":880,"draft":698},"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":882,"title":883,"description":884,"published":885,"category":694,"image":886,"draft":698},"\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":888,"title":889,"description":890,"published":891,"category":694,"image":892,"draft":698},"\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":894,"title":895,"description":896,"published":897,"category":694,"image":898,"draft":698},"\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":900,"title":901,"description":902,"published":903,"category":815,"image":904,"draft":698},"\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":906,"title":907,"description":908,"published":909,"category":815,"image":910,"draft":698},"\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":912,"title":913,"description":914,"published":915,"category":815,"image":916,"draft":698},"\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":675,"title":918,"description":919,"published":920,"category":694,"image":921,"draft":698},"¿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":923,"title":924,"description":925,"published":926,"category":694,"image":927,"draft":698},"\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":929,"title":930,"description":931,"published":932,"category":694,"image":933,"draft":698},"\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":935,"title":936,"description":937,"published":938,"category":694,"image":939,"draft":698},"\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":941,"title":942,"description":943,"published":944,"category":694,"image":945,"draft":698},"\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":947,"title":948,"description":949,"published":950,"category":694,"image":951,"draft":698},"\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":953,"title":954,"description":955,"published":956,"category":694,"image":957,"draft":698},"\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":236,"title":959,"description":960,"published":961,"category":694,"image":962,"draft":698},"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":379,"title":964,"description":965,"published":966,"category":694,"image":967,"draft":698},"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":969,"title":970,"description":971,"published":972,"category":694,"image":973,"draft":698},"\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":975,"title":976,"description":977,"published":978,"category":815,"image":979,"draft":698},"\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":981,"title":982,"description":983,"published":984,"category":694,"image":985,"draft":698},"\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":987,"title":988,"description":989,"published":990,"category":815,"image":991,"draft":698},"\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":993,"title":994,"description":995,"published":996,"category":694,"image":997,"draft":698},"\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":999,"title":1000,"description":1001,"published":1002,"category":694,"image":1003,"draft":698},"\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":1005,"title":1006,"description":1007,"published":1008,"category":694,"image":1009,"draft":698},"\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":268,"title":1011,"description":1012,"published":1013,"category":694,"image":1014,"draft":698},"¿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":1016,"title":1017,"description":1018,"published":1019,"category":815,"image":1020,"draft":698},"\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":1022,"title":1023,"description":1024,"published":1025,"category":815,"image":1026,"draft":698},"\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":1028,"title":1029,"description":1030,"published":1031,"category":694,"image":1032,"draft":698},"\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":372,"title":1034,"description":1035,"published":1036,"category":694,"image":1037,"draft":698},"¿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":638,"title":1039,"description":1040,"published":1041,"category":815,"image":1042,"draft":698},"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":1044,"title":1045,"description":1046,"published":1047,"category":694,"image":1048,"draft":698},"\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":258,"title":1050,"description":1051,"published":1047,"category":694,"image":1052,"draft":698},"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":1054,"title":1055,"description":1056,"published":1057,"category":694,"image":1058,"draft":698},"\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":1060,"title":1061,"description":1062,"published":1063,"category":815,"image":1064,"draft":698},"\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":482,"title":1066,"description":1067,"published":1068,"category":694,"image":1069,"draft":698},"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":1071,"title":1072,"description":1073,"published":1068,"category":815,"image":1074,"draft":698},"\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":1076,"title":1077,"description":1078,"published":1079,"category":815,"image":1080,"draft":698},"\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":1082,"title":1083,"description":1084,"published":1079,"category":694,"image":1085,"draft":698},"\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",1791705962980]