Supabase renvoie un tableau vide : la RLS fonctionne-t-elle ?

Un résultat vide ne prouve pas que la RLS est correctement configurée. Une table contenant des lignes filtrées et une table vide sans protection peuvent produire la même observation. Il faut des données de test connues et le bon rôle utilisateur pour les distinguer.

Webba Creative Technologies · Révisé le 2026-09-11

Tester mon application

Des permissions différentes, une même observation

Une requête peut réussir sans renvoyer de ligne. La table est peut-être vide, le filtre ne correspond à rien, ou la RLS masque toutes les lignes correspondantes. Les implications de sécurité diffèrent alors que le client ne reçoit aucune donnée.

Une requête refusée constitue encore un autre cas : des droits manquants peuvent provoquer une erreur de permission. Conserve la preuve observée : lignes reçues, lecture vide, refus ou échec réseau. Un statut HTTP seul ne fournit pas un verdict de sécurité complet.

Cinq cas PostgreSQL reproductibles

Télécharge le script ci-dessous et exécute-le en administrateur dans une base locale jetable. Il crée un rôle visiteur et un schéma de démonstration dans une transaction. Aucun vrai compte ni donnée client n’est nécessaire, et ROLLBACK supprime les objets de l’exemple.

Les deux cas vides sont volontairement différents : filtered contient une ligne avec RLS activée, sans policy de lecture ; empty_table ne contient aucune ligne et laisse la RLS désactivée. Les deux accordent SELECT au visiteur. Le script utilise ce rôle dédié pour éviter le contournement RLS du propriétaire de table.

Cas localLignes visiblesCe que cela montre
exposed1SELECT accordé, RLS désactivée : le visiteur lit la ligne.
public_catalog1RLS activée avec une lecture publique volontaire.
filtered0Une ligne existe, mais la RLS la masque au visiteur.
empty_table0Aucune ligne n’existe, même avec la RLS désactivée.
deniedErreur 42501Le visiteur ne dispose pas du droit SELECT.
sql
SET LOCAL ROLE rls_demo_visitor;
SELECT id FROM rls_checker_example.filtered;
-- 0 ligne : la RLS masque une ligne existante.
SELECT id FROM rls_checker_example.empty_table;
-- 0 ligne : table vide, sans RLS.

Diagnostiquer avec une donnée et une identité connues

Sur un projet local ou de staging, crée une ligne fictive dont tu connais le propriétaire. Vérifie son existence avec ton accès administrateur, puis demande-la avec le compte prévu et un autre compte. Utilise le même projet, schéma, table et filtre à chaque étape.

Vérifie la session : une requête envoyée avant la connexion ne représente pas une requête avec un jeton utilisateur valide. Examine les droits et policies du projet. Garde les jetons et le contenu des lignes hors des captures, analytics et rapports publics.

Un bon test comprend un témoin positif : le propriétaire peut lire sa ligne. Il comprend aussi un témoin négatif : l’autre compte ne le peut pas. Si personne ne reçoit de donnée, l’application est peut-être simplement cassée.

Comment RLS Checker présente une réponse vide

Le rapport public classe une lecture anonyme vide comme indéterminée. Il ne la transforme pas en validation de policy. Le checker externe ne dispose ni d’un inventaire privilégié des lignes stockées, ni de la définition de tes policies.

L’exemple local vérifie le comportement des rôles et de la RLS PostgreSQL. Il ne reproduit pas tous les statuts PostgREST, filtres clients ou réglages Supabase. Combine l’observation externe avec les tests de la base et de l’application avant de conclure à la protection des données privées.

Reproduire les cinq cas locaux

À exécuter uniquement dans une base PostgreSQL locale jetable. Le script crée ses données fictives dans une transaction, vérifie les permissions puis annule ses modifications. Il ne se connecte à aucun projet Supabase.

Télécharger le script SQL

Poursuivre les vérifications

Comment tester la RLS Supabase depuis l’application et la base

Teste les accès anonymes Supabase, puis l’isolation des comptes et les écritures. Une méthode pratique avec un exemple SQL local reproductible.

Lire le guide

Une clé anon Supabase exposée est-elle un problème de sécurité ?

Distingue les clés publiques Supabase des secrets, puis vérifie les accès aux données réellement accordés aux visiteurs de ton application.

Lire le guide

Comment RLS Checker teste les accès anonymes Supabase

Méthodologie RLS Checker : découverte, lectures anonymes bornées, preuves, limites du rapport et exemple PostgreSQL reproductible.

Lire le guide