Saltar al contenido

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í.

Vlad Tkachenko8 min de lectura

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 contamosApps
Apps activas escaneadas y clasificadas30.998
Nombran un proyecto de Supabase en la página8.435
Pudimos confirmar una tabla y obtener respuesta3.680
Al menos una tabla legible sin iniciar sesión2.096
…y una de ellas tenía nombre de personas394
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.

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.

Misma petición, misma respuesta, veredictos opuestos. Solo quien construyó la app sabe cuál de los dos casos es su tabla abierta.

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, orders y messages está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.

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.

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.

Escrito por

Vlad Tkachenko

Fundador de Reeve

Me paso el día mirando apps creadas con Lovable, Bolt, v0, Cursor y Replit, y la corta lista de errores que aparecen en ellas una y otra vez.

Más sobre el autor

Sigue leyendo

¿No sabes cómo está tu propia app?

Haz un escaneo gratuito y obtén una nota clara de la A a la F en unos 20 segundos. Sin cuenta y sin tarjeta.

Analizar mi app gratis

Comprobación externa automatizada, no una auditoría completa. La ausencia de hallazgos no es garantía de seguridad.