[{"data":1,"prerenderedAt":1007},["ShallowReactive",2],{"blog-es-is-lovable-safe":3,"blog-index-es":773},{"id":4,"title":5,"body":6,"category":725,"cover":726,"coverAlt":727,"description":728,"draft":729,"extension":730,"faq":731,"image":750,"keywords":751,"meta":761,"navigation":762,"ogTitle":763,"path":764,"published":765,"seo":766,"stem":767,"tldr":768,"updated":765,"__hash__":772},"blog_es\u002Fblog\u002Fis-lovable-safe.md","¿Es seguro Lovable? Lo que vimos en 18.554 aplicaciones Lovable",{"type":7,"value":8,"toc":708},"minimark",[9,13,21,24,29,32,35,57,60,66,70,83,220,223,228,240,247,251,254,264,275,287,290,301,305,308,314,319,340,347,351,354,361,367,374,386,390,393,400,407,410,414,417,420,426,429,433,436,439,534,542,555,562,566,569,577,581,584,619,632,636,639,642,653,664,672,676,700],[10,11,12],"p",{},"Construiste algo en Lovable, funciona, y estás a punto de poner gente real\nencima. En algún momento de esa semana escribiste \"es seguro lovable\" en un\nbuscador, y lo que volvió fue o bien una página sobre una divulgación de\nseguridad de 2025 o bien un proveedor vendiéndote un escaneo. Ninguna de las dos\ndecía nada sobre la aplicación que estás a punto de publicar.",[10,14,15,16,20],{},"Esto es lo que la mayoría de esas respuestas se pierde: ",[17,18,19],"strong",{},"\"es seguro Lovable\"\nson tres preguntas vestidas de una sola frase",", y la que decide si un\ndesconocido puede leer los datos de tus usuarios es la que casi nadie mide.",[10,22,23],{},"Nosotros podemos medirla. Entre el 12 y el 14 de agosto de 2026 pasamos 30.998\naplicaciones en vivo por las mismas nueve comprobaciones externas que cualquiera\npuede lanzar gratis en nuestra página de inicio, y 18.554 de ellas estaban\npublicadas en Lovable. Es la cohorte más grande que tenemos, tres de cada cinco\naplicaciones que hemos escaneado nunca. Esto es lo que volvió para ellas, y\nhasta dónde llega nuestra vista.",[25,26,28],"h2",{"id":27},"es-seguro-lovable","¿Es seguro Lovable?",[10,30,31],{},"Como plataforma, sí, y por un margen más amplio del que esperábamos. Lo que\nproduce Lovable fue lo más limpio de los cinco constructores que medimos. Todo\nlo que decidió una nota estaba dentro de la aplicación que había construido su\ndueño.",[10,33,34],{},"Piensa en una tienda con el almacén al otro lado de la calle. Lovable construye\nla tienda: los escaparates, el mostrador, el cartel. El almacén es de Supabase,\ny tiene su propia cerradura en su propia puerta. Lo que la tienda le da a un\ntranseúnte es una pregunta. Lo que el almacén le da a cualquiera que se acerque\ny pregunte es otra completamente distinta, y por mucho que ordenes la tienda eso\nno cambia.",[36,37,38,45,51],"ol",{},[39,40,41,44],"li",{},[17,42,43],{},"La plataforma."," ¿Publica Lovable tu aplicación como es debido: un\ncertificado válido, un dominio que no caduca, nada que se escape del build?\nEsta es la tienda.",[39,46,47,50],{},[17,48,49],{},"El agente."," ¿Es sólido el código que escribe la IA de Lovable? Ningún\nescaneo externo ve el cableado, y este artículo lo dice en vez de adivinarlo.",[39,52,53,56],{},[17,54,55],{},"La aplicación que publicaste."," Lo que un desconocido alcanza desde la\nacera: una clave en el código que descarga un navegador, un bucket de\nalmacenamiento que lista sus archivos, una tabla de base de datos que\nresponde a cualquiera que pregunte.",[10,58,59],{},"Nuestras comprobaciones leen la tercera y dos partes de la primera. En la\nplataforma, el certificado era válido en las 18.486 aplicaciones donde pudimos\nleer uno, y ni un solo dominio de 18.554 estaba cerca de caducar. Del agente no\ntenemos nada que medir. De la aplicación tenemos 18.554 respuestas.",[61,62],"diagram",{"alt":63,"caption":64,"src":65},"Tres paneles uno junto a otro. El primero lleva el logo de Lovable con un candado y un certificado. El segundo lleva un signo de código con un destello encima. El tercero lleva una página de navegador con una base de datos separada fuera, tres visitantes acercándose a ambas, y una lupa solo sobre ese panel, con el número 18.554 debajo.","Tres preguntas dentro de una búsqueda. Un escaneo externo lee el tercer panel y parte del primero, y nada en absoluto del de en medio.","\u002Fblog\u002Fis-lovable-safe\u002Fthree-questions-1600x700.png",[25,67,69],{"id":68},"lo-que-encontramos-en-18554-aplicaciones-lovable","Lo que encontramos en 18.554 aplicaciones Lovable",[10,71,72,73,76,77,82],{},"Nueve comprobaciones, desde fuera, sin inicio de sesión y sin acceso a la cuenta\nde nadie. Nunca leímos una fila: donde una base de datos respondía, preguntamos\ncuántas filas entregaría y ahí nos paramos. Ninguna aplicación se nombra aquí ni\nen nada que publiquemos. Cada proporción de abajo es sobre las aplicaciones\ndonde la comprobación ",[17,74,75],{},"respondió",", porque una comprobación que no pudo\nterminar es desconocida y no aprobada, y esa regla es por la que se mueven los\ndenominadores. El método y los datos están\n",[78,79,81],"a",{"href":80},"\u002Fresearch\u002Fvibe-coded-app-security-2026","en el informe",".",[84,85,86,103],"table",{},[87,88,89],"thead",{},[90,91,92,96,100],"tr",{},[93,94,95],"th",{},"Qué comprobamos",[93,97,99],{"align":98},"right","Aplicaciones Lovable",[93,101,102],{},"Quién lo decide",[104,105,106,118,129,139,149,160,170,180,199,210],"tbody",{},[90,107,108,112,115],{},[109,110,111],"td",{},"Faltan cabeceras de seguridad del navegador",[109,113,114],{"align":98},"18.539 de 18.554 (99 %)",[109,116,117],{},"El alojamiento de Lovable",[90,119,120,123,126],{},[109,121,122],{},"Una tabla de base de datos legible sin inicio de sesión",[109,124,125],{"align":98},"2.017 de 3.553 (57 %)",[109,127,128],{},"Tu aplicación",[90,130,131,134,137],{},[109,132,133],{},"Algo con forma de clave en el código que descarga un visitante",[109,135,136],{"align":98},"822 de 18.554 (4 %)",[109,138,128],{},[90,140,141,144,147],{},[109,142,143],{},"Un bucket de almacenamiento que lista sus archivos",[109,145,146],{"align":98},"768 de 16.565 (5 %)",[109,148,128],{},[90,150,151,154,157],{},[109,152,153],{},"Código fuente original publicado (source maps)",[109,155,156],{"align":98},"225 de 18.553 (1 %)",[109,158,159],{},"Un ajuste del build",[90,161,162,165,168],{},[109,163,164],{},"Una ruta de API que le dio datos a un desconocido",[109,166,167],{"align":98},"8 de 18.518",[109,169,128],{},[90,171,172,175,178],{},[109,173,174],{},"Cualquier sitio web autorizado a llamar a tu API",[109,176,177],{"align":98},"0 de 18.518",[109,179,128],{},[90,181,182,194,197],{},[109,183,184,185,189,190,193],{},"Un archivo privado como ",[186,187,188],"code",{},".env"," o ",[186,191,192],{},".git\u002Fconfig"," en una URL abierta",[109,195,196],{"align":98},"0 de 18.442",[109,198,128],{},[90,200,201,204,207],{},[109,202,203],{},"Certificado caducado o no fiable",[109,205,206],{"align":98},"0 de 18.486",[109,208,209],{},"Lovable",[90,211,212,215,218],{},[109,213,214],{},"Dominio a punto de caducar",[109,216,217],{"align":98},"0 de 18.554",[109,219,209],{},[10,221,222],{},"Las notas: 15.963 A, 370 B, 1.814 C, 402 D y 5 F. Nueve aplicaciones no tuvieron\nningún hallazgo.",[61,224],{"alt":225,"caption":226,"src":227},"Seis barras horizontales en una misma escala, cada una precedida de un signo pequeño y seguida de un número: 18.539 para cabeceras, 2.017 para tablas expuestas, 822 para claves, 768 para buckets de almacenamiento, 225 para source maps y 8 para rutas abiertas. La barra de arriba es gris pálido y el resto turquesa, y el 8 es una línea fina con un anillo alrededor.","Número de aplicaciones, no tasas: una escala, seis hallazgos. La barra gris la decide el alojamiento. Cada barra turquesa vino de algo dentro de la aplicación. La fila de tablas expuestas se mide contra un denominador más pequeño, que la siguiente imagen desmonta.","\u002Fblog\u002Fis-lovable-safe\u002Fwhat-we-found-1600x680.png",[10,229,230,231,234,235,239],{},"Esa primera fila es la razón por la que \"el 99 % de las aplicaciones Lovable\ntiene un problema de seguridad\" es una frase que leerás en algún sitio y\ndeberías ignorar. Las cabeceras de seguridad del navegador las manda lo que sirve\ntu página, y en ",[186,232,233],{},"tuapp.lovable.app"," eso es Lovable, por lo que todas las\naplicaciones de ese host reciben la misma respuesta.\n",[78,236,238],{"href":237},"\u002Fblog\u002Fmissing-security-headers","Merece la pena tenerlas"," y no son de lo que está\nhecha una D.",[10,241,242,243,246],{},"Quita esa fila y ",[17,244,245],{},"15.453 de las 18.554 aplicaciones no tenían nada más",". Las\n3.092 restantes son el resto de este artículo.",[25,248,250],{"id":249},"lo-que-lovable-hace-bien-y-es-casi-toda-la-lista","Lo que Lovable hace bien, y es casi toda la lista",[10,252,253],{},"Tres de las cifras de arriba son las mejores que hemos anotado en ningún\nconstructor, y las tres las decide la plataforma y no tú.",[10,255,256,259,260,82],{},[17,257,258],{},"Los source maps."," 225 de 18.553 aplicaciones Lovable publican los archivos\noriginales de detrás, comentarios incluidos. Eso es alrededor de 1 de cada 80.\nEn Base44 la misma comprobación salta en el 59 % de las aplicaciones, y en\nReplit en el 6 %. El build de producción de Lovable hace lo correcto por\ndefecto, así que\n",[78,261,263],{"href":262},"\u002Fblog\u002Fsource-maps-exposed-in-production","esto casi nunca es problema tuyo",[10,265,266,269,270,274],{},[17,267,268],{},"Las cabeceras cross-origin."," Cero aplicaciones de 18.518 le dijeron a un\nsitio cualquiera del mundo que podía llamar a su API, y cero lo permitieron con\nlas cookies de sesión del visitante. Ese es el hallazgo que\n",[78,271,273],{"href":272},"\u002Fblog\u002Fcors-wildcard-security-risk","con más facilidad deja a otro sitio actuar como tu usuario",",\ny en Lovable no apareció ni una vez.",[10,276,277,280,281,283,284,286],{},[17,278,279],{},"Archivos privados sueltos."," Cero aplicaciones de 18.442 servían un ",[186,282,188],{}," o\nun ",[186,285,192],{}," desde una URL normal. Una aplicación Lovable no tiene servidor\npropio que configurar mal, así que no hay ningún archivo olvidado detrás.",[10,288,289],{},"Nada de esto es un premio de consolación. Es la parte del trabajo en la que no\ntuviste que pensar y en la que, en la mayoría de los otros constructores,\nalguien piensa.",[291,292,294],"callout",{"type":293},"note",[10,295,296,297,82],{},"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",[78,298,300],{"href":299},"\u002Fsecurity-scanner","Escanea tu aplicación",[25,302,304],{"id":303},"la-única-cifra-que-importa-2017-de-3553","La única cifra que importa: 2.017 de 3.553",[10,306,307],{},"De las aplicaciones Lovable cuya base de datos Supabase pudimos preguntar de\nverdad, el 57 % entregó filas a una petición que no llevaba ningún inicio de\nsesión.",[10,309,310,311,82],{},"Los denominadores merecen recorrerse, porque esta es la cifra que todo el mundo\ncita y casi nadie encuadra. De 18.554 aplicaciones Lovable, 6.532 nombraban un\nproyecto de Supabase en el código que entregan. De esas, 3.553 respondieron lo\nbastante bien como para poder juzgarlas, y las otras 2.979 no, así que son\ndesconocidas y no limpias. De las 3.553, ",[17,312,313],{},"2.017 devolvieron filas a un\ndesconocido",[61,315],{"alt":316,"caption":317,"src":318},"Un embudo dibujado como cuatro barras apiladas que se estrechan: 18.554 aplicaciones Lovable, 6.532 que nombraban un proyecto de Supabase, 3.553 cuya base dio una respuesta utilizable, y 2.017 que devolvieron filas sin inicio de sesión. La última barra es roja y la tercera lleva un signo de interrogación para las 2.979 que no se pudieron juzgar.","Cuatro denominadores, no uno. La barra que se cita como titular es la última, y se mide contra la tercera.","\u002Fblog\u002Fis-lovable-safe\u002Fwhere-it-lands-1600x620.png",[10,320,321,322,325,326,329,330,329,333,329,336,339],{},"En ",[17,323,324],{},"373"," de esas aplicaciones la tabla que respondió llevaba nombre de\npersonas: ",[186,327,328],{},"users",", ",[186,331,332],{},"profiles",[186,334,335],{},"orders",[186,337,338],{},"messages",". Son 373 aplicaciones, no\n373 tablas. En las otras 1.644 era algo que no pudimos nombrar desde fuera:\nquizá un catálogo de productos que siempre debió ser público, quizá cualquier\notra cosa.",[10,341,342,343,346],{},"Medido contra todas las aplicaciones Lovable escaneadas en vez de contra el\nsubconjunto que pudimos juzgar, 2.017 de 18.554 es alrededor de ",[17,344,345],{},"11 de cada\n100",". Quédate con esa cifra dos secciones.",[25,348,350],{"id":349},"por-qué-cae-en-la-base-de-datos-y-no-en-lovable","Por qué cae en la base de datos y no en Lovable",[10,352,353],{},"Por una decisión de diseño que es correcta, deliberada, y que casi nunca se le\nexplica a la persona a la que afecta.",[10,355,356,357,360],{},"Una aplicación Lovable no tiene servidor propio. La página en el navegador del\nvisitante habla directamente con Supabase, que es por lo que todo esto se puede\nconstruir en una tarde y por lo que tan pocas de estas aplicaciones tienen una\nruta de API abierta: no hay ninguna API tuya que dejar abierta. Para que eso\nfuncione, la dirección de tu base de datos y una clave para ella tienen que\nestar impresas dentro de la aplicación, donde cualquiera puede leerlas. Esa\nclave es la clave ",[17,358,359],{},"publicable",", y que sea pública es correcto. Se supone que\nestá ahí.",[10,362,363,364,366],{},"Lo que significa que lo único que hay entre un desconocido y tu tabla ",[186,365,328],{},"\nes un ajuste de Supabase por tabla llamado Row Level Security. Encendido y con\nuna policy escrita, la clave pública lee solo las filas que esa policy permite.\nApagado, la clave pública lee la tabla.",[10,368,369,370,373],{},"Ahora la parte que decide la mayoría de los proyectos Lovable. Supabase\nenciende Row Level Security por defecto en las tablas que creas haciendo clic\nen el Table Editor. Las tablas creadas ",[17,371,372],{},"ejecutando SQL"," no lo reciben, y\nejecutar SQL es como un constructor crea tablas para ti. La forma habitual de un\nproyecto Lovable es por tanto: unas pocas tablas hechas a mano, que están\nprotegidas, al lado de las que se generaron, que puede que no. Las dos se ven\nidénticas. Ninguna protesta. La aplicación funciona perfectamente en ambos\ncasos, que es todo el problema: nada que veas desde delante te dice cuál de las\ndos tienes.",[10,375,376,377,381,382,82],{},"La versión larga de esto, con el SQL,\n",[78,378,380],{"href":379},"\u002Fblog\u002Fenable-rls-on-every-supabase-table","está aquí",", y la guía en lenguaje\nllano para esta plataforma es\n",[78,383,385],{"href":384},"\u002Fis-your-lovable-app-safe","es segura tu aplicación Lovable",[25,387,389],{"id":388},"la-policy-que-quita-el-error-y-deja-la-tabla-abierta","La policy que quita el error y deja la tabla abierta",[10,391,392],{},"Encender Row Level Security es el paso uno de dos, y en el paso dos un asistente\nde IA hace de muy buena gana lo incorrecto.",[10,394,395,396,399],{},"Con el ajuste encendido y sin policy escrita, tu propia aplicación deja de\nfuncionar. Te sale un error, lo pegas en el chat, y llega algo que hace que el\nerror desaparezca. Muy a menudo lo que llega es una policy que permite a todo el\nmundo, escrita como ",[186,397,398],{},"using (true)",". Es una policy válida. Cumple el requisito de\nque exista una policy. Permite cada fila a cada petición.",[10,401,402,403,82],{},"El panel ahora informa la tabla como protegida, el error se fue, tu aplicación\nfunciona, y la tabla es exactamente igual de legible que antes. Tenemos un\nartículo entero sobre esto porque es el fallo más convincente de toda la pila:\n",[78,404,406],{"href":405},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","RLS está encendido y tu tabla sigue siendo pública",[10,408,409],{},"Si alguna vez has pegado un error de Row Level Security en una ventana de chat y\naceptado el primer arreglo que hizo que compilara, ve a leer esa policy hoy.",[25,411,413],{"id":412},"cve-2025-48757-y-por-qué-ya-no-es-tu-pregunta","CVE-2025-48757, y por qué ya no es tu pregunta",[10,415,416],{},"Es real, fue seria, y por el lado de Lovable lleva más de un año cerrada.\nTampoco es lo que deberías estar comprobando.",[10,418,419],{},"En mayo de 2025 el investigador de seguridad Matt Palmer publicó\nCVE-2025-48757, sobre aplicaciones Lovable cuyas tablas de Supabase tenían Row\nLevel Security ausente o escrito con demasiada permisividad. Escaneó 1.645\naplicaciones Lovable y encontró 170 con bases expuestas. La respuesta de Lovable\nfue añadir una comprobación de seguridad que corre antes de publicar y avisa de\nlas tablas desprotegidas.",[10,421,422,423],{},"Y aquí la lectura honesta, que es por lo que la CVE es el marco equivocado.\nAquella divulgación encontró alrededor de 10 aplicaciones expuestas de cada 100.\nDieciséis meses después, en una cohorte once veces mayor, encontramos alrededor\nde 11 de cada 100. Los denominadores no son idénticos y ninguna de las dos\nmuestras es internet entero, así que toma las dos como el mismo orden de\nmagnitud y no como una comparación precisa. La dirección está bastante clara:\n",[17,424,425],{},"la tasa no ha bajado.",[10,427,428],{},"Eso no es un arreglo que falló. Es una señal de que nunca fue realmente una\nvulnerabilidad de un producto. Es un ajuste en tus propias tablas, en tu propio\nproyecto de Supabase, que nadie más puede encender por ti. Un parche no llega\nahí, que es exactamente por lo que sí llega una comprobación que lanzas tú.",[25,430,432],{"id":431},"de-qué-estaban-hechas-de-verdad-las-822-claves","De qué estaban hechas de verdad las 822 claves",[10,434,435],{},"Casi todas estaban bien, y un escáner que te dijera lo contrario te estaría\nenseñando a ignorarlo.",[10,437,438],{},"822 de las 18.554 aplicaciones Lovable tenían algo con forma de clave en el\ncódigo que descarga un visitante. Leído como una lista de formas, eso es el 4 %\nde las aplicaciones \"filtrando secretos\". Leído como lo que cada clave puede\nhacer de verdad, se ve así:",[84,440,441,454],{},[87,442,443],{},[90,444,445,448,451],{},[93,446,447],{},"Lo que encontramos en el bundle",[93,449,450],{"align":98},"Apps",[93,452,453],{},"Qué significa",[104,455,456,467,478,489,499,509,523],{},[90,457,458,461,464],{},[109,459,460],{},"Una clave de API de Google",[109,462,463],{"align":98},"727",[109,465,466],{},"Normalmente correcta, una vez restringida a tu dominio",[90,468,469,472,475],{},[109,470,471],{},"Un secreto no atribuible",[109,473,474],{"align":98},"82",[109,476,477],{},"No pudimos decir a qué proveedor pertenece",[90,479,480,483,486],{},[109,481,482],{},"Una clave de OpenAI",[109,484,485],{"align":98},"18",[109,487,488],{},"Cobra a tu cuenta, directamente",[90,490,491,494,497],{},[109,492,493],{},"Una clave de acceso de AWS",[109,495,496],{"align":98},"7",[109,498,488],{},[90,500,501,504,507],{},[109,502,503],{},"Una clave de Anthropic",[109,505,506],{"align":98},"3",[109,508,488],{},[90,510,511,518,520],{},[109,512,513,514,517],{},"Un ",[186,515,516],{},"service_role"," de Supabase",[109,519,506],{"align":98},[109,521,522],{},"Lee y escribe cada fila de cada tabla, ignora cada regla",[90,524,525,528,531],{},[109,526,527],{},"Un secreto de Stripe en vivo",[109,529,530],{"align":98},"2",[109,532,533],{},"Tu cuenta de pagos",[10,535,536,537,541],{},"Las 727 claves de Google son la razón por la que clasificamos en vez de solo\nreconocer formas. Una clave de Google Maps en un navegador está donde debe\nestar, y el arreglo es\n",[78,538,540],{"href":539},"\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend","restringirla a tu propio dominio"," en\nlugar de entrar en pánico.",[10,543,544,545,547,548,550,551,82],{},"Las cuatro últimas filas son las que importan, y son raras: 30 aplicaciones de\n18.554. También son los hallazgos que cuestan dinero por sí solos, y suelen\nsalir a la superficie como una factura que llega antes de que nadie se haya dado\ncuenta. Dos detalles para el acta. Las tres claves ",[186,546,516],{}," de todo el\nescaneo de 30.998 aplicaciones estaban en aplicaciones Lovable, y dos de los\ntres secretos de Stripe en vivo también. Una clave ",[186,549,516],{}," en el\nnavegador deja sin efecto cada policy de Row Level Security de tu proyecto en\nuna sola línea, por lo que es el único hallazgo que calificamos de crítico a\nsimple vista y el que\n",[78,552,554],{"href":553},"\u002Fblog\u002Frotate-supabase-service-role-key","merece rotarse el mismo día",[10,556,557,558,82],{},"Distinguir las dos clases lleva alrededor de un minuto, y\n",[78,559,561],{"href":560},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","escribimos la guía",[25,563,565],{"id":564},"los-768-buckets-de-almacenamiento-que-nadie-quiso-abrir","Los 768 buckets de almacenamiento que nadie quiso abrir",[10,567,568],{},"Un bucket de Supabase marcado como público no sirve solo los archivos que tu\naplicación enlaza. También le lista cada archivo que contiene a cualquiera que\npregunte.",[10,570,571,572,576],{},"768 de las 16.565 aplicaciones Lovable comprobables tenían al menos un bucket\nque listaba su contenido. La razón es la misma que la de las tablas legibles:\nhacer público un bucket es como consigues que se vea una imagen, funciona al\ninstante, y después nada te dice que el listado venía incluido. Facturas\nsubidas, fotos de documentos de identidad y avatares de usuarios acaban todos en\nel mismo sitio.\n",[78,573,575],{"href":574},"\u002Fblog\u002Fsupabase-storage-bucket-public","Lo que expone de verdad un bucket público","\ncubre el arreglo, que son URL firmadas y no un bucket privado del que luego no\npuedas leer.",[25,578,580],{"id":579},"la-comprobación-de-cinco-minutos-sobre-tu-aplicación-lovable","La comprobación de cinco minutos sobre tu aplicación Lovable",[10,582,583],{},"Cada punto es una página que abres. Usa una ventana privada para que tu propia\nsesión no responda por un desconocido.",[36,585,586,592,598,604,610],{},[39,587,588,591],{},[17,589,590],{},"Supabase → Authentication → Policies."," Recorre la lista. Cualquier tabla\nque muestre Row Level Security desactivado es legible por quien tenga la\ndirección de tu proyecto, que está impresa en tu aplicación.",[39,593,594,597],{},[17,595,596],{},"Lee las policies de las tablas que sí lo tienen encendido."," Si una permite\na todo el mundo, la tabla está abierta y el panel la sigue llamando\nprotegida.",[39,599,600,603],{},[17,601,602],{},"Supabase → Storage."," Cualquier bucket marcado como público lista sus\narchivos a cualquiera. Mira qué hay dentro antes de decidir que está bien.",[39,605,606,609],{},[17,607,608],{},"Supabase → Settings → API."," Confirma que la clave que entrega tu\naplicación es la publicable. Si alguna vez se pegó una clave secreta en el\nproyecto, rótala ahí antes de borrarla del código, porque el valor antiguo\nsigue funcionando hasta que lo hagas.",[39,611,612,615,616,82],{},[17,613,614],{},"O deja que lo haga el escaneo."," Lanza esos cuatro desde fuera y cinco más,\ntarda unos 20 segundos, no pide cuenta, y te enseña una nota y qué la\nprodujo: ",[78,617,618],{"href":299},"escanea tu aplicación",[10,620,621,622,626,627,631],{},"Si prefieres recorrer toda la superficie como una lista, la\n",[78,623,625],{"href":624},"\u002Fchecklist","lista de seguridad de 10 minutos"," cubre lo que merece confirmarse\nen cualquier aplicación recién lanzada, y\n",[78,628,630],{"href":629},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","puede cualquiera leer tu base de datos Supabase","\nes la prueba que hay que hacer si solo haces una cosa.",[25,633,635],{"id":634},"tu-aplicación-cambia-cada-vez-que-publicas","Tu aplicación cambia cada vez que publicas",[10,637,638],{},"Un escaneo que lanzaste el mes pasado describe la aplicación del mes pasado, y\nen Lovable ese es un mes más corto que en otros sitios.",[10,640,641],{},"Publicar es un clic, así que un cambio está en vivo en cuanto lo aceptas. No hay\nningún paso de despliegue entre tú e internet que atrape una tabla añadida esta\nmañana con Row Level Security apagado, o una clave pegada en el chat a\nmedianoche para pasar un build que fallaba. Cada una de las 2.017 bases\nexpuestas que encontramos era de alguien cuya aplicación funcionaba\nperfectamente.",[10,643,644,648,649,652],{},[78,645,647],{"href":646},"\u002Fpricing","Reeve Monitor"," es la versión de este artículo que se lanza sola.\nRepite las nueve comprobaciones cada hora en hasta tres aplicaciones, mira cada\n60 segundos si la aplicación responde, te avisa cuando un resultado ",[17,650,651],{},"cambia","\nen vez de esperar a que mires, y manda un informe mensual. Cuesta $12 al mes de\ntarifa de lista, con siete días gratis antes de cobrarte; la página de precios a\nveces está por debajo de la cifra de aquí y nunca por encima.",[10,654,655,658,659,663],{},[17,656,657],{},"Si tu aplicación Lovable usa Supabase, y 6.532 de las 18.554 escaneadas lo\nhacen, la otra mitad del problema es la copia."," Una tabla expuesta es algo que\nun desconocido puede leer. Un agente con acceso a la base, o una migración que\ncorrió al revés, es algo que puede borrarla, y la copia de seguridad diaria del\npropio Supabase en el plan gratuito no es algo que puedas restaurar tú.\n",[78,660,662],{"href":661},"\u002Fsupabase-backups","Reeve Care"," toma cada noche una copia cifrada de tu base de\ndatos Supabase, la guarda donde tu proyecto no llega, verifica que cada copia se\nrestaura de verdad, y te da una restauración en un clic cuando la necesitas.\nIncluye todo lo que hace Monitor. Care cuesta $49 al mes de tarifa de lista para\nuna aplicación, con los mismos siete días gratis.",[10,665,666,667,671],{},"La forma de ese segundo fallo, contada por alguien a quien le pasó, está en\n",[78,668,670],{"href":669},"\u002Fblog\u002Fai-agent-deleted-my-database","el día en que un agente de IA borró una base de datos de producción",".\nNinguna de las nueve comprobaciones de este artículo habría ayudado ahí. Una\ncopia sí.",[25,673,675],{"id":674},"qué-hacer-esta-semana","Qué hacer esta semana",[677,678,679],"key-takeaways",{},[680,681,682,685,688,691,697],"ul",{},[39,683,684],{},"Abre Supabase → Authentication → Policies y lee la lista. Cualquier tabla con Row Level Security desactivado es legible por quien tenga la dirección de tu aplicación.",[39,686,687],{},"Lee las policies de las tablas que sí lo tienen encendido. Una que permite a todo el mundo deja la tabla abierta mientras el panel la informa como protegida.",[39,689,690],{},"Revisa Storage en busca de buckets públicos. Un bucket público lista cada archivo que contiene, no solo los que tu aplicación enlaza.",[39,692,693,694,696],{},"Confirma que la clave de tu aplicación es la publicable. Una clave ",[186,695,516],{}," en el navegador deja sin efecto cada policy que hayas escrito, y es tarea del mismo día.",[39,698,699],{},"Guarda una copia de tu base de datos donde tu proyecto y tu agente no lleguen, y comprueba que esa copia se restaura.",[10,701,702,703,707],{},"Lovable hizo bien su mitad. Los 2.017 son la mitad que es tuya, y es un ajuste y\nno una reescritura. Si lo que quieres es la comparación entre constructores,\n",[78,704,706],{"href":705},"\u002Fblog\u002Fsafest-ai-app-builder","qué constructor de aplicaciones con IA es el más seguro","\ntiene la tabla de los cinco.",{"title":709,"searchDepth":710,"depth":710,"links":711},"",3,[712,714,715,716,717,718,719,720,721,722,723,724],{"id":27,"depth":713,"text":28},2,{"id":68,"depth":713,"text":69},{"id":249,"depth":713,"text":250},{"id":303,"depth":713,"text":304},{"id":349,"depth":713,"text":350},{"id":388,"depth":713,"text":389},{"id":412,"depth":713,"text":413},{"id":431,"depth":713,"text":432},{"id":564,"depth":713,"text":565},{"id":579,"depth":713,"text":580},{"id":634,"depth":713,"text":635},{"id":674,"depth":713,"text":675},"Fundamentos de seguridad","\u002Fblog\u002Fis-lovable-safe\u002Fcover-1200x630.png","El logo de Lovable en una loseta blanca, una flecha hacia la aplicación publicada, otra hacia tres visitantes, y una base de datos debajo.","¿Es seguro Lovable? Pasamos 18.554 aplicaciones Lovable por nueve comprobaciones. La plataforma fue la más limpia de cinco. Los hallazgos estaban dentro.",false,"md",[732,735,738,741,744,747],{"q":733,"a":734},"¿Es Lovable lo bastante seguro para un producto real?","Por el lado de la plataforma fue el más limpio de los cinco constructores que escaneamos. Todos los certificados que pudimos leer eran válidos, ningún dominio estaba cerca de caducar, ninguna aplicación permitía que un sitio cualquiera del mundo llamara a su API, y 225 de 18.553 publicaban su código fuente. Lo que decide si tu producto es seguro allí es la base de datos de detrás: 2.017 de las 3.553 aplicaciones Lovable cuyo Supabase pudimos preguntar entregaron filas a una petición sin inicio de sesión. Eso es un ajuste en tus tablas, es tuyo, y lo compruebas en unos cinco minutos.",{"q":736,"a":737},"¿Puede la gente ver el código fuente de mi aplicación Lovable?","La mitad del navegador siempre, porque un navegador no puede dibujar una página que no ha recibido. Lo que normalmente no pueden leer son tus archivos originales con sus comentarios y nombres de variables, y eso es exactamente lo que entrega un source map publicado. 225 de las 18.553 aplicaciones Lovable que comprobamos publicaban uno, alrededor de 1 de cada 80, la tasa más baja de todos los constructores que medimos. Tus consultas a la base son otro asunto: una aplicación Lovable habla con Supabase directamente desde el navegador, así que los nombres de tablas y columnas que lee son visibles para cualquiera que abra la pestaña de red.",{"q":739,"a":740},"¿Están seguros mis datos de Supabase en una aplicación Lovable?","Depende de un único ajuste por tabla y de nada más. Una aplicación Lovable llega a Supabase directamente desde el navegador del visitante con una clave publicable que se supone pública, así que lo único que hay entre un desconocido y una tabla es Row Level Security. Apagado, esa clave pública lee la tabla entera. Lo medimos en 3.553 aplicaciones Lovable y 2.017 respondieron a una petición anónima con filas. En 373 de ellas la tabla expuesta llevaba nombre de personas: users, profiles, orders, messages.",{"q":742,"a":743},"¿Qué fue CVE-2025-48757 y todavía me afecta?","Es la divulgación de 2025 del investigador de seguridad Matt Palmer sobre aplicaciones Lovable cuyas tablas de Supabase tenían Row Level Security ausente o escrito con demasiada permisividad. Escaneó 1.645 aplicaciones Lovable y encontró 170 con bases expuestas. Lovable respondió añadiendo una comprobación de seguridad que corre antes de publicar. No es un parche que estés esperando, y nunca lo fue, porque la exposición es un ajuste en tus propias tablas y no un defecto del código de Lovable, y por eso nuestras cifras de 2026 se parecen tanto a las suyas de 2025. Si te afecta o no se responde hoy abriendo una página en Supabase.",{"q":745,"a":746},"¿La comprobación de seguridad de Lovable detecta una tabla expuesta?","Lovable corre antes de publicar una comprobación que lee tu proyecto por dentro: el esquema, las policies, las dependencias. Eso ve cosas que un escaneo externo no puede ver estructuralmente, como una tabla que tu interfaz nunca nombra. Lo que no puede probar es que una policy aguante de verdad, porque una policy puede existir, parecer válida y aun así devolver cada fila a todo el mundo. Las dos vistas responden preguntas distintas, así que corre la de dentro antes de publicar y una de fuera después, y si se contradicen, gana la respuesta de fuera.",{"q":748,"a":749},"¿Es Lovable más seguro que Bolt o Replit?","En lo que decide la plataforma, Lovable quedó por delante de los otros cuatro que medimos: menos source maps publicados que ninguno, ninguna cabecera cross-origin abierta, y ningún problema de certificado ni de dominio. En lo que decide el dueño se parece a todo lo demás, porque esos hallazgos vienen de cómo se construyó una aplicación y no de dónde. La comparación completa la pusimos en un artículo aparte en vez de repetir la tabla aquí.","\u002Fblog\u002Fis-lovable-safe\u002Fcard-800x500.png",[752,753,754,755,756,757,758,759,760],"es seguro lovable","seguridad lovable","lovable es fiable","son seguras las aplicaciones lovable","seguridad lovable supabase","lovable rls","lovable para producción","problemas de seguridad de lovable","filtración de datos lovable",{},true,"¿Es seguro Lovable? Lo que vimos en 18.554 aplicaciones","\u002Fblog\u002Fis-lovable-safe","2026-09-21",{"title":5,"description":728},"blog\u002Fis-lovable-safe",[769,770,771],"¿Es seguro Lovable? La plataforma fue la más limpia de los cinco constructores que medimos. 225 de 18.553 aplicaciones publicaban su código fuente, ninguna le dijo a un sitio cualquiera que podía llamar a su API, y 15.963 de 18.554 sacaron una A.","Todo lo serio que encontramos estaba dentro de la aplicación que construyó su dueño. De las 3.553 aplicaciones Lovable cuya base de datos Supabase pudimos preguntar, 2.017 entregaron filas a una petición sin ningún inicio de sesión.","Eso es alrededor de 11 de cada 100 aplicaciones Lovable de nuestro escaneo. Un investigador midiendo lo mismo en mayo de 2025 encontró 10 de cada 100, así que dieciséis meses después la tasa no se ha movido.","g21C_hC1j7qYVhbqOm3iAKhPGDJFHuzwmeE_EfnLco8",[774,781,787,788,794,800,806,812,818,824,830,836,842,847,852,858,863,869,875,881,886,892,898,904,910,916,922,928,934,939,945,951,956,961,966,971,975,981,987,992,997,1003],{"path":775,"title":776,"description":777,"published":778,"category":779,"image":780,"draft":729},"\u002Fblog\u002Fsupabase-backup-auth-users","Por qué tu dump de Supabase no tiene usuarios dentro","Ejecuta supabase db dump por sí solo y obtienes la forma de tu base de datos y ninguna de sus filas, sin el esquema auth donde viven tus usuarios.","2026-09-23","Backups","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":782,"title":783,"description":784,"published":785,"category":725,"image":786,"draft":729},"\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":764,"title":5,"description":728,"published":765,"category":725,"image":750,"draft":729},{"path":789,"title":790,"description":791,"published":792,"category":725,"image":793,"draft":729},"\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":795,"title":796,"description":797,"published":798,"category":725,"image":799,"draft":729},"\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":801,"title":802,"description":803,"published":804,"category":725,"image":805,"draft":729},"\u002Fblog\u002Fvite-and-next-public-env-vars","Variables de entorno de Vite expuestas: el prefijo dice publica esto","Variables de entorno de Vite expuestas en tu app: hicieron lo que pedía el prefijo. VITE_ y NEXT_PUBLIC_ significan publica esto, y la IA nunca supo el coste.","2026-09-18","\u002Fblog\u002Fvite-and-next-public-env-vars\u002Fcard-800x500.png",{"path":807,"title":808,"description":809,"published":810,"category":725,"image":811,"draft":729},"\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":813,"title":814,"description":815,"published":816,"category":725,"image":817,"draft":729},"\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":819,"title":820,"description":821,"published":822,"category":725,"image":823,"draft":729},"\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":825,"title":826,"description":827,"published":828,"category":779,"image":829,"draft":729},"\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":831,"title":832,"description":833,"published":834,"category":779,"image":835,"draft":729},"\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":837,"title":838,"description":839,"published":840,"category":779,"image":841,"draft":729},"\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":705,"title":843,"description":844,"published":845,"category":725,"image":846,"draft":729},"¿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":379,"title":848,"description":849,"published":850,"category":725,"image":851,"draft":729},"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":853,"title":854,"description":855,"published":856,"category":725,"image":857,"draft":729},"\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":553,"title":859,"description":860,"published":861,"category":725,"image":862,"draft":729},"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":864,"title":865,"description":866,"published":867,"category":725,"image":868,"draft":729},"\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":870,"title":871,"description":872,"published":873,"category":725,"image":874,"draft":729},"\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":876,"title":877,"description":878,"published":879,"category":725,"image":880,"draft":729},"\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":237,"title":882,"description":883,"published":884,"category":725,"image":885,"draft":729},"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":887,"title":888,"description":889,"published":890,"category":725,"image":891,"draft":729},"\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":893,"title":894,"description":895,"published":896,"category":725,"image":897,"draft":729},"\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":899,"title":900,"description":901,"published":902,"category":779,"image":903,"draft":729},"\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":905,"title":906,"description":907,"published":908,"category":725,"image":909,"draft":729},"\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":911,"title":912,"description":913,"published":914,"category":779,"image":915,"draft":729},"\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":917,"title":918,"description":919,"published":920,"category":725,"image":921,"draft":729},"\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":923,"title":924,"description":925,"published":926,"category":725,"image":927,"draft":729},"\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":929,"title":930,"description":931,"published":932,"category":725,"image":933,"draft":729},"\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":272,"title":935,"description":936,"published":937,"category":725,"image":938,"draft":729},"¿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":940,"title":941,"description":942,"published":943,"category":779,"image":944,"draft":729},"\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":946,"title":947,"description":948,"published":949,"category":779,"image":950,"draft":729},"\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":574,"title":952,"description":953,"published":954,"category":725,"image":955,"draft":729},"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":539,"title":957,"description":958,"published":959,"category":725,"image":960,"draft":729},"¿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":669,"title":962,"description":963,"published":964,"category":779,"image":965,"draft":729},"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":629,"title":967,"description":968,"published":969,"category":725,"image":970,"draft":729},"¿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":262,"title":972,"description":973,"published":969,"category":725,"image":974,"draft":729},"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":976,"title":977,"description":978,"published":979,"category":725,"image":980,"draft":729},"\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":982,"title":983,"description":984,"published":985,"category":779,"image":986,"draft":729},"\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":405,"title":988,"description":989,"published":990,"category":725,"image":991,"draft":729},"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":993,"title":994,"description":995,"published":990,"category":779,"image":996,"draft":729},"\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":998,"title":999,"description":1000,"published":1001,"category":779,"image":1002,"draft":729},"\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":560,"title":1004,"description":1005,"published":1001,"category":725,"image":1006,"draft":729},"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",1790150954050]