[{"data":1,"prerenderedAt":350},["ShallowReactive",2],{"blog-fr-supabase-storage-bucket-public":3},{"id":4,"title":5,"body":6,"category":308,"cover":309,"coverAlt":310,"description":311,"draft":312,"extension":313,"faq":314,"image":330,"keywords":331,"meta":338,"navigation":339,"ogTitle":340,"path":341,"published":342,"seo":343,"stem":344,"tldr":345,"updated":342,"__hash__":349},"blog_fr\u002Fblog\u002Fsupabase-storage-bucket-public.md","Votre bucket Supabase Storage est public. Est-ce un problème ?",{"type":7,"value":8,"toc":297},"minimark",[9,13,16,24,29,32,35,38,41,45,48,110,113,116,122,126,129,141,151,154,157,171,175,178,193,196,201,204,211,215,218,224,233,236,240,243,246,249,252,256,284],[10,11,12],"p",{},"Quelqu'un a ouvert votre application, y a fouillé une minute et vous a envoyé un\nmessage : votre bucket Supabase Storage est public, et n'importe qui peut lister\nce qu'il contient.",[10,14,15],{},"Ce sont deux affirmations distinctes. L'une porte probablement sur un réglage que\nvous avez choisi exprès et que vous devriez garder. L'autre vaut un après-midi.",[10,17,18,19,23],{},"Voici ce que guide après guide raconte de travers : ",[20,21,22],"strong",{},"public et listable sont\ndeux interrupteurs différents, et celui qui inquiète n'est pas celui que tout le\nmonde vous dit de basculer."," Passer un bucket en privé ferme le premier. Cela\npeut laisser le second grand ouvert, et un bucket qui n'a jamais été public de sa\nvie peut être listable cet après-midi.",[25,26,28],"h2",{"id":27},"un-bucket-supabase-storage-public-est-il-un-problème-de-sécurité","Un bucket Supabase Storage public est-il un problème de sécurité ?",[10,30,31],{},"En soi, non. Cela signifie une chose bien précise, et cette chose est très\nsouvent celle que vous vouliez.",[10,33,34],{},"Marquer un bucket comme public donne à chaque fichier qu'il contient une URL qui\nfonctionne sans connexion. C'est toute la fonctionnalité. C'est ainsi que\nl'avatar sous un commentaire se charge pour quelqu'un sans compte, que votre logo\napparaît dans un e-mail, qu'une photo de produit s'affiche pour quelqu'un qui\nhésite encore à s'inscrire.",[10,36,37],{},"Un bucket public ressemble davantage à un numéro de téléphone sur liste rouge\nqu'à une porte non verrouillée. La ligne aboutit pour quiconque compose le\nnuméro, et il n'existe aucun annuaire où le chercher. Que ce soit acceptable\ndépend d'une seule question : avec quelle facilité quelqu'un arriverait à ce\nnuméro sans qu'on le lui donne.",[10,39,40],{},"Supabase crée les nouveaux buckets en privé et place un avertissement à côté de\nl'interrupteur. Un bucket public est donc quelque chose que quelqu'un a activé :\nvous, ou votre builder, pour faire fonctionner une fonction de téléversement.",[25,42,44],{"id":43},"ce-que-linterrupteur-public-active-réellement","Ce que l'interrupteur public active réellement",[10,46,47],{},"Une ligne du tableau ci-dessous, et rien d'autre dedans.",[49,50,51,67],"table",{},[52,53,54],"thead",{},[55,56,57,61,64],"tr",{},[58,59,60],"th",{},"Ce que quelqu'un tente",[58,62,63],{},"Bucket public",[58,65,66],{},"Bucket privé",[68,69,70,82,92,101],"tbody",{},[55,71,72,76,79],{},[73,74,75],"td",{},"Ouvrir un fichier dont il a déjà l'URL exacte",[73,77,78],{},"Fonctionne, sans connexion",[73,80,81],{},"Exige une politique ou un lien signé",[55,83,84,87,90],{},[73,85,86],{},"Demander la liste du contenu du bucket",[73,88,89],{},"Seulement si une politique le permet",[73,91,89],{},[55,93,94,97,99],{},[73,95,96],{},"Téléverser un fichier",[73,98,89],{},[73,100,89],{},[55,102,103,106,108],{},[73,104,105],{},"Supprimer ou remplacer un fichier",[73,107,89],{},[73,109,89],{},[10,111,112],{},"La page d'aide de Supabase le dit aussi clairement que cela peut se dire : un\nbucket public signifie qu'il existe une URL publique permettant de télécharger le\nfichier, et toute autre opération doit encore satisfaire les politiques de ce\nbucket.",[10,114,115],{},"L'interrupteur est donc un contrôle plus petit que son nom ne le laisse croire.\nTrois de ces quatre lignes se décident ailleurs, sous Storage → Policies, et le\nmessage que vous avez reçu portait presque à coup sûr sur la seconde.",[117,118],"diagram",{"alt":119,"caption":120,"src":121},"Quatre buckets côte à côte. Chacun porte un interrupteur public, éteint ou allumé, et une case de politique vide ou remplie. Les deux buckets dont la case contient une condition ne nommant que le bucket montrent leurs six fichiers allumés et barrés d'une croix, quelle que soit la position de l'interrupteur. Les deux à case vide ou étroite ne montrent rien et portent une coche.","L'interrupteur du haut change une seule chose. La case en dessous décide si un inconnu obtient la liste, et elle le fait de la même façon que le bucket soit public ou privé.","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fpublic-and-listable-1600x760.png",[25,123,125],{"id":124},"pourquoi-un-bucket-privé-peut-rester-listable","Pourquoi un bucket privé peut rester listable",[10,127,128],{},"Parce que le listage est accordé par une politique d'accès, et que la politique\nque la plupart des gens collent l'accorde à tout le monde.",[10,130,131,132,136,137,140],{},"Toute lecture de Storage passe par Row Level Security sur une table nommée\n",[133,134,135],"code",{},"storage.objects",". Lister un bucket est une lecture, classée sous ",[133,138,139],{},"SELECT",", tout\ncomme télécharger un fichier. Le guide de démarrage de Supabase montre une\npolitique de cette forme, dont sortent la plupart des copies :",[142,143,149],"pre",{"className":144,"code":146,"language":147,"meta":148},[145],"language-sql","create policy \"Public Access\"\n  on storage.objects for select\n  using ( bucket_id = 'public' );\n","sql","",[133,150,146],{"__ignoreMap":148},[10,152,153],{},"Lisez ce qu'elle dit. N'importe quelle requête peut lire n'importe quoi dans ce\nbucket. Elle ne demande pas qui demande, et elle ne demande pas si le fichier a\nle moindre rapport avec le demandeur. Lire couvre le téléchargement d'un fichier,\net couvre la remise de la liste des fichiers, car c'est la même permission avec\ndeux casquettes.",[10,155,156],{},"L'interrupteur du bucket n'entre jamais en jeu. Une politique pareille sur un\nbucket privé rend le bucket listable, et le tableau de bord continuera de le\ndécrire, à juste titre, comme privé.",[10,158,159,160,165,166,170],{},"Le mot qui fait les dégâts est « n'importe quelle ». Une requête portant la clé\npubliable qui voyage dans le code de votre application satisfait cette politique\nsans effort, et\n",[161,162,164],"a",{"href":163},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","cette clé est faite pour être lisible par tous",",\nce qui est précisément pourquoi la politique est censée être la partie qui\ntravaille. C'est la même forme que le problème d'à côté, où\n",[161,167,169],{"href":168},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","Row Level Security est activée et laisse tout passer quand même",".",[25,172,174],{"id":173},"ce-que-quelquun-tire-dune-liste-de-vos-fichiers","Ce que quelqu'un tire d'une liste de vos fichiers",[10,176,177],{},"Des noms, surtout. Ce qui est bien plus que cela n'en a l'air.",[10,179,180,181,184,185,188,189,192],{},"Les noms de fichiers décrivent souvent leur contenu, parce que quelqu'un les a\nchoisis en pensant à ce qu'il y avait dedans : ",[133,182,183],{},"facture-mars-acme.pdf",",\n",[133,186,187],{},"passeport-recto.jpg",", ",[133,190,191],{},"paie-final-v2.xlsx",". Une liste de ceux-là est un résumé\ncorrect de votre activité, et sa longueur dit à peu près combien de clients vous\navez. Si le bucket est en plus public, chaque nom de cette liste est un lien qui\nfonctionne.",[10,194,195],{},"Retour au numéro de téléphone. Être sur liste rouge vaut quelque chose jusqu'au\njour où l'annuaire paraît, et après cela il n'a jamais compté que le numéro soit\ndifficile à deviner.",[117,197],{"alt":198,"caption":199,"src":200},"Deux moitiés. À gauche, une requête vers le chemin public des objets atteint un fichier sur huit ; les sept autres sont dessinés en contours pointillés que la requête ne trouve jamais. À droite, une requête vers le chemin de listage renvoie les huit en lignes pleines.","Sans listage, un inconnu doit arriver à un nom de fichier d'une manière ou d'une autre. Avec, on lui remet chacun des noms que vous avez.","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fguess-or-list-1600x700.png",[10,202,203],{},"La façon dont cela remonte est ordinaire. Un document appartenant à un client\napparaît devant un autre. Quelqu'un vous cite le nom d'un fichier qu'il n'avait\naucun moyen de connaître. Un dossier de téléversements est copié en entier par un\nrobot automatique qui parcourait tous les projets Supabase qu'il pouvait trouver.",[10,205,206,207,170],{},"Notre scan gratuit demande un listage à votre Storage en n'utilisant rien d'autre\nque la clé déjà présente dans le code de votre application, et vous dit quels\nbuckets ont répondu avec du contenu. Il lit des noms et ne télécharge jamais un\nfichier. Il prend une vingtaine de secondes et ne demande aucun compte :\n",[161,208,210],{"href":209},"\u002F#scan","scannez votre application",[25,212,214],{"id":213},"comment-savoir-dans-quel-cas-vous-êtes","Comment savoir dans quel cas vous êtes",[10,216,217],{},"Deux vérifications dans le tableau de bord Supabase, et la seconde porte sur ce\ndont le message parlait vraiment.",[10,219,220,223],{},[20,221,222],{},"Storage → Buckets."," Les publics sont étiquetés comme publics. Pour chacun,\ndemandez-vous si absolument chaque fichier qu'il contient est quelque chose que\nvous montreriez à un inconnu. Pas la plupart des fichiers. Chacun, y compris ce\nqui y atterrira la semaine prochaine depuis une fonction que vous n'avez pas\nencore construite.",[10,225,226,229,230,232],{},[20,227,228],{},"Storage → Policies."," Lisez chaque politique ",[133,231,139],{}," qui touche le bucket. Une\ncondition qui ne mentionne que le nom du bucket laisse n'importe qui le lire. Une\ncondition qui compare le propriétaire du fichier à l'auteur de la requête fait un\nvrai travail. Une liste de politiques vide sur un bucket privé signifie que rien\nn'est lu du tout, ce qui est restrictif et sûr.",[10,234,235],{},"Si votre application doit montrer un fichier privé à la bonne personne, l'outil\npour cela est un lien signé : votre serveur demande à Supabase une URL qui\nfonctionne un nombre de minutes fixé puis cesse de fonctionner. Le fichier reste\nprivé et arrive quand même sur la page.",[25,237,239],{"id":238},"quand-public-est-la-bonne-réponse","Quand public est la bonne réponse",[10,241,242],{},"Plus souvent qu'un article de sécurité ne l'admet d'habitude, et cela mérite\nd'être dit.",[10,244,245],{},"Si le fichier est destiné à tout le monde, public est correct, et le contourner\nvous achète une application plus lente et davantage de code à entretenir.\nAvatars, logos, images de couverture, tout ce qu'un visiteur déconnecté est censé\nvoir : dans un bucket public, et n'y pensez plus.",[10,247,248],{},"La seule chose à faire même là est de laisser le listage éteint. Un bucket public\nplein d'avatars est une fonctionnalité. Le même bucket qui remet la liste\ncomplète de tous ceux qui en ont un jour téléversé un est autre chose, et vous ne\nl'avez pas demandée.",[10,250,251],{},"Si le fichier appartient à une personne en particulier, il va dans un bucket privé\navec une politique qui vérifie qui demande, et atteint la page par un lien signé.\nLe test est une question unique : pour qui est ce fichier ? Pour tout le monde, ou\npour un compte nommé.",[25,253,255],{"id":254},"ce-quil-faut-faire-cette-semaine","Ce qu'il faut faire cette semaine",[257,258,259],"key-takeaways",{},[260,261,262,266,275,278,281],"ul",{},[263,264,265],"li",{},"Ouvrez Storage → Buckets et notez lesquels sont publics. Pour chacun, décidez s'il contient des fichiers destinés à tous ou des fichiers destinés à une seule personne.",[263,267,268,269,271,272,274],{},"Lisez chaque politique ",[133,270,139],{}," sur ",[133,273,135],{},". Une condition qui ne nomme que le bucket remet la liste des fichiers à n'importe qui ; c'est elle qui a rendu vrai le message que vous avez reçu.",[263,276,277],{},"Déplacez tout ce qui appartient à un seul utilisateur dans un bucket privé et servez-le par des liens signés, qui expirent d'eux-mêmes.",[263,279,280],{},"Cessez de nommer les fichiers téléversés d'après leur contenu. Un identifiant aléatoire ne coûte rien et fait qu'une liste ayant fuité livre bien moins qu'elle ne l'aurait fait.",[263,282,283],{},"Sauvegardez votre Storage séparément de votre base de données. Vos téléversements ne sont ni dans votre code ni dans vos tables Postgres, donc rien de ce qui copie ces deux-là ne copie vos fichiers.",[10,285,286,287,291,292,296],{},"Ouvrez Storage → Policies dans votre projet et lisez ce qui s'y trouve avant de\ntoucher au moindre interrupteur. Cet écran-là décide si la seconde moitié du\nmessage que vous avez reçu était vraie. La\n",[161,288,290],{"href":289},"\u002Fchecklist","checklist de sécurité en 10 minutes"," le couvre à côté du reste de ce\nqu'une application fraîchement lancée a tendance à laisser ouvert, et si un\nbucket s'est révélé lisible,\n",[161,293,295],{"href":294},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","ce qu'un inconnu atteint dans votre base de données","\nest la suite à lire, puisque la politique qui remet une liste de fichiers a la\nmême forme que celle qui remet une table.",{"title":148,"searchDepth":298,"depth":298,"links":299},3,[300,302,303,304,305,306,307],{"id":27,"depth":301,"text":28},2,{"id":43,"depth":301,"text":44},{"id":124,"depth":301,"text":125},{"id":173,"depth":301,"text":174},{"id":213,"depth":301,"text":214},{"id":238,"depth":301,"text":239},{"id":254,"depth":301,"text":255},"Bases de la sécurité","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcover-1200x630.png","Des documents dans un conteneur. Une barre couvre presque toute l'ouverture et s'arrête avant la fin, laissant quatre dans le vide.","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.",false,"md",[315,318,321,324,327],{"q":316,"a":317},"On me dit que mon bucket Supabase Storage est public. Dois-je le passer en privé ?","Pas avant de savoir ce qu'il contient. Les buckets publics existent pour une raison : photos de profil, logos, images produit et tout ce que votre application montre à un visiteur non connecté. Pour ces fichiers, public est le bon réglage. Pour des factures, des pièces d'identité, des exports ou tout ce qui appartient à une personne en particulier, c'est le mauvais, et ce qu'il vous faut alors c'est privé plus des liens signés. La question n'a jamais été de savoir si public est mauvais. Elle est de savoir si ces fichiers-là étaient destinés à être vus par quiconque le demande.",{"q":319,"a":320},"Quelle est la différence entre un bucket public et un bucket listable ?","Public décide si un fichier s'ouvre pour quelqu'un qui a déjà son URL. Listable décide si un inconnu peut demander à votre projet le contenu entier d'un bucket et obtenir une réponse. Les deux se règlent à des endroits différents du tableau de bord Supabase, et le second transforme une devinette en annuaire.",{"q":322,"a":323},"Quelqu'un peut-il deviner les URL des fichiers de mon bucket public ?","Cela dépend entièrement de la façon dont votre application les nomme. Si elle les téléverse sous leur nom d'origine, ou sous quelque chose d'ordonné comme facture-4.pdf, alors oui, et cela demande très peu d'efforts. Si elle les téléverse sous un identifiant long et aléatoire, deviner devient impraticable. C'est exactement pour cela que le listage pèse si lourd : il supprime complètement l'étape de la devinette.",{"q":325,"a":326},"Comment empêcher qu'on liste mon bucket ?","Le listage passe par une politique Row Level Security sur la table storage.objects, c'est donc là que cela se corrige et non sur le bucket lui-même. Ouvrez Storage → Policies dans votre tableau de bord Supabase et lisez chaque politique SELECT qui touche le bucket. Une politique dont la seule condition est le nom du bucket laisse n'importe quelle requête le lire, liste des fichiers comprise. Resserrez-la pour qu'elle compare le fichier à la personne qui le demande, ou retirez-la et distribuez des liens signés depuis votre serveur.",{"q":328,"a":329},"Ma sauvegarde de base de données couvre-t-elle mes fichiers téléversés ?","Non. Storage vit en dehors de votre base Postgres, donc une sauvegarde de la base contient les lignes qui pointent vers vos fichiers et aucun des fichiers eux-mêmes. La restaurer vous rend une table pleine de liens vers des choses qui ne sont plus là. Vos téléversements doivent être copiés séparément, et la plupart des gens l'apprennent le jour où cela compte.","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcard-800x500.png",[332,333,334,335,336,337],"bucket supabase storage public","sécurité bucket public supabase","politique d'accès supabase storage","lister les fichiers bucket supabase","rendre privé un bucket supabase","url signée supabase",{},true,"Un bucket Supabase public est-il un problème ?","\u002Fblog\u002Fsupabase-storage-bucket-public","2026-08-23",{"title":5,"description":311},"blog\u002Fsupabase-storage-bucket-public",[346,347,348],"Un bucket Supabase Storage public signifie une seule chose : celui qui détient l'URL d'un fichier peut l'ouvrir sans se connecter. Il ne dit rien sur ce qu'il peut voir d'autre à l'intérieur.","Le listage est accordé par une politique d'accès et non par l'interrupteur public, donc un bucket privé peut être listable et un bucket public ne pas l'être.","Le listage est ce qu'il faut corriger aujourd'hui, parce qu'il épargne à un inconnu la peine de deviner un seul nom de fichier.","oIRCMO3y5tz0m3CKbz5XgGKAcGggNb6xmZ3HO3qNVak",1787826048205]