Aller au contenu

Votre base de données Supabase peut être lue par n’importe qui

Critique Tout le domaine Sécurité

Instructions générales. Ouvrez cet article depuis votre rapport PageCheck pour le voir complété avec les enregistrements de votre domaine et les étapes exactes de votre hébergeur DNS.

De quoi s’agit-il

Votre site conserve son contenu dans une base de données Supabase. La page accède à cette base avec une clé publique qui fait partie du code de la page, si bien que le navigateur de chaque visiteur la possède. Cette clé est faite pour être publique — ce qui protège les données, ce sont des règles d’accès sur chaque table (Supabase appelle cela Row Level Security).

Ce qui ne va pas

Votre base de données Supabase répond à la clé publique et liste ses tables : Row Level Security est donc désactivé ou incomplet. Toute personne qui ouvre votre site peut lire, et souvent modifier ou supprimer, les données qui se trouvent derrière.

Comment corriger

1. Activez les règles d’accès pour chaque table. Dans le tableau de bord Supabase, ouvrez Authentication → Policies (ou Table editor → chaque table → Row Level Security) et activez Row Level Security pour chaque table du schéma public. Une fois activée, sans aucune policy, la clé publique ne peut rien lire.

2. Ajoutez une policy uniquement pour ce dont le public a besoin. Si une partie d’une table doit vraiment être publique (par exemple une liste de produits), ajoutez une policy qui autorise la lecture de ces seules lignes et colonnes. Tout le reste reste privé et n’est accessible que par votre propre code côté serveur, qui utilise une clé secrète, jamais la clé présente dans la page.

3. Vérifiez depuis l’extérieur. Ouvrez votre site dans une fenêtre de navigation privée et vérifiez qu’il fonctionne toujours, puis relancez cette vérification. Vous n’avez pas besoin de changer la clé publique — elle est faite pour être publique ; ce sont les règles d’accès qui protègent les données.

Lock down my Supabase database: it is readable with the public anon key because Row Level Security is off.
Project: <my .supabase.co project>.

Steps:
1. List every table in the public schema and tell me which, if any, genuinely need to be readable by anonymous visitors.
2. Enable Row Level Security on every table in the public schema.
3. For the tables that must be public, add the narrowest SELECT policy that serves the site (only the needed rows and columns); leave the rest with no anon policy.
4. Make sure the app reads private data only through server-side code using the service_role key, never the anon key in the browser.
5. Give me the SQL for the policies and the exact dashboard steps, and tell me how to verify from an anonymous client that the private tables return nothing.
Do not rotate the anon key — it is public by design; the fix is the access rules.

Analysez votre site pour savoir s’il a ce problème. Analyser un site