[{"data":1,"prerenderedAt":375},["ShallowReactive",2],{"blog-es-can-anyone-read-your-supabase-database":3},{"id":4,"title":5,"body":6,"category":336,"cover":337,"coverAlt":337,"description":338,"draft":339,"extension":340,"faq":341,"image":357,"keywords":358,"meta":364,"navigation":365,"ogTitle":30,"path":366,"published":367,"seo":368,"stem":369,"tldr":370,"updated":367,"__hash__":374},"blog_es\u002Fblog\u002Fcan-anyone-read-your-supabase-database.md","¿Puede cualquiera leer tu base de datos Supabase? 3.680 apps",{"type":7,"value":8,"toc":324},"minimark",[9,13,20,23,26,31,34,43,46,49,53,56,116,122,125,131,137,148,152,155,160,184,191,199,203,206,209,217,221,224,231,235,238,244,250,259,263,297,300,305,312],[10,11,12],"p",{},"Tu app tiene una pantalla de inicio de sesión. Detrás están tus usuarios, sus\nmensajes, quizá sus pedidos. Parece privado, y no hay una forma evidente de\naveriguar si de verdad lo es, porque la consola de Supabase no es un sitio al\nque hayas tenido que entrar nunca.",[10,14,15,16],{},"Así que fuimos a medirlo en las apps de otras personas. En agosto de 2026\nescaneamos 30.998 apps activas publicadas desde Lovable, Base44, Replit, v0 y\nBolt, y le hicimos a cada una la misma pregunta: ",[17,18,19],"strong",{},"¿puede cualquiera leer tu\nbase de datos Supabase sin iniciar sesión?",[10,21,22],{},"En 2.096 de las 3.680 apps donde obtuvimos una respuesta clara, sí.",[10,24,25],{},"Y aquí está lo que fallan tanto la versión alarmante de esta historia como la\ntranquilizadora. Una tabla abierta no es automáticamente una fuga: muchísimas\ntablas están hechas para que las lea todo el mundo. Qué tabla es lo decide todo,\ny esa pregunta solo la puede responder quien construyó la app. Por eso además no\nse detecta: la app funciona perfectamente en ambos casos.",[27,28,30],"h2",{"id":29},"puede-cualquiera-leer-tu-base-de-datos-supabase","¿Puede cualquiera leer tu base de datos Supabase?",[10,32,33],{},"En más de la mitad de las apps que pudimos comprobar, sí: al menos una tabla\ndevolvió filas a una petición que no llevaba ningún inicio de sesión.",[10,35,36,37,42],{},"Que esto sea posible no tiene nada que ver con que algo esté roto. Tu app habla\ncon Supabase desde el navegador de tu visitante, así que lleva una clave que\ncualquier visitante puede leer, y esa clave\n",[38,39,41],"a",{"href":40},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","está pensada para ser pública",".\nNombra tu proyecto. Por sí sola no concede nada.",[10,44,45],{},"Lo que decide si un desconocido se lleva tus datos es Row Level Security: una\nregla en cada tabla que dice quién puede leer qué filas. Sin regla, la clave es\nlo único que hay entre internet y esa tabla, y la clave está escrita en tu\npágina.",[10,47,48],{},"Eso es lo que medimos. No si una clave era visible (siempre lo es), sino qué\nhace la base de datos cuando alguien la usa.",[27,50,52],{"id":51},"de-qué-es-una-parte-ese-57","De qué es una parte ese 57 %",[10,54,55],{},"De una base que estrechamos tres veces, y ese estrechamiento importa más que el\ntitular.",[57,58,59,72],"table",{},[60,61,62],"thead",{},[63,64,65,69],"tr",{},[66,67,68],"th",{},"Lo que contamos",[66,70,71],{},"Apps",[73,74,75,84,92,100,108],"tbody",{},[63,76,77,81],{},[78,79,80],"td",{},"Apps activas escaneadas y clasificadas",[78,82,83],{},"30.998",[63,85,86,89],{},[78,87,88],{},"Nombran un proyecto de Supabase en la página",[78,90,91],{},"8.435",[63,93,94,97],{},[78,95,96],{},"Pudimos confirmar una tabla y obtener respuesta",[78,98,99],{},"3.680",[63,101,102,105],{},[78,103,104],{},"Al menos una tabla legible sin iniciar sesión",[78,106,107],{},"2.096",[63,109,110,113],{},[78,111,112],{},"…y una de ellas tenía nombre de personas",[78,114,115],{},"394",[117,118],"diagram",{"alt":119,"caption":120,"src":121},"Cuatro barras medidas contra el mismo total, cada una más estrecha que la anterior: 30.998 apps escaneadas, 8.435 con Supabase, 3.680 donde la comprobación pudo completarse, 2.096 con una tabla legible por cualquiera. La columna derecha marca 27 %, 44 % y 57 %, la parte que cada paso conserva del paso anterior.","Todas las barras están medidas contra el mismo total. El 57 % es una parte de las 3.680 apps que realmente pudimos comprobar, no de todas las que escaneamos.","\u002Fblog\u002Fcan-anyone-read-your-supabase-database\u002Fwhat-we-measured-1600x700.png",[10,123,124],{},"Tres cosas que no hicimos. Cada una empuja la cifra real hacia un lado o hacia\nel otro, y merece decirse en vez de quedar enterrada.",[10,126,127,130],{},[17,128,129],{},"Solo preguntamos por nombres de tabla que pudimos ver o adivinar."," Supabase ya\nno deja que una clave publicable liste las tablas de un proyecto, así que leímos\nlos nombres que cada app menciona en su propio código y añadimos un par de\ndocenas de nombres corrientes, con un tope de treinta por app. Una app cuyas\ntablas se llamen algo que no se nos ocurrió nos parece limpia y puede no serlo.",[10,132,133,136],{},[17,134,135],{},"Contamos filas, nunca las leímos."," Cada sondeo preguntó a la base de datos\ncuántas filas entregaría y se detuvo ahí. No se descargó el dato de nadie, y no\nse nombra ninguna app en este artículo ni en nada que publiquemos.",[10,138,139,142,143,147],{},[17,140,141],{},"Casi todas las apps que pudimos comprobar eran de Lovable."," Son la mayor\nparte de lo que escaneamos y las más propensas a nombrar su proyecto de Supabase\nen la página, así que lee esto como una medición de\n",[38,144,146],{"href":145},"\u002Fis-your-lovable-app-safe","apps de Lovable con Supabase"," y no de todos los\nbuilders. Donde la comprobación no pudo terminar, lo registramos como que no\npudo terminar. Una app que no logramos comprobar es desconocida, no limpia.",[27,149,151],{"id":150},"una-tabla-abierta-no-es-automáticamente-un-agujero","Una tabla abierta no es automáticamente un agujero",[10,153,154],{},"Desde fuera, una tabla que cualquiera puede leer se ve igual tanto si contiene\ntu catálogo de productos como si contiene a tu clientela. La respuesta es la\nmisma. Lo único que cambia es el nombre.",[117,156],{"alt":157,"caption":158,"src":159},"Dos rutas de petición idénticas dibujadas una sobre otra. Ambas envían un nombre de tabla, ambas reciben una respuesta 200 y ambas obtienen cinco filas. La ruta superior está etiquetada products y termina en una marca verde; la inferior está etiquetada profiles y termina en una cruz roja.","Misma petición, misma respuesta, veredictos opuestos. Solo quien construyó la app sabe cuál de los dos casos es su tabla abierta.","\u002Fblog\u002Fcan-anyone-read-your-supabase-database\u002Fsame-answer-different-table-1600x600.png",[10,161,162,163,167,168,167,171,167,174,167,177,167,180,183],{},"Por eso partimos el hallazgo en dos. En 394 de esas apps, una de las tablas\nlegibles llevaba un nombre de una lista corta que para nosotros significa\npersonas: ",[164,165,166],"code",{},"users",", ",[164,169,170],{},"profiles",[164,172,173],{},"customers",[164,175,176],{},"orders",[164,178,179],{},"messages",[164,181,182],{},"invoices",". Eso\nes un desconocido leyendo a tu clientela, y toca arreglarlo hoy.",[10,185,186,187,190],{},"Las otras 1.702 no las podemos juzgar desde fuera, y ningún otro escáner puede\ntampoco. Una tabla ",[164,188,189],{},"posts"," puede ser un blog público o pueden ser notas\nprivadas. Tú sabes cuál. Nadie que mire tu app desde internet lo sabe.",[10,192,193,194,198],{},"Si prefieres no adivinar con la tuya, nuestro escaneo gratuito revisa tu sitio\nen vivo desde fuera y te dice qué tablas respondieron. Tarda unos 20 segundos y\nno necesita cuenta: ",[38,195,197],{"href":196},"\u002F#scan","escanea tu app",".",[27,200,202],{"id":201},"por-qué-le-pasa-a-apps-que-nadie-abrió-a-propósito","Por qué le pasa a apps que nadie abrió a propósito",[10,204,205],{},"Porque el arreglo que hace funcionar de nuevo una app rota suele ser el que abre\nla tabla.",[10,207,208],{},"La secuencia es esta. Se activa Row Level Security, por ti o por el builder. Tu\napp deja de mostrar datos al instante, porque activado sin reglas significa que\nla base de datos rechaza a todo el mundo, tú incluido. Le pegas el error a tu\nasistente, este escribe una política que permite cualquier petición, y la app\nvuelve a funcionar. Después nada parece estar mal.",[10,210,211,212,216],{},"Esa política es la que encontramos. El panel informa de la tabla como protegida,\nporque el interruptor está activado y existe una política. El artículo sobre\n",[38,213,215],{"href":214},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","por qué tener Row Level Security activado no es lo mismo que estar protegido","\nrecorre los cuatro estados posibles de una tabla y cómo distinguir el tuyo.",[27,218,220],{"id":219},"la-fuga-de-la-que-te-han-avisado-era-la-rara","La fuga de la que te han avisado era la rara",[10,222,223],{},"En las 30.998 apps, una clave secreta de Supabase en el navegador (la clave que\nignora todas las reglas que hayas escrito) apareció 3 veces.",[10,225,226,227,230],{},"Es la fuga de la que quien tiene una app oye hablar constantemente y la que\nmenos encontramos. Es grave cuando ocurre, y\n",[38,228,229],{"href":40},"conviene saber detectarla",", pero\nla preocupación gastada ahí vigila una puerta que casi siempre está cerrada. La\napertura corriente en estas apps es una tabla normal sin ninguna regla.",[27,232,234],{"id":233},"cómo-comprobar-tu-propia-app","Cómo comprobar tu propia app",[10,236,237],{},"Dos sitios donde mirar dentro de tu base de datos Supabase, y una forma de verla\ndesde donde está un desconocido.",[10,239,240,243],{},[17,241,242],{},"Abre el Security Advisor en tu panel de Supabase."," Enumera cada tabla con Row\nLevel Security desactivado, que es la versión más clara de este problema.\nSupabase avisa bien de ello, y si tu proyecto sale en esa lista ya tienes la\nrespuesta sin leer una línea de SQL.",[10,245,246,249],{},[17,247,248],{},"Después lee las políticas de cualquier tabla con personas dentro."," El Advisor\nno puede decidir si una política permisiva es intencionada, porque en un\ncatálogo de productos sería lo correcto. Abre la tabla, mira la política y\ncomprueba si nombra una condición o si permite a todo el mundo.",[10,251,252,255,256,258],{},[17,253,254],{},"O compruébalo desde fuera, que es donde vive el riesgo."," Un desconocido no\nabre tu panel. Nuestro escaneo gratuito hace la misma petición anónima que haría\nalguien de fuera e informa de qué tablas respondieron:\n",[38,257,197],{"href":196},", sin cuenta y sin instalar nada.",[27,260,262],{"id":261},"qué-hacer-con-una-tabla-que-no-debería-ser-legible","Qué hacer con una tabla que no debería ser legible",[264,265,266],"key-takeaways",{},[267,268,269,285,288,291,294],"ul",{},[270,271,272,273,167,275,167,277,167,279,281,282,284],"li",{},"Empieza por las tablas con personas. En ",[164,274,166],{},[164,276,170],{},[164,278,173],{},[164,280,176],{}," y ",[164,283,179],{}," están los datos de otra gente, y son las que merecen una tarde.",[270,286,287],{},"Escribe la regla antes de ampliar ninguna otra cosa. Una política que nombra una condición (esta fila pertenece a este usuario identificado) es lo que hace que la clave publicable de tu app pueda estar ahí sin problema.",[270,289,290],{},"Comprueba la política, no el interruptor. Activado con una regla que permite a todo el mundo se ve igual desde fuera que desactivado, y tu panel muestra el primer caso como protegido.",[270,292,293],{},"Deja en paz las tablas realmente públicas. Que una lista de productos o un artículo publicado se puedan leer es correcto, y quitarlo rompe tu app sin ganar nada.",[270,295,296],{},"Después del cambio, pruébalo como lo haría un desconocido. Que tu app muestre lo correcto demuestra lo que pide tu app, no lo que entregaría tu base de datos.",[10,298,299],{},"Comprobar esto una vez es una tarde. Mantener la respuesta cierta el mes que\nviene es la parte que no cabe en una tarde, y es para lo que construimos Reeve\nCare. Repite esta misma comprobación en tu app de forma programada y te escribe\nun correo cuando la respuesta empeora, porque una tabla que estaba cerrada en\nmarzo y abierta en junio no es algo que nadie note desde dentro de su propia\napp.",[117,301],{"alt":302,"caption":303,"src":304},"El logotipo de Reeve Care junto a dos filas. En la fila superior, una lupa lee una tira de filas de una tabla marcada con una flecha de repetición. En la inferior, una base de datos dentro de un recuadro discontinuo se copia a un archivo fuera de él, con una lupa junto a la copia.","Las dos tareas: la comprobación se repite de forma programada, y una copia de tu base de datos sale de tu cuenta de Supabase y se vuelve a leer antes de darla por buena.","\u002Fblog\u002Fcan-anyone-read-your-supabase-database\u002Fcare-watch-and-backup-1600x520.png",[10,306,307,308,198],{},"También guarda sus propias copias de seguridad de tu base de datos Supabase,\nhechas de forma programada, almacenadas fuera de tu cuenta de Supabase y\nreleídas para verificarlas antes de contarlas, con una restauración que guarda\nel estado actual antes de reproducir nada. Esa segunda mitad importa aquí porque\nnosotros solo comprobamos la lectura. La misma política permisiva puede permitir\nla escritura, y un desconocido escribiendo en tu tabla es la versión que la\nvacía: llegado ese punto, una copia anterior es lo único que devuelve las filas.\nCare cubre tu base de datos, y los archivos subidos a Storage en cuanto los\nconectas, en Supabase y no en cualquier tipo de base de datos: ",[38,309,311],{"href":310},"\u002F#pricing","qué vigila y cuánto cuesta",[10,313,314,315,319,320,198],{},"Si prefieres recorrerlo como una lista, la\n",[38,316,318],{"href":317},"\u002Fchecklist","checklist de seguridad de 10 minutos"," cubre esto junto con las\ndemás cosas que conviene cerrar en una app recién lanzada. Y si una tabla estuvo\nabierta un tiempo, lo que puedas deshacer después depende por completo de\n",[38,321,323],{"href":322},"\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database","qué estabas respaldando",{"title":325,"searchDepth":326,"depth":326,"links":327},"",3,[328,330,331,332,333,334,335],{"id":29,"depth":329,"text":30},2,{"id":51,"depth":329,"text":52},{"id":150,"depth":329,"text":151},{"id":201,"depth":329,"text":202},{"id":219,"depth":329,"text":220},{"id":233,"depth":329,"text":234},{"id":261,"depth":329,"text":262},"Fundamentos de seguridad",null,"¿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í.",false,"md",[342,345,348,351,354],{"q":343,"a":344},"¿Cómo averiguo si cualquiera puede leer mi base de datos Supabase?","Dos comprobaciones resuelven casi todo. En tu panel de Supabase, abre el Security Advisor: enumera cada tabla con Row Level Security desactivado, y esas las puede leer cualquiera que tenga la clave que viaja en tu app. Después abre las políticas de cualquier tabla con personas dentro, porque una tabla puede pasar la primera comprobación y seguir abierta: una política que permite a todo el mundo está activada, es válida y en el panel se ve como protegida. Si prefieres verlo desde fuera, nuestro escaneo gratuito lee tu sitio en vivo como lo haría un desconocido.",{"q":346,"a":347},"¿Es malo que una de mis tablas sea legible por cualquiera?","Depende de la tabla, y tú eres la única persona que puede decidirlo. Una lista de productos, de artículos publicados o de locales en un mapa está pensada para que la lea todo el mundo, y una política que lo permite es correcta. Ese mismo ajuste en una tabla de usuarios, pedidos o mensajes significa que desconocidos leen a tu clientela. Pregúntate si publicarías el contenido de esa tabla en una página abierta, y deja que la respuesta decida.",{"q":349,"a":350},"Tengo Row Level Security activado. ¿Significa eso que mis tablas están protegidas?","No por sí solo. El interruptor y las reglas son dos cosas distintas: activado sin ninguna regla bloquea a todo el mundo, incluida tu propia app, y activado con una regla permisiva no bloquea a nadie. La regla que se escribe cuando una app se rompe al activar Row Level Security suele ser la que permite cualquier petición venga de quien venga, lo que hace funcionar la app y deja la tabla abierta. Lee la política de la tabla, no el interruptor.",{"q":352,"a":353},"Mi app tiene pantalla de inicio de sesión. ¿No mantiene eso a la gente fuera de la base de datos?","No. Tu pantalla de inicio de sesión decide lo que muestra tu app. No decide lo que entrega tu base de datos, porque una petición no tiene por qué venir de tu app: la clave que lleva tu app la puede leer cualquier visitante y se puede usar directamente contra tu base de datos. Lo que decide la respuesta es Row Level Security en cada tabla.",{"q":355,"a":356},"¿Qué hago primero si encuentro una tabla que pueden leer desconocidos?","Arregla la política de esa tabla antes que nada y luego mira qué estuvo al alcance mientras estaba abierta. Empieza por las tablas con personas, porque ahí están los datos de otra gente. Si la tabla estaba abierta y contiene datos personales, comprueba si tu normativa local te obliga a avisar a alguien; esa es una pregunta para un abogado, no para un escáner.","\u002Fblog\u002Fcan-anyone-read-your-supabase-database\u002Fcard-800x500.png",[359,360,361,362,363],"puede cualquiera leer mi base de datos supabase","base de datos supabase pública","tabla supabase legible por cualquiera","lovable supabase seguridad","supabase rls tabla expuesta",{},true,"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","2026-08-18",{"title":5,"description":338},"blog\u002Fcan-anyone-read-your-supabase-database",[371,372,373],"¿Puede cualquiera leer tu base de datos Supabase sin iniciar sesión? En 2.096 de las 3.680 apps donde pudimos completar la comprobación (el 57 %), al menos una tabla dijo que sí.","Eso no es automáticamente una fuga. Algunas tablas están hechas para ser públicas. Pero 394 de esas apps tenían abierta una tabla con nombre de personas: users, profiles, customers, orders.","Aquello de lo que más se avisa, una clave secreta dentro de la app, apareció 3 veces en 30.998 apps. La tabla abierta es lo habitual.","T1NSKnFl-xV9sw57cJDoQIIBDUXc79undWsA8w8ztDk",1787826048206]