Comment fonctionne cette vérification
Les applis créées avec Lovable, Bolt ou v0 parlent souvent à Supabase directement depuis le navigateur : l'URL de ton projet et sa clé publique (anon ou sb_publishable_…) sont donc dans ton JavaScript. C'est normal : cette clé est faite pour être publique. Scanaris les trouve, demande à l'API Supabase quelles tables elle expose et, pour chacune, envoie une requête HEAD avec Prefer: count=exact. La réponse contient le nombre de lignes visibles par un visiteur sans session, et aucune donnée. Si l'API ne publie pas la liste des tables, il teste les noms les plus utilisés par les outils d'IA (profiles, users, orders, messages…). Pour Firebase, il vérifie si la racine de la Realtime Database répond à une lecture sans session.
Ce que signifie un résultat
Une table avec plus de zéro ligne visible anonymement peut être lue par quiconque ouvre ton site : une requête avec la clé publique et il récupère toute la table. C'est exactement le schéma de la vulnérabilité de Lovable (CVE-2025-48757). Avec la Row Level Security activée et des politiques raisonnables, un visiteur anonyme voit zéro ligne : un « 0 » ne donne donc jamais de résultat.
Corriger dans Supabase
Liste les tables sans RLS, active-la et écris une politique par opération. Ne laisse la lecture publique que là où les données sont vraiment publiques (un blog, un catalogue produit).
-- 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);
Corriger dans Firebase
Remplace les règles du mode test par des règles qui refusent tout par défaut et n'ouvrent que ce qui appartient à chaque utilisateur :
{
"rules": {
".read": false,
".write": false,
"users": {
"$uid": {
".read": "auth != null && auth.uid === $uid",
".write": "auth != null && auth.uid === $uid"
}
}
}
}
La marche à suivre détaillée est dans le guide Supabase et le guide Firebase.
Questions fréquentes
Scanaris lit-il mes données ?
Non. Il ne lit que le nombre de lignes que l'API renvoie dans un en-tête ; les requêtes ne ramènent aucun contenu et rien n'est conservé.
Puis-je plutôt cacher la clé publique ?
Non, et ce n'est pas nécessaire : le navigateur en a besoin pour parler à Supabase. Ce qui protège tes données, c'est la RLS, pas le fait de cacher la clé.