Cómo funciona esta comprobación
Las apps hechas con Lovable, Bolt o v0 suelen hablar con Supabase directamente desde el navegador, así que la URL de tu proyecto y su clave pública (anon o sb_publishable_…) están dentro de tu JavaScript. Es normal: esa clave está pensada para ser pública. Scanaris las encuentra, pregunta a la API de Supabase qué tablas expone y, por cada una, hace una petición HEAD con Prefer: count=exact. La respuesta trae el número de filas que ve un visitante sin sesión, y ningún dato. Si la API no publica la lista de tablas, prueba los nombres que más usan las herramientas de IA (profiles, users, orders, messages…). En Firebase, comprueba si la raíz de la Realtime Database responde a una lectura sin sesión.
Qué significa un hallazgo
Una tabla con más de cero filas visibles de forma anónima la puede leer cualquiera que abra tu web: una petición con la clave pública y se lleva la tabla entera. Es exactamente el patrón de la vulnerabilidad de Lovable (CVE-2025-48757). Con Row Level Security activado y políticas razonables, un visitante anónimo ve cero filas, por eso un "0" nunca da hallazgo.
Cómo arreglarlo en Supabase
Lista las tablas sin RLS, actívalo y escribe una política por operación. Deja lectura pública solo donde los datos sean públicos de verdad (un blog, un catálogo de productos).
-- Tables in the public schema without RLS
select c.relname
from pg_class c
join pg_namespace n on n.oid = c.relnamespace
where n.nspname = 'public' and c.relkind = 'r' and not c.relrowsecurity;
alter table public.profiles enable row level security;
create policy "profiles: own rows" on public.profiles
for select to authenticated
using ((select auth.uid()) = id);
Cómo arreglarlo en Firebase
Cambia las reglas del modo de prueba por reglas que lo nieguen todo por defecto y solo abran lo que es de cada usuario:
{
"rules": {
".read": false,
".write": false,
"users": {
"$uid": {
".read": "auth != null && auth.uid === $uid",
".write": "auth != null && auth.uid === $uid"
}
}
}
}
El paso a paso de cada caso está en la guía de Supabase y la guía de Firebase.
Preguntas frecuentes
¿Scanaris lee mis datos?
No. Solo lee el recuento de filas que la API devuelve en una cabecera; las peticiones no traen el contenido de las tablas y no se guarda nada.
¿Puedo esconder la clave pública en vez de esto?
No, y no hace falta: el navegador la necesita para hablar con Supabase. Lo que protege tus datos es RLS, no esconder la clave.