Fundamentos de seguridad
¿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í.
En resumen
- ¿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.
Tu app tiene una pantalla de inicio de sesión. Detrás están tus usuarios, sus mensajes, quizá sus pedidos. Parece privado, y no hay una forma evidente de averiguar si de verdad lo es, porque la consola de Supabase no es un sitio al que hayas tenido que entrar nunca.
Así que fuimos a medirlo en las apps de otras personas. En agosto de 2026 escaneamos 30.998 apps activas publicadas desde Lovable, Base44, Replit, v0 y Bolt, y le hicimos a cada una la misma pregunta: ¿puede cualquiera leer tu base de datos Supabase sin iniciar sesión?
En 2.096 de las 3.680 apps donde obtuvimos una respuesta clara, sí.
Y aquí está lo que fallan tanto la versión alarmante de esta historia como la tranquilizadora. Una tabla abierta no es automáticamente una fuga: muchísimas tablas están hechas para que las lea todo el mundo. Qué tabla es lo decide todo, y esa pregunta solo la puede responder quien construyó la app. Por eso además no se detecta: la app funciona perfectamente en ambos casos.
¿Puede cualquiera leer tu base de datos Supabase?
En más de la mitad de las apps que pudimos comprobar, sí: al menos una tabla devolvió filas a una petición que no llevaba ningún inicio de sesión.
Que esto sea posible no tiene nada que ver con que algo esté roto. Tu app habla con Supabase desde el navegador de tu visitante, así que lleva una clave que cualquier visitante puede leer, y esa clave está pensada para ser pública. Nombra tu proyecto. Por sí sola no concede nada.
Lo que decide si un desconocido se lleva tus datos es Row Level Security: una regla en cada tabla que dice quién puede leer qué filas. Sin regla, la clave es lo único que hay entre internet y esa tabla, y la clave está escrita en tu página.
Eso es lo que medimos. No si una clave era visible (siempre lo es), sino qué hace la base de datos cuando alguien la usa.
De qué es una parte ese 57 %
De una base que estrechamos tres veces, y ese estrechamiento importa más que el titular.
| Lo que contamos | Apps |
|---|---|
| Apps activas escaneadas y clasificadas | 30.998 |
| Nombran un proyecto de Supabase en la página | 8.435 |
| Pudimos confirmar una tabla y obtener respuesta | 3.680 |
| Al menos una tabla legible sin iniciar sesión | 2.096 |
| …y una de ellas tenía nombre de personas | 394 |
Tres cosas que no hicimos. Cada una empuja la cifra real hacia un lado o hacia el otro, y merece decirse en vez de quedar enterrada.
Solo preguntamos por nombres de tabla que pudimos ver o adivinar. Supabase ya no deja que una clave publicable liste las tablas de un proyecto, así que leímos los nombres que cada app menciona en su propio código y añadimos un par de docenas de nombres corrientes, con un tope de treinta por app. Una app cuyas tablas se llamen algo que no se nos ocurrió nos parece limpia y puede no serlo.
Contamos filas, nunca las leímos. Cada sondeo preguntó a la base de datos cuántas filas entregaría y se detuvo ahí. No se descargó el dato de nadie, y no se nombra ninguna app en este artículo ni en nada que publiquemos.
Casi todas las apps que pudimos comprobar eran de Lovable. Son la mayor parte de lo que escaneamos y las más propensas a nombrar su proyecto de Supabase en la página, así que lee esto como una medición de apps de Lovable con Supabase y no de todos los builders. Donde la comprobación no pudo terminar, lo registramos como que no pudo terminar. Una app que no logramos comprobar es desconocida, no limpia.
Una tabla abierta no es automáticamente un agujero
Desde fuera, una tabla que cualquiera puede leer se ve igual tanto si contiene tu catálogo de productos como si contiene a tu clientela. La respuesta es la misma. Lo único que cambia es el nombre.
Por eso partimos el hallazgo en dos. En 394 de esas apps, una de las tablas
legibles llevaba un nombre de una lista corta que para nosotros significa
personas: users, profiles, customers, orders, messages, invoices. Eso
es un desconocido leyendo a tu clientela, y toca arreglarlo hoy.
Las otras 1.702 no las podemos juzgar desde fuera, y ningún otro escáner puede
tampoco. Una tabla posts puede ser un blog público o pueden ser notas
privadas. Tú sabes cuál. Nadie que mire tu app desde internet lo sabe.
Si prefieres no adivinar con la tuya, nuestro escaneo gratuito revisa tu sitio en vivo desde fuera y te dice qué tablas respondieron. Tarda unos 20 segundos y no necesita cuenta: escanea tu app.
Por qué le pasa a apps que nadie abrió a propósito
Porque el arreglo que hace funcionar de nuevo una app rota suele ser el que abre la tabla.
La secuencia es esta. Se activa Row Level Security, por ti o por el builder. Tu app deja de mostrar datos al instante, porque activado sin reglas significa que la base de datos rechaza a todo el mundo, tú incluido. Le pegas el error a tu asistente, este escribe una política que permite cualquier petición, y la app vuelve a funcionar. Después nada parece estar mal.
Esa política es la que encontramos. El panel informa de la tabla como protegida, porque el interruptor está activado y existe una política. El artículo sobre por qué tener Row Level Security activado no es lo mismo que estar protegido recorre los cuatro estados posibles de una tabla y cómo distinguir el tuyo.
La fuga de la que te han avisado era la rara
En las 30.998 apps, una clave secreta de Supabase en el navegador (la clave que ignora todas las reglas que hayas escrito) apareció 3 veces.
Es la fuga de la que quien tiene una app oye hablar constantemente y la que menos encontramos. Es grave cuando ocurre, y conviene saber detectarla, pero la preocupación gastada ahí vigila una puerta que casi siempre está cerrada. La apertura corriente en estas apps es una tabla normal sin ninguna regla.
Cómo comprobar tu propia app
Dos sitios donde mirar dentro de tu base de datos Supabase, y una forma de verla desde donde está un desconocido.
Abre el Security Advisor en tu panel de Supabase. Enumera cada tabla con Row Level Security desactivado, que es la versión más clara de este problema. Supabase avisa bien de ello, y si tu proyecto sale en esa lista ya tienes la respuesta sin leer una línea de SQL.
Después lee las políticas de cualquier tabla con personas dentro. El Advisor no puede decidir si una política permisiva es intencionada, porque en un catálogo de productos sería lo correcto. Abre la tabla, mira la política y comprueba si nombra una condición o si permite a todo el mundo.
O compruébalo desde fuera, que es donde vive el riesgo. Un desconocido no abre tu panel. Nuestro escaneo gratuito hace la misma petición anónima que haría alguien de fuera e informa de qué tablas respondieron: escanea tu app, sin cuenta y sin instalar nada.
Qué hacer con una tabla que no debería ser legible
Qué hacer
- Empieza por las tablas con personas. En
users,profiles,customers,ordersymessagesestán los datos de otra gente, y son las que merecen una tarde. - 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.
- 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.
- 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.
- 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.
Comprobar esto una vez es una tarde. Mantener la respuesta cierta el mes que viene es la parte que no cabe en una tarde, y es para lo que construimos Reeve Care. Repite esta misma comprobación en tu app de forma programada y te escribe un correo cuando la respuesta empeora, porque una tabla que estaba cerrada en marzo y abierta en junio no es algo que nadie note desde dentro de su propia app.
También guarda sus propias copias de seguridad de tu base de datos Supabase, hechas de forma programada, almacenadas fuera de tu cuenta de Supabase y releídas para verificarlas antes de contarlas, con una restauración que guarda el estado actual antes de reproducir nada. Esa segunda mitad importa aquí porque nosotros solo comprobamos la lectura. La misma política permisiva puede permitir la escritura, y un desconocido escribiendo en tu tabla es la versión que la vacía: llegado ese punto, una copia anterior es lo único que devuelve las filas. Care cubre tu base de datos, y los archivos subidos a Storage en cuanto los conectas, en Supabase y no en cualquier tipo de base de datos: qué vigila y cuánto cuesta.
Si prefieres recorrerlo como una lista, la checklist de seguridad de 10 minutos cubre esto junto con las demás cosas que conviene cerrar en una app recién lanzada. Y si una tabla estuvo abierta un tiempo, lo que puedas deshacer después depende por completo de qué estabas respaldando.
Preguntas frecuentes
¿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.
¿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.
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.
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.
¿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.