Cadenas ouvert devant un écran de code, symbolisant une faille de sécurité

L'erreur de sécurité Supabase que je vois partout en ce moment

Publié le

En auditant un site généré avec Lovable, j'ai eu une surprise. En quelques minutes dans l'inspecteur de navigateur, j'avais récupéré la clé API Supabase du projet. Et en quelques requêtes, je pouvais modifier des données en base. Pas de compte administrateur. Pas de faille exotique. Juste une configuration par défaut qui n'avait jamais été revue. Cette erreur, je la vois sur de nombreux projets lancés rapidement avec des outils no-code ou des générateurs d'applications. Voici de quoi il s'agit, et surtout comment la corriger.

Ce que j'ai trouvé en auditant le site

Le site en question était fonctionnel, bien fait visuellement, généré avec Lovable et connecté à une base de données Supabase. Rien d'anormal en apparence. Puis j'ai ouvert l'onglet Réseau de l'inspecteur de navigateur et regardé les requêtes qui partaient au chargement de la page.

Dans les en-têtes de ces requêtes, deux informations étaient visibles en clair : l'URL du projet Supabase et la clé anon. En envoyant une requête de mise à jour avec ces informations, la réponse était un succès. Les données avaient bien été modifiées, sans authentification, sans compte, sans aucun droit particulier. N'importe qui visitant le site aurait pu faire la même chose.

⚠ Ce n'est pas un bug de Supabase. C'est une erreur de configuration que Supabase documente clairement, mais que les outils de génération automatique n'activent pas toujours par défaut.

Comprendre la clé anon : normale, mais pas anodine

Supabase fournit deux clés principales pour interagir avec votre base de données depuis le front-end. La première est la clé anon (pour "anonymous"), destinée à être utilisée côté client. La seconde est la clé service_role, qui elle ne doit jamais quitter votre serveur.

La clé anon est donc visible dans le code source de votre application. C'est voulu, c'est documenté, et ce n'est pas un problème en soi. Ce qui détermine ce qu'un utilisateur peut faire avec cette clé, c'est le système de permissions que vous avez (ou non) mis en place.

Ce que la clé anon permet par défaut

Par défaut, sans configuration supplémentaire, la clé anon donne accès en lecture et en écriture à toutes les tables de votre base de données. Ce n'est pas un comportement caché : Supabase prévient que sans Row Level Security activé, votre base est ouverte.

// Ce que n'importe qui peut faire avec votre clé anon
// si le RLS n'est pas activé

const { data, error } = await supabase
  .from('articles')
  .update({ title: 'Contenu modifié' })
  .eq('id', '1');

// → 200 OK. La modification est enregistrée en base.

La faille : l'oubli du Row Level Security (RLS)

Le Row Level Security, ou RLS, est le mécanisme de Supabase qui permet de définir des règles précises sur qui peut lire, écrire, modifier ou supprimer chaque ligne d'une table. Sans ces règles activées, la clé anon dispose de tous les droits sur toutes les tables.

Pourquoi cette erreur arrive-t-elle si souvent ?

Les outils de génération d'applications comme Lovable, Bolt ou d'autres créent une connexion Supabase fonctionnelle très rapidement. L'application lit et écrit des données, tout fonctionne en développement, et le site est mis en ligne. Ce que ces outils ne font pas systématiquement, c'est activer le RLS et configurer les politiques de sécurité. C'est une étape manuelle, dans le tableau de bord Supabase, que beaucoup de développeurs débutants ne connaissent pas ou oublient sous la pression du lancement.

Sans RLS activé Avec RLS activé
La clé anon peut tout lire et tout écrire La clé anon ne peut rien faire sans politique explicite
N'importe quel client HTTP peut modifier vos données Seules les opérations explicitement autorisées sont possibles
Aucune distinction entre un visiteur anonyme et un utilisateur authentifié Les règles peuvent dépendre de l'identité, du rôle ou d'une condition métier
Vos données sont exposées dès la mise en ligne Vos données sont protégées par défaut, vous ouvrez ce qui doit l'être

L'impact concret : ce qu'un visiteur peut faire

Pour être précis sur ce que cela signifie en pratique : un visiteur de votre site, sans aucun compte ni aucune connaissance de votre code, peut ouvrir l'inspecteur de son navigateur, récupérer votre URL Supabase et votre clé anon, puis depuis n'importe quel client HTTP :

Un visiteur pourrait ainsi lire, créer, modifier ou supprimer des données — sans aucune authentification. Selon la nature de votre application, cela peut signifier la modification de prix sur un site e-commerce, l'altération de contenus publiés, la suppression de comptes utilisateurs ou l'accès à des informations personnelles.

⚠ RGPD et responsabilité. Si votre base contient des données personnelles (emails, noms, adresses…) et qu'elles sont accessibles sans authentification, vous êtes potentiellement en infraction avec le RGPD. Ce n'est pas uniquement un problème technique.

Comment corriger ça : activer le RLS

La correction est simple et rapide. Elle se fait directement dans le tableau de bord Supabase, sans toucher à votre code applicatif.

Étape 1 : activer le RLS sur chaque table

Dans votre projet Supabase, rendez-vous dans Table Editor, sélectionnez une table, puis cliquez sur l'icône de bouclier ou accédez à Authentication → Policies. Activez le Row Level Security pour chaque table concernée. À partir de ce moment, sans politique définie, personne ne peut accéder à cette table via la clé anon.

Étape 2 : définir des politiques adaptées à votre usage

Une fois le RLS activé, vous devez créer explicitement les règles qui correspondent à votre logique métier. Voici quelques exemples typiques.

-- Autoriser la lecture publique d'une table "articles"
CREATE POLICY "Lecture publique"
ON articles
FOR SELECT
TO anon
USING (true);

-- Autoriser un utilisateur connecté à modifier uniquement ses propres données
CREATE POLICY "Modification proprietaire"
ON articles
FOR UPDATE
TO authenticated
USING (auth.uid() = user_id);

-- Bloquer toute écriture pour les utilisateurs non connectés
-- (comportement par défaut si aucune politique INSERT n'est définie)

Étape 3 : vérifier vos paramètres de stockage et d'authentification

Le RLS s'applique aux tables de votre base de données, mais pensez aussi à vérifier les politiques sur vos buckets de stockage Supabase si vous hébergez des fichiers. Le même mécanisme existe pour contrôler qui peut lire ou écrire dans un bucket.

✓ Bonne pratique. Considérez que par défaut tout est fermé et que vous ouvrez uniquement ce qui doit l'être. C'est l'inverse de la configuration initiale sans RLS, où tout est ouvert et vous espérez que personne ne s'en aperçoit.

Comment vérifier si votre projet est concerné

Étape Ce que vous vérifiez
Connectez-vous à votre tableau de bord Supabase Rendez-vous dans Authentication → Policies
Listez toutes vos tables Vérifiez que le RLS affiche Enabled sur chacune
Pour chaque table avec RLS activé Confirmez qu'au moins une politique est définie, sinon personne ne peut y accéder
Tables sans RLS activé Elles sont ouvertes en lecture et en écriture : à corriger en priorité

Si vous utilisez Lovable, Bolt, ou tout autre outil de génération qui s'appuie sur Supabase, ce test vaut vraiment la peine d'être fait avant de partager votre lien à des utilisateurs réels.

Un mot sur les outils no-code et la responsabilité de la sécurité

Ces outils ont démocratisé la création d'applications, et c'est une très bonne chose. Mais ils créent aussi une illusion : parce que l'application fonctionne, on suppose qu'elle est correctement configurée. La sécurité ne fait pas partie des fonctionnalités visibles. Elle ne s'affiche pas dans l'aperçu, elle ne génère pas de message d'erreur tant que personne ne l'exploite.

La responsabilité de la configuration de sécurité reste celle du créateur du projet, qu'il soit développeur expérimenté ou non-développeur qui a utilisé un outil de génération. Supabase fournit les outils pour sécuriser correctement une application. Ce n'est pas parce qu'une IA a généré le code que la base de données est protégée.

Si vous avez un projet en ligne connecté à Supabase, prenez dix minutes aujourd'hui pour vérifier que le RLS est activé sur chaque table. Ce n'est pas une opération complexe. C'est juste une étape qu'on oublie facilement, et dont les conséquences peuvent être sérieuses.

Vous avez lancé un site avec Lovable ou un autre outil no-code ?

Un audit rapide permet de vérifier en quelques minutes si votre base Supabase est correctement sécurisée : RLS activé, politiques adaptées à votre usage, clés exposées sans nécessité. Mieux vaut le savoir avant vos utilisateurs.

Demander un audit de sécurité
Représentation abstraite d'un cerveau. C'est quoi un LLM ? Comprendre le moteur de l'IA générative

Découvrez ce qui se cache réellement derrière ChatGPT et Gemini. Fonctionnement statistique, différence entre modèle et application, hallucinations et limites.

Un développeur seul devant ses écrans de code. Votre code est biaisé : pourquoi on ne peut pas être à la fois le client et l'architecte

Coder pour soi-même, c'est séduisant. Mais en étant votre propre client, vous éliminez la friction qui forge la qualité. Ce que l'IA change à l'équation, et pourquoi il faut quand même y aller.

Graphiques SEO Arrêtez de courir après le volume : ciblez juste pour convertir mieux

Le volume attire, l'intention convertit. Pourquoi cibler les bons mots-clés est plus rentable que viser les gros volumes.