[{"data":1,"prerenderedAt":732},["ShallowReactive",2],{"blog-fr-supabase-rls-disabled-in-public":3,"blog-index-fr":491},{"id":4,"title":5,"body":6,"category":447,"cover":448,"coverAlt":449,"description":450,"draft":451,"extension":452,"faq":453,"image":469,"keywords":470,"meta":479,"navigation":480,"ogTitle":481,"path":482,"published":483,"seo":484,"stem":485,"tldr":486,"updated":483,"__hash__":490},"blog_fr\u002Fblog\u002Fsupabase-rls-disabled-in-public.md","Supabase \"RLS disabled in public\" : ce que l'alerte rate",{"type":7,"value":8,"toc":435},"minimark",[9,18,29,36,41,44,55,58,61,65,68,71,77,80,83,87,98,101,107,110,117,212,215,221,235,239,242,249,252,255,261,271,275,278,281,286,299,306,310,313,316,329,335,348,352,355,362,365,370,373,385,389,422],[10,11,12,13,17],"p",{},"Vous avez ouvert le Security Advisor dans votre tableau de bord Supabase, ou\nquelqu'un vous a collé sa sortie sous les yeux, et c'est là, en rouge :\n",[14,15,16],"strong",{},"RLS disabled in public",". En dessous, une ligne par table, dans les mots de\nSupabase :",[19,20,25],"pre",{"className":21,"code":23,"language":24},[22],"language-text","Table public.profiles is public, but RLS has not been enabled.\n","text",[26,27,23],"code",{"__ignoreMap":28},"",[10,30,31,32,35],{},"Voici la partie que guide après guide raconte de travers : ",[14,33,34],{},"vider cette liste\nne veut pas dire que personne ne peut lire vos données."," L'advisor a une règle\ndistincte pour une politique qui laisse entrer tout le monde, et cette règle\nsaute exactement la forme qu'écrit un constructeur d'IA quand il débloque votre\napp. La liste que vous venez de traiter et la liste des tables qu'un inconnu\npeut lire sont donc deux listes différentes, et l'une d'elles n'est imprimée\nnulle part dans votre tableau de bord.",[37,38,40],"h2",{"id":39},"que-veut-dire-rls-disabled-in-public","Que veut dire \"RLS disabled in public\" ?",[10,42,43],{},"Une table de votre schéma public a Row Level Security désactivé, et la\nconséquence est que quiconque dispose de l'adresse de votre projet peut lire\nchacune de ses lignes.",[10,45,46,47,50,51,54],{},"Les deux moitiés de cette phrase méritent d'être dépliées. Le ",[14,48,49],{},"schéma public","\nest l'endroit où va une table quand personne ne dit le contraire, et c'est la\npartie de votre base que Supabase publie sur le web : chaque projet répond aux\nrequêtes à une adresse qui lui est propre, et la clé nécessaire pour lui parler\nse trouve dans le code que votre site envoie à chaque visiteur. ",[14,52,53],{},"Row Level\nSecurity"," est l'interrupteur qui décide si vos règles sont consultées avant que\ndes lignes soient remises. Éteint, il n'y a rien à consulter, donc la réponse\nest toujours oui.",[10,56,57],{},"C'est cette combinaison qui fait que ceci est signalé comme une erreur et non\ncomme un avertissement. L'advisor classe ses trouvailles, et voici le haut de\nl'échelle.",[10,59,60],{},"Voyez l'advisor comme un inspecteur avec une planchette. Il lit vos papiers\nsoigneusement et il le fait bien. Il n'essaie jamais la poignée. Rien dans ce\npanneau ne résulte d'une requête que quelqu'un aurait faite à votre base.",[37,62,64],{"id":63},"activer-rls-va-t-il-casser-mon-app","Activer RLS va-t-il casser mon app ?",[10,66,67],{},"Oui, tout de suite, et c'est le réglage qui fonctionne.",[10,69,70],{},"Le correctif que Supabase vous donne tient en une ligne, et vous l'exécutez dans\nle SQL Editor :",[19,72,75],{"className":73,"code":74,"language":24},[22],"alter table public.profiles enable row level security;\n",[26,76,74],{"__ignoreMap":28},[10,78,79],{},"La documentation de Supabase est directe sur la suite : les données deviennent\ninaccessibles via l'API avec une clé publiable tant qu'aucune politique n'est\ndéfinie. Vos listes reviennent donc vides, vos écrans restent blancs, et\nl'erreur dans l'advisor est remplacée par une entrée plus discrète disant que la\ntable a RLS activé mais aucune politique.",[10,81,82],{},"C'est la porte fermée avec encore personne sur la liste. Ce que font ensuite la\nplupart des gens, c'est ajouter une politique qui laisse tout le monde lire,\nparce que c'est ce qui fait revenir les écrans.",[37,84,86],{"id":85},"la-faille-que-lalerte-ne-cherche-pas","La faille que l'alerte ne cherche pas",[10,88,89,90,93,94,97],{},"Une table avec Row Level Security ",[14,91,92],{},"activé"," et une politique de lecture dont la\ncondition est ",[26,95,96],{},"USING (true)"," remet exactement les mêmes lignes exactement au\nmême inconnu. L'advisor ne la signale pas.",[10,99,100],{},"Ce n'est pas un oubli. Supabase a bien une règle pour les politiques toujours\nvraies, et elle laisse les politiques de lecture de côté volontairement. Sa\npropre description de la règle le dit :",[19,102,105],{"className":103,"code":104,"language":24},[22],"SELECT policies with `USING (true)` are intentionally excluded as this\npattern is often used deliberately for public read access.\n",[26,106,104],{"__ignoreMap":28},[10,108,109],{},"Dans le cas général, la règle a raison. Un catalogue produits, une liste\nd'articles publiés, une carte de lieux : tout cela est fait pour être lu par\nn'importe qui, et le signaler entraînerait chaque développeur de la plateforme à\nignorer le panneau. Ce qu'aucun linter ne peut savoir, c'est si la table qu'il\nregarde contient des lieux ou des clients.",[10,111,112,113,116],{},"Et une politique qui laisse tout le monde lire est le moyen le plus rapide de\nremettre une app cassée en marche, ce qui explique pourquoi un constructeur\nd'IA s'en saisit. Demandez à Cursor ou à Lovable de réparer les écrans vides et\n",[26,114,115],{},"FOR SELECT USING (true)"," est une réponse fréquente. Votre app charge, l'erreur\ndisparaît, le panneau se tait, et la table se lit comme avant.",[118,119,120,136],"table",{},[121,122,123],"thead",{},[124,125,126,130,133],"tr",{},[127,128,129],"th",{},"Ce que l'advisor peut voir",[127,131,132],{},"Comment il le signale",[127,134,135],{},"Ce que reçoit un inconnu avec votre clé publiable",[137,138,139,155,169,183,198],"tbody",{},[124,140,141,145,148],{},[142,143,144],"td",{},"RLS désactivé",[142,146,147],{},"Erreur",[142,149,150],{},[151,152,154],"key-verdict",{"type":153},"danger","Toutes les lignes",[124,156,157,160,163],{},[142,158,159],{},"RLS activé, aucune politique",[142,161,162],{},"Info",[142,164,165],{},[151,166,168],{"type":167},"safe","Rien",[124,170,171,176,179],{},[142,172,173,174],{},"RLS activé, ",[26,175,115],{},[142,177,178],{},"Rien du tout",[142,180,181],{},[151,182,154],{"type":153},[124,184,185,190,193],{},[142,186,173,187],{},[26,188,189],{},"FOR ALL USING (true)",[142,191,192],{},"Avertissement",[142,194,195],{},[151,196,197],{"type":153},"Toutes les lignes, et il peut les changer",[124,199,200,205,207],{},[142,201,173,202],{},[26,203,204],{},"USING (auth.uid() = user_id)",[142,206,178],{},[142,208,209],{},[151,210,211],{"type":167},"Seulement les siennes",[10,213,214],{},"Les deux lignes où rien du tout n'est signalé sont la paire sur laquelle\ns'arrêter. L'une est une table que personne hors de votre app ne peut toucher.\nL'autre est une table que tout le monde peut lire. Votre tableau de bord est\naussi silencieux sur les deux.",[216,217],"diagram",{"alt":218,"caption":219,"src":220},"Deux couloirs se terminant sur les mêmes quatre lignes, toutes allumées. Le couloir du haut a l'interrupteur Row Level Security éteint et porte une marque d'alerte. Celui du bas l'a allumé, avec une politique affichant USING (true), et un cercle pointillé vide là où une marque serait.","Les mêmes quatre lignes remises au même inconnu. La différence entre les couloirs est celui dont votre tableau de bord dit quelque chose.","\u002Fblog\u002Fsupabase-rls-disabled-in-public\u002Ftwo-tables-one-outcome-1600x640.png",[10,222,223,224,229,230,234],{},"Comment cette politique en est arrivée là, et par quoi la remplacer table par\ntable, fait l'objet de\n",[225,226,228],"a",{"href":227},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","Row Level Security est activé et votre table reste publique",".\nSi la même politique doit aussi laisser votre app enregistrer, l'erreur que vous\ncroisez ensuite est\n",[225,231,233],{"href":232},"\u002Fblog\u002Fnew-row-violates-row-level-security-policy","new row violates row-level security policy",".",[37,236,238],{"id":237},"pourquoi-la-table-créée-par-une-migration-ne-vous-a-jamais-alerté","Pourquoi la table créée par une migration ne vous a jamais alerté",[10,240,241],{},"Parce que le Table Editor active Row Level Security pour vous et que SQL ne le\nfait pas.",[10,243,244,245,248],{},"Supabase documente la coupure sans détour : les tables créées avec le Table\nEditor du tableau de bord ont RLS activé par défaut, et les tables créées en SQL\nbrut doivent l'avoir activé explicitement. Une table que vous avez fait naître à\nla souris démarre protégée. Une table arrivée par un fichier de migration, un\n",[26,246,247],{},"supabase db push",", un extrait dans le SQL Editor ou une instruction que votre\nconstructeur d'IA a exécutée pour vous démarre ouverte.",[10,250,251],{},"Cette seconde voie est celle par laquelle un constructeur d'IA crée une table.\nIl écrit le SQL et l'exécute pour vous, donc vous n'avez jamais vu la case et\njamais vu qu'elle était décochée.",[10,253,254],{},"L'habitude qui referme cela consiste à mettre la ligne dans la migration, juste\nà côté de ce qu'elle protège :",[19,256,259],{"className":257,"code":258,"language":24},[22],"create table public.profiles (\n  id uuid primary key references auth.users,\n  full_name text\n);\n\nalter table public.profiles enable row level security;\n",[26,260,258],{"__ignoreMap":28},[262,263,265],"callout",{"type":264},"warn",[10,266,267,270],{},[14,268,269],{},"L'advisor est un instantané, pas une surveillance."," Il rapporte l'état de\nvotre base au dernier passage, et il continuera tranquillement à vous montrer un\npanneau propre datant d'avant la migration de ce matin. Relancez-le après tout\nchangement qui crée une table ou touche une politique, ce qui dans un projet\nconstruit par IA représente la plupart des changements.",[37,272,274],{"id":273},"comment-vérifier-les-tables-que-ladvisor-a-laissées-passer","Comment vérifier les tables que l'advisor a laissées passer",[10,276,277],{},"Posez à votre base la question que pose un inconnu : envoyez une requête depuis\nl'extérieur, avec la clé publiable livrée dans votre app, et regardez ce qui\nrevient.",[10,279,280],{},"C'est la différence autour de laquelle tourne tout l'article. L'advisor lit\nvotre configuration. Une requête lit vos lignes. Ce sont deux questions\ndifférentes, et une table peut réussir la première et échouer à la seconde, ce\nque fait précisément une politique de lecture permissive.",[216,282],{"alt":283,"caption":284,"src":285},"Deux lecteurs à l'extérieur d'une frontière de projet en pointillés. Une loupe n'atteint que le panneau de réglages à l'intérieur et revient avec un cercle pointillé vide. La requête d'une personne passe au-delà jusqu'aux lignes de la table et revient avec elles.","L'advisor s'arrête à vos réglages. Une requête venue de l'extérieur continue jusqu'aux lignes, et c'est pourquoi les deux peuvent diverger sur la même table.","\u002Fblog\u002Fsupabase-rls-disabled-in-public\u002Fsettings-versus-answer-1600x600.png",[10,287,288,289,293,294,298],{},"Nous avons posé cette requête à grande échelle. Entre le 12 et le 14 août 2026,\nnous avons passé neuf vérifications externes sur 30 998 apps en production\npubliées depuis Lovable, Base44, Replit, v0 et Bolt. Sur les 3 680 apps adossées\nà Supabase où la vérification a pu aboutir, 2 096 avaient au moins une table qui\na répondu à une requête anonyme avec des lignes. Cela fait 57 %, et c'est une\npart des apps dont nous avons pu obtenir une réponse nette, pas de tout ce que\nnous avons scanné. Parmi les apps faites avec Bolt, le chiffre était de 27 sur\n35, un échantillon assez petit pour se lire comme une direction et non comme un\ntaux. Le\n",[225,290,292],{"href":291},"\u002Fresearch\u002Fvibe-coded-app-security-2026","jeu de données complet est publié",", et\n",[225,295,297],{"href":296},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","de quoi ces 57 % sont une part","\nreprend le décompte.",[10,300,301,302,234],{},"Vous pouvez faire vous-même cette requête sur une table avec un navigateur et\nvotre propre clé publiable. Si vous préférez ne pas y aller table par table,\nnotre scan gratuit interroge votre app en production depuis l'extérieur et vous\ndit quelles tables ont répondu. Il prend une vingtaine de secondes et ne demande\npas de compte : ",[225,303,305],{"href":304},"\u002F#scan","scanner votre app",[37,307,309],{"id":308},"ai-je-besoin-dune-sauvegarde-avant-de-changer-des-politiques-rls","Ai-je besoin d'une sauvegarde avant de changer des politiques RLS ?",[10,311,312],{},"Pour toute table dans laquelle votre app écrit, oui. Pour une table en lecture\nseule que vous ne faites que resserrer, le risque est que votre app reste\nblanche, pas que des données disparaissent.",[10,314,315],{},"Deux choses distinctes méritent d'être séparées ici, parce qu'une seule concerne\nla réparation.",[10,317,318,321,322,324,325,328],{},[14,319,320],{},"Ce qu'une politique permissive a déjà autorisé."," Si la règle sur la table\nétait ",[26,323,189],{}," et non ",[26,326,327],{},"FOR SELECT",", alors quiconque l'a trouvée\npouvait modifier et supprimer des lignes en plus de les lire, et la resserrer\naujourd'hui ne change rien à hier. Cette version apparaît en général comme un\nmessage de support à propos de données qui ont changé toutes seules, ou comme\nune table soudain vide.",[10,330,331,334],{},[14,332,333],{},"La réparation elle-même."," Réécrire les politiques sur une douzaine de tables\nest une modification d'une base en production, écrite par les mêmes outils qui\nont produit le problème. Une migration qui supprime une politique et la recrée\nde travers est un mardi ordinaire, et le chemin du retour est une copie de\nl'état d'il y a une heure.",[10,336,337,338,342,343,347],{},"Sur un plan payant Supabase, la copie d'hier soir est dans la console. Sur le\nplan gratuit, il n'y a rien où retomber, parce que\n",[225,339,341],{"href":340},"\u002Fblog\u002Fdoes-supabase-back-up-my-database","le plan gratuit ne prend aucune sauvegarde automatique",".\nSi c'est votre cas, prenez-en une avant de toucher à une politique :\n",[225,344,346],{"href":345},"\u002Fblog\u002Fback-up-supabase-free-tier","comment sauvegarder une base Supabase sur le plan gratuit","\nen est la version en dix minutes.",[37,349,351],{"id":350},"ce-dont-reeve-care-garde-une-copie","Ce dont Reeve Care garde une copie",[10,353,354],{},"De votre base Supabase, copiée selon un calendrier, gardée hors de votre compte\nSupabase, chiffrée, et relue avant que la date affichée sur votre tableau de\nbord ne bouge. Les fichiers que vos utilisateurs ont téléversés voyagent avec\nelle dès que vous connectez une clé Storage.",[10,356,357,358,361],{},"Deux limites, dites d'avance. Les sauvegardes sont ",[14,359,360],{},"réservées à Supabase"," : si\nvos données vivent ailleurs, nous le disons plutôt que de vous vendre un\nabonnement qui surveille une boîte vide. Et la clé Storage est demandée à part,\nparce que Supabase n'émet pas de clé en lecture seule pour les fichiers, donc\ncelle qui copie vos téléversements peut aussi écrire. Celle qui copie votre base\nne le peut pas. La connecter est facultatif, et la base est sauvegardée dans\ntous les cas.",[10,363,364],{},"La restauration est la partie qui compte pour cet article. Reposer une vieille\ncopie par-dessus une base en production est le bouton le plus effrayant du\nproduit, alors Care prend d'abord une copie de l'état actuel et ne rejoue\nqu'ensuite celle que vous avez choisie. La restauration a son propre retour en\narrière.",[216,366],{"alt":367,"caption":368,"src":369},"Une frontière en pointillés autour d'une base de données, avec la marque Reeve Care à côté. L'étape un est une flèche qui quitte la frontière vers une copie neuve. L'étape deux est une flèche qui ramène la copie stockée à l'intérieur.","Ce qui se passe quand vous appuyez sur restaurer. L'état actuel est copié dehors avant que quoi que ce soit ne soit rejoué, donc appuyer sur le bouton se défait aussi.","\u002Fblog\u002Fsupabase-rls-disabled-in-public\u002Frestore-takes-a-copy-first-1600x520.png",[10,371,372],{},"L'autre moitié de Care est celle que cet article ne cesse de désigner. Une\npolitique qui s'est relâchée pendant une migration ne se trouve pas en\nregardant, alors la même vérification externe repasse selon un calendrier et\nvous prévient quand la réponse change. La disponibilité, un rapport mensuel et\nle scan tiennent dans le même abonnement.",[10,374,375,376,380,381,234],{},"Ce qu'une copie ne fait pas, c'est écrire vos politiques à votre place, et\naucune sauvegarde ne referme une table ouverte. Ces tables restent votre\nchantier. Ce que la copie change, c'est ce qui arrive quand la réparation part\nde travers.\n",[225,377,379],{"href":378},"\u002Fsupabase-backups","Ce que Reeve sauvegarde sur Supabase, à quelle fréquence, et ce que fait une restauration","\ndessine le cycle entier, et les offres et leurs prix sont sur la\n",[225,382,384],{"href":383},"\u002Fpricing","page tarifs",[37,386,388],{"id":387},"que-faire-cette-semaine","Que faire cette semaine",[390,391,392],"key-takeaways",{},[393,394,395,403,409,412,419],"ul",{},[396,397,398,399,402],"li",{},"Videz d'abord les entrées \"RLS disabled in public\". Ce sont les tables où rien n'est consulté du tout, et le correctif est une ligne ",[26,400,401],{},"alter table"," chacune.",[396,404,405,406,408],{},"Ouvrez ensuite Authentication → Policies et lisez la condition de chaque politique qui a survécu. Un ",[26,407,96],{}," sur une politique de lecture est invisible pour l'advisor et grand ouvert pour un inconnu.",[396,410,411],{},"Décidez table par table si publier son contenu sur une page vous mettrait à l'aise. C'est la question à laquelle le linter ne peut pas répondre pour vous, et avec une politique de lecture permissive c'est la seule qui compte.",[396,413,414,415,418],{},"Mettez ",[26,416,417],{},"alter table ... enable row level security;"," dans chaque migration qui crée une table, et relancez l'advisor après chacune. La valeur par défaut du tableau de bord ne vaut que pour les tables créées à la souris.",[396,420,421],{},"Prenez une copie de votre base avant de réécrire des politiques sur une table en production, et regardez sur quel plan Supabase vous êtes pour savoir si vous en avez déjà une.",[10,423,424,425,429,430,434],{},"Commencez par la table qui vous gênerait le plus en page publique. La\n",[225,426,428],{"href":427},"\u002Fchecklist","liste de sécurité en 10 minutes"," couvre cela avec le reste de ce\nqui mérite vérification sur une app fraîchement lancée, et le\n",[225,431,433],{"href":432},"\u002Fis-your-supabase-app-safe","guide de sécurité Supabase"," passe en revue ce qui\nreste ouvert par ailleurs.",{"title":28,"searchDepth":436,"depth":436,"links":437},3,[438,440,441,442,443,444,445,446],{"id":39,"depth":439,"text":40},2,{"id":63,"depth":439,"text":64},{"id":85,"depth":439,"text":86},{"id":237,"depth":439,"text":238},{"id":273,"depth":439,"text":274},{"id":308,"depth":439,"text":309},{"id":350,"depth":439,"text":351},{"id":387,"depth":439,"text":388},"Bases de la sécurité","\u002Fblog\u002Fsupabase-rls-disabled-in-public\u002Fcover-1200x630.png","Un panneau de tableau de bord listant plusieurs tables, avec une marque d'alerte à côté de l'une d'elles et rien à côté des autres.","Supabase signale \"RLS disabled in public\" comme une erreur. Elle ne dit rien de la politique de lecture qui laisse votre table tout aussi ouverte.",false,"md",[454,457,460,463,466],{"q":455,"a":456},"\"RLS disabled in public\" est-ce une erreur ou un avertissement ?","Une erreur, et c'est le niveau le plus élevé qu'utilise l'advisor. L'entrée indique \"Table public.\u003Cname> is public, but RLS has not been enabled.\" Les deux entrées voisines sont plus discrètes : une table avec le réglage activé et aucune politique est signalée en INFO, et une politique dont la condition est toujours vraie est signalée en WARN. Ces niveaux disent la confiance du linter dans ce qu'il peut voir de votre configuration, pas l'ampleur de votre problème.",{"q":458,"a":459},"Activer Row Level Security va-t-il casser mon app ?","Immédiatement, oui, et c'est le réglage qui fait son travail. Supabase documente que les données deviennent inaccessibles via l'API avec une clé publiable tant qu'aucune politique n'est définie. Dès que vous exécutez la ligne, vos listes reviennent vides et vos écrans restent blancs. L'app revient quand vous ajoutez une politique disant qui peut voir quelles lignes. L'erreur à éviter est d'en ajouter une qui autorise tout le monde, parce que cette version fait aussi remarcher l'app.",{"q":461,"a":462},"J'ai activé RLS et plus rien ne charge. Que s'est-il passé ?","Rien n'est cassé. Avec Row Level Security activé et aucune politique écrite, Postgres, le moteur de base de données sous Supabase, refuse toutes les requêtes, y compris celles de votre propre app, et l'advisor remplace son erreur par une entrée INFO disant que la table a RLS activé mais aucune politique. Écrivez une politique pour les lignes que votre app doit montrer, en commençant par celle qui compare le visiteur connecté à la colonne propriétaire de la ligne.",{"q":464,"a":465},"Ma table n'est pas signalée et pourtant tout le monde peut la lire. Pourquoi ?","Le plus probable est que Row Level Security soit activé et qu'une politique de lecture ait pour condition USING (true). L'advisor a bien une règle pour les politiques toujours vraies, et elle laisse volontairement de côté les politiques de lecture, parce que l'accès public en lecture est une chose raisonnable pour un catalogue produits ou une liste d'articles publiés. Rien dans votre tableau de bord ne sait si votre table contient des lieux ou des clients, donc cette vérification vous revient.",{"q":467,"a":468},"Ai-je besoin de Row Level Security si mon app ne parle qu'à mon propre serveur ?","Si le navigateur ne parle réellement jamais à Supabase et qu'aucune clé publiable ne figure dans le code que votre site envoie aux visiteurs, alors la Data API n'est pas une porte d'entrée et les politiques ne sont pas ce qui protège ces tables. C'est rare dans une app faite avec Lovable, Bolt ou v0, parce que ces constructeurs branchent le navigateur directement sur Supabase par défaut. Ouvrez votre propre site, regardez si l'URL du projet et la clé publiable y figurent, et laissez cette réponse décider.","\u002Fblog\u002Fsupabase-rls-disabled-in-public\u002Fcard-800x500.png",[471,472,473,474,475,476,477,478],"rls disabled in public","alerte supabase rls désactivé","supabase security advisor","supabase database linter","supabase lint 0013","table is public but rls has not been enabled","activer rls supabase","rls policy always true",{},true,"Supabase : ce que \"RLS disabled in public\" rate","\u002Fblog\u002Fsupabase-rls-disabled-in-public","2026-09-09",{"title":5,"description":450},"blog\u002Fsupabase-rls-disabled-in-public",[487,488,489],"\"RLS disabled in public\" veut dire une seule chose : une table de votre schéma public a Row Level Security désactivé, donc n'importe qui disposant de l'adresse de votre projet et de votre clé publiable peut la lire.","Elle ne dit rien d'une table où vous avez activé le réglage puis écrit une politique qui laisse tout le monde lire. Une règle existe pour les politiques toujours vraies, et elle laisse les politiques de lecture de côté volontairement.","Réglez les tables signalées, puis vérifiez les autres depuis l'extérieur, parce que l'advisor lit vos réglages et ne demande jamais à votre base ce qu'un inconnu reçoit vraiment.","QFRH_QsV7uqsIBGKXr1xqHDMvh8NA3TribHQVd0F9do",[492,499,505,511,517,523,529,535,541,547,553,559,565,571,577,578,584,590,596,602,608,614,620,626,632,637,643,649,654,660,666,672,678,684,690,695,700,706,711,716,721,727],{"path":493,"title":494,"description":495,"published":496,"category":497,"image":498,"draft":451},"\u002Fblog\u002Fsupabase-backup-auth-users","Pourquoi votre dump Supabase ne contient aucun utilisateur","Lancez supabase db dump tout seul et vous obtenez la forme de votre base et aucune de ses lignes, sans le schéma auth où vivent vos utilisateurs.","2026-09-23","Backups","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":500,"title":501,"description":502,"published":503,"category":447,"image":504,"draft":451},"\u002Fblog\u002Fdomain-and-certificate-expiry","Domaine expiré, site hors ligne : ce qui se passe ensuite","Votre domaine a expiré et votre site est hors ligne. Le compte à rebours qui démarre, pourquoi le certificat est le moindre souci, et comment vérifier les deux.","2026-09-22","\u002Fblog\u002Fdomain-and-certificate-expiry\u002Fcard-800x500.png",{"path":506,"title":507,"description":508,"published":509,"category":447,"image":510,"draft":451},"\u002Fblog\u002Fis-lovable-safe","Lovable est-il sûr ? Ce que 18 554 applications Lovable ont montré","Lovable est-il sûr ? 18 554 applications, neuf vérifications. La plateforme était la plus propre des cinq. Les trouvailles étaient dans les applications.","2026-09-21","\u002Fblog\u002Fis-lovable-safe\u002Fcard-800x500.png",{"path":512,"title":513,"description":514,"published":515,"category":447,"image":516,"draft":451},"\u002Fblog\u002Fvibe-coded-app-security-checklist","La checklist de sécurité du vibe coding, en neuf vérifications","Une checklist de sécurité du vibe coding en neuf points, chacun vérifiable de l’extérieur sur votre appli en ligne, et chacun avec un test d’une ligne.","2026-09-20","\u002Fblog\u002Fvibe-coded-app-security-checklist\u002Fcard-800x500.png",{"path":518,"title":519,"description":520,"published":521,"category":447,"image":522,"draft":451},"\u002Fblog\u002Fstripe-secret-key-in-frontend","Une clé secrète Stripe dans votre frontend peut déplacer de l’argent","Une clé secrète Stripe exposée dans votre frontend peut rembourser, débiter et lire chaque fiche client que vous détenez. Votre clé pk_live_ y a sa place.","2026-09-19","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Fcard-800x500.png",{"path":524,"title":525,"description":526,"published":527,"category":447,"image":528,"draft":451},"\u002Fblog\u002Fvite-and-next-public-env-vars","Variables d’environnement Vite exposées : le préfixe dit publier","Variables d’environnement Vite exposées : votre appli a fait ce que le préfixe demandait. VITE_ et NEXT_PUBLIC_ veulent dire publier, et l’IA ignorait le prix.","2026-09-18","\u002Fblog\u002Fvite-and-next-public-env-vars\u002Fcard-800x500.png",{"path":530,"title":531,"description":532,"published":533,"category":447,"image":534,"draft":451},"\u002Fblog\u002Fbase44-source-maps","Sécurité Base44 : ce qu’un scan signale, et ce qui dépend de vous","Sécurité Base44 sur 5 438 applis : trois signalements sur presque chacune sont ceux de la plateforme, la source map est le badge Base44, votre part est courte.","2026-09-17","\u002Fblog\u002Fbase44-source-maps\u002Fcard-800x500.png",{"path":536,"title":537,"description":538,"published":539,"category":447,"image":540,"draft":451},"\u002Fblog\u002Fis-cursor-ai-safe","Cursor AI est-il sûr ? L’éditeur, le code et l’appli publiée","Cursor AI est-il sûr ? Trois questions dans une recherche : ce que Cursor garde, ce que son code rate, et si l’appli que vous avez publiée est ouverte.","2026-09-16","\u002Fblog\u002Fis-cursor-ai-safe\u002Fcard-800x500.png",{"path":542,"title":543,"description":544,"published":545,"category":447,"image":546,"draft":451},"\u002Fblog\u002Fis-replit-safe","Replit est-il sûr ? Ce que 3 042 applications Replit nous ont montré","Replit est-il sûr ? 3 042 applications Replit en ligne, neuf vérifications externes. Les trouvailles étaient dans l’application publiée, pas chez l’hébergeur.","2026-09-15","\u002Fblog\u002Fis-replit-safe\u002Fcard-800x500.png",{"path":548,"title":549,"description":550,"published":551,"category":497,"image":552,"draft":451},"\u002Fblog\u002Fsupabase-storage-backup","Supabase storage backup : votre copie de base n'a aucun fichier","Un Supabase storage backup est une tâche à part. Les sauvegardes de la base gardent la liste de vos fichiers et aucun des fichiers, donc chaque upload casse.","2026-09-14","\u002Fblog\u002Fsupabase-storage-backup\u002Fcard-800x500.png",{"path":554,"title":555,"description":556,"published":557,"category":497,"image":558,"draft":451},"\u002Fblog\u002Fsupabase-point-in-time-recovery","Point-in-time recovery Supabase : prix et limites","Le point-in-time recovery de Supabase rembobine votre base à la seconde près sur la dernière semaine. $100 par mois en plus de Pro, et rien que la base.","2026-09-13","\u002Fblog\u002Fsupabase-point-in-time-recovery\u002Fcard-800x500.png",{"path":560,"title":561,"description":562,"published":563,"category":497,"image":564,"draft":451},"\u002Fblog\u002Fsupabase-project-paused-recover","Projet Supabase en pause ? Vos données sont toujours là","Supabase a mis votre projet en pause après une semaine sans activité. Rien n'est supprimé, Restaurer est à côté du nom, et vous avez un an pour cliquer.","2026-09-12","\u002Fblog\u002Fsupabase-project-paused-recover\u002Fcard-800x500.png",{"path":566,"title":567,"description":568,"published":569,"category":447,"image":570,"draft":451},"\u002Fblog\u002Fsafest-ai-app-builder","Quel builder d'app IA est le plus sûr ? 30 998 apps testées","Quel builder d'app IA est le plus sûr ? Nous avons scanné 30 998 apps actives de Lovable, Base44, Replit, v0 et Bolt. Ce n'est pas le builder qui décide.","2026-09-11","\u002Fblog\u002Fsafest-ai-app-builder\u002Fcard-800x500.png",{"path":572,"title":573,"description":574,"published":575,"category":447,"image":576,"draft":451},"\u002Fblog\u002Fenable-rls-on-every-supabase-table","Activer Row Level Security sur chaque table Supabase, et le prouver","Activer Row Level Security dans Supabase sans politique ferme la table entièrement. Une politique sans le réglage ne fait rien. Voici le SQL, et le test.","2026-09-10","\u002Fblog\u002Fenable-rls-on-every-supabase-table\u002Fcard-800x500.png",{"path":482,"title":5,"description":450,"published":483,"category":447,"image":469,"draft":451},{"path":579,"title":580,"description":581,"published":582,"category":447,"image":583,"draft":451},"\u002Fblog\u002Frotate-supabase-service-role-key","Faire tourner une clé service_role Supabase qui a fuité","Supabase dit de colmater la fuite d'abord. D'autres guides disent de faire tourner la clé tout de suite. Tout dépend d'où votre clé service_role a fuité.","2026-09-08","\u002Fblog\u002Frotate-supabase-service-role-key\u002Fcard-800x500.png",{"path":585,"title":586,"description":587,"published":588,"category":447,"image":589,"draft":451},"\u002Fblog\u002Fvibe-coding-security-scanners-compared","Scanners de sécurité vibe coding comparés, le nôtre compris","Le meilleur scanner de sécurité vibe coding tient à trois questions qu'aucune liste de fonctions ne traite. Dix outils comparés, avec les prix.","2026-09-07","\u002Fblog\u002Fvibe-coding-security-scanners-compared\u002Fcard-800x500.png",{"path":591,"title":592,"description":593,"published":594,"category":447,"image":595,"draft":451},"\u002Fblog\u002Fsupabase-security-checker","Supabase security checker : les cinq vérifications à faire soi-même","Un Supabase security checker lit votre app publiée plutôt que les réglages de votre projet. Voici les cinq vérifications, et comment faire chacune vous-même.","2026-09-06","\u002Fblog\u002Fsupabase-security-checker\u002Fcard-800x500.png",{"path":597,"title":598,"description":599,"published":600,"category":447,"image":601,"draft":451},"\u002Fblog\u002Fvibe-coding-security-scanner","Scanner de sécurité vibe coding : ce qu’un scan d’URL rate","Un scanner de sécurité vibe coding lit votre app en ligne depuis l’extérieur. Ce qu’il couvre, les quatre choses qu’il ne voit pas, et comment lire le résultat.","2026-09-05","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fcard-800x500.png",{"path":603,"title":604,"description":605,"published":606,"category":447,"image":607,"draft":451},"\u002Fblog\u002Fmissing-security-headers","En-têtes de sécurité manquants : quand cela compte","Les en-têtes de sécurité manquants sont notre constat le plus fréquent. Contre quoi ils protègent, et quand ils comptent le moins dans votre rapport.","2026-09-04","\u002Fblog\u002Fmissing-security-headers\u002Fcard-800x500.png",{"path":609,"title":610,"description":611,"published":612,"category":447,"image":613,"draft":451},"\u002Fblog\u002Fopenai-api-key-exposed-in-frontend","Votre clé API OpenAI est exposée dans votre frontend. Changez-la.","Une clé API OpenAI exposée dans votre frontend ne peut être liée à aucun domaine. Changez-la aujourd'hui, passez par votre serveur et plafonnez la dépense.","2026-09-03","\u002Fblog\u002Fopenai-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":615,"title":616,"description":617,"published":618,"category":447,"image":619,"draft":451},"\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps","Clé API exposée dans le frontend : ce que 30 998 applis livrent","Une clé API exposée dans votre frontend est le plus souvent une clé Google Maps. Nous avons scanné 30 998 applis vibe-codées et compté ce qui fuit vraiment.","2026-09-02","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps\u002Fcard-800x500.png",{"path":621,"title":622,"description":623,"published":624,"category":497,"image":625,"draft":451},"\u002Fblog\u002Fsupabase-backup-tools-compared","Outils de sauvegarde Supabase comparés, le nôtre compris","Quatre familles d'outil de sauvegarde Supabase, ce que chacun copie vraiment, et quand une GitHub Action gratuite bat le fait de payer, nous compris.","2026-09-01","\u002Fblog\u002Fsupabase-backup-tools-compared\u002Fcard-800x500.png",{"path":627,"title":628,"description":629,"published":630,"category":447,"image":631,"draft":451},"\u002Fblog\u002Freplit-secrets-explained","Utiliser les secrets sur Replit, et ce qui est publié quand même","Utiliser les secrets sur Replit : en ajouter un, le relire, corriger les deux causes du undefined. Et les clés que l'outil Secrets ne peut pas protéger.","2026-08-31","\u002Fblog\u002Freplit-secrets-explained\u002Fcard-800x500.png",{"path":345,"title":633,"description":634,"published":635,"category":497,"image":636,"draft":451},"Sauvegardes du plan gratuit Supabase : en faire une sans terminal","Le plan gratuit de Supabase ne fait aucune sauvegarde : la copie vient de vous. Comment la faire depuis le tableau de bord, et ce que le CSV oublie.","2026-08-30","\u002Fblog\u002Fback-up-supabase-free-tier\u002Fcard-800x500.png",{"path":638,"title":639,"description":640,"published":641,"category":447,"image":642,"draft":451},"\u002Fblog\u002Fis-supabase-secure","Supabase est-il sûr ? Oui. Votre projet est une autre question","Supabase est-il sûr ? La plateforme est auditée, chiffrée et testée en intrusion. Sa documentation dit où cela s'arrête et où vos réglages commencent.","2026-08-29","\u002Fblog\u002Fis-supabase-secure\u002Fcard-800x500.png",{"path":644,"title":645,"description":646,"published":647,"category":447,"image":648,"draft":451},"\u002Fblog\u002Fwhere-to-find-supabase-api-keys","Où trouver vos clés API Supabase : anon, service_role et URL","L'URL du projet, la clé anon et la clé service_role tiennent sur une page du tableau de bord. Voici où elle est, et laquelle des quatre va dans votre app.","2026-08-28","\u002Fblog\u002Fwhere-to-find-supabase-api-keys\u002Fcard-800x500.png",{"path":232,"title":650,"description":651,"published":652,"category":447,"image":653,"draft":451},"New row violates row-level security policy sur Supabase : et après ?","\"New row violates row-level security policy\" signifie que Supabase a refusé une écriture. Le correctif rapide rouvre la table à tout le monde.","2026-08-27","\u002Fblog\u002Fnew-row-violates-row-level-security-policy\u002Fcard-800x500.png",{"path":655,"title":656,"description":657,"published":658,"category":447,"image":659,"draft":451},"\u002Fblog\u002Fcors-wildcard-security-risk","Un joker CORS est-il un risque de sécurité ? Rarement.","Un joker CORS est-il un risque de sécurité ? C'est souvent le réglage par défaut de votre builder, et il ne livre rien que votre serveur ne donnait déjà.","2026-08-26","\u002Fblog\u002Fcors-wildcard-security-risk\u002Fcard-800x500.png",{"path":661,"title":662,"description":663,"published":664,"category":497,"image":665,"draft":451},"\u002Fblog\u002Fsupabase-branching-is-not-a-backup","Le branching Supabase n'est pas une sauvegarde de vos données.","Pourquoi le branching Supabase n'est pas une sauvegarde : une branche démarre sans vos données, et un merge ne déplace que le schéma. À quoi il sert vraiment.","2026-08-25","\u002Fblog\u002Fsupabase-branching-is-not-a-backup\u002Fcard-800x500.png",{"path":667,"title":668,"description":669,"published":670,"category":497,"image":671,"draft":451},"\u002Fblog\u002Fhow-to-restore-a-supabase-backup","Restaurer une sauvegarde Supabase, et ce qui casse après","Restaurer une sauvegarde Supabase depuis le tableau de bord ou un fichier de dump, ce que la restauration remplace et pourquoi votre app peut rester cassée.","2026-08-24","\u002Fblog\u002Fhow-to-restore-a-supabase-backup\u002Fcard-800x500.png",{"path":673,"title":674,"description":675,"published":676,"category":447,"image":677,"draft":451},"\u002Fblog\u002Fsupabase-storage-bucket-public","Votre bucket Supabase Storage est public. Est-ce un problème ?","Un bucket Supabase Storage public signifie que celui qui a l'URL d'un fichier peut l'ouvrir. Il ne signifie pas que quelqu'un peut lister ce qu'il contient.","2026-08-23","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcard-800x500.png",{"path":679,"title":680,"description":681,"published":682,"category":447,"image":683,"draft":451},"\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend","Une clé API Google dans votre frontend, est-ce un problème ?","Une clé API Google exposée dans votre frontend est la clé que notre scanner trouve le plus souvent, et en général tout va bien. Un réglage gratuit tranche.","2026-08-22","\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":685,"title":686,"description":687,"published":688,"category":497,"image":689,"draft":451},"\u002Fblog\u002Fai-agent-deleted-my-database","Un agent IA a supprimé mes données Supabase. Que puis-je récupérer ?","Un agent IA a supprimé des données de votre base. Ce que vous pouvez récupérer était déjà décidé avant, et les prochaines minutes décident du reste.","2026-08-21","\u002Fblog\u002Fai-agent-deleted-my-database\u002Fcard-800x500.png",{"path":296,"title":691,"description":692,"published":693,"category":447,"image":694,"draft":451},"Qui peut lire votre base Supabase ? Nous avons testé 3 680 apps","N'importe qui peut-il lire votre base de données Supabase sans se connecter ? Nous avons scanné 30 998 apps en ligne créées avec des builders IA.","2026-08-18","\u002Fblog\u002Fcan-anyone-read-your-supabase-database\u002Fcard-800x500.png",{"path":696,"title":697,"description":698,"published":693,"category":447,"image":699,"draft":451},"\u002Fblog\u002Fsource-maps-exposed-in-production","Source maps exposées : votre app publie son code original","Une source map exposée laisse n'importe qui lire le code original de votre app, commentaires compris. Le test de 30 secondes, et ce qui compte vraiment.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fcard-800x500.png",{"path":701,"title":702,"description":703,"published":704,"category":447,"image":705,"draft":451},"\u002Fblog\u002Fsupabase-new-api-keys","Les nouvelles clés API Supabase : laquelle va dans votre app ?","Supabase a remplacé anon et service_role par des clés publiables et secrètes. Laquelle a sa place dans votre app, et laquelle jamais ?","2026-08-12","\u002Fblog\u002Fsupabase-new-api-keys\u002Fcard-800x500.png",{"path":340,"title":707,"description":708,"published":709,"category":497,"image":710,"draft":451},"Supabase sauvegarde-t-il ma base de données ? Cela dépend du plan.","Supabase sauvegarde-t-il votre base de données ? Chaque jour sur les plans payants, jamais sur le gratuit. Comment savoir ce que vous avez vraiment.","2026-08-11","\u002Fblog\u002Fdoes-supabase-back-up-my-database\u002Fcard-800x500.png",{"path":227,"title":712,"description":713,"published":714,"category":447,"image":715,"draft":451},"Supabase Row Level Security est activé. La table reste publique.","Activer Supabase Row Level Security ne protège pas une table. Ce sont vos politiques, et celle qui a réparé votre app laisse peut-être entrer tout le monde.","2026-08-10","\u002Fblog\u002Fsupabase-rls-on-but-table-still-public\u002Fcard-800x500.png",{"path":717,"title":718,"description":719,"published":714,"category":497,"image":720,"draft":451},"\u002Fblog\u002Fversion-history-is-not-a-backup","L'historique des versions n'est pas une sauvegarde de vos données.","Lovable et Bolt tiennent un historique des versions de votre code. Votre base de données est un service à part, et revenir en arrière ne la ramène pas.","\u002Fblog\u002Fversion-history-is-not-a-backup\u002Fcard-800x500.png",{"path":722,"title":723,"description":724,"published":725,"category":497,"image":726,"draft":451},"\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database","Trois façons de sauvegarder une base Supabase, et ce qui manque","Le tableau de bord, pg_dump et un service géré. Ce que chacun enregistre, ce qu'il laisse de côté sans le dire, et lequel survit à la perte du compte.","2026-08-09","\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database\u002Fcard-800x500.png",{"path":728,"title":729,"description":730,"published":725,"category":447,"image":731,"draft":451},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","Quelles clés API sont sûres côté navigateur, et lesquelles non","Votre clé anon Supabase est faite pour être publique. Votre clé service_role non, et elle ignore toutes les règles que vous posez. Comment les distinguer.","\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend\u002Fcard-800x500.png",1790150953896]