[{"data":1,"prerenderedAt":350},["ShallowReactive",2],{"blog-pt-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_pt\u002Fblog\u002Fsupabase-storage-bucket-public.md","Seu bucket do Supabase Storage é público. Isso é um problema?",{"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",{},"Alguém abriu seu aplicativo, ficou um minuto fuçando nele e mandou uma mensagem:\nseu bucket do Supabase Storage está público, e qualquer pessoa pode listar o que\nhá lá dentro.",[10,14,15],{},"São duas afirmações separadas. Uma delas trata provavelmente de uma configuração\nque você escolheu de propósito e deveria manter. A outra vale uma tarde.",[10,17,18,19,23],{},"Aqui está a parte que guia após guia conta errado: ",[20,21,22],"strong",{},"público e listável são duas\nchaves diferentes, e a preocupante não é a que todo mundo manda você virar.","\nTornar um bucket privado fecha a primeira. Pode deixar a segunda escancarada, e\num bucket que nunca foi público na vida pode estar listável hoje à tarde.",[25,26,28],"h2",{"id":27},"um-bucket-público-do-supabase-storage-é-um-problema-de-segurança","Um bucket público do Supabase Storage é um problema de segurança?",[10,30,31],{},"Por si só, não. Significa uma coisa bem específica, e essa coisa é muito\nfrequentemente a que você queria.",[10,33,34],{},"Marcar um bucket como público dá a cada arquivo dentro dele uma URL que funciona\nsem login. É toda a funcionalidade. É assim que o avatar em um comentário carrega\npara quem não tem conta, assim que seu logotipo aparece em um e-mail, assim que\nalguém que ainda está decidindo se cria conta vê a foto de um produto.",[10,36,37],{},"Um bucket público se parece mais com um telefone fora da lista do que com uma\nporta destrancada. A linha atende qualquer um que disque, e não existe catálogo\nonde procurar o número. Se isso está bem depende de uma única pergunta: com que\nfacilidade alguém chegaria a esse número sem que ninguém o entregasse.",[10,39,40],{},"O Supabase cria buckets novos como privados e coloca um aviso ao lado da chave.\nUm bucket público é, portanto, algo que alguém ligou: você, ou seu builder, para\nfazer um recurso de upload funcionar.",[25,42,44],{"id":43},"o-que-a-chave-de-público-realmente-liga","O que a chave de público realmente liga",[10,46,47],{},"Uma linha da tabela abaixo, e nada mais dela.",[49,50,51,67],"table",{},[52,53,54],"thead",{},[55,56,57,61,64],"tr",{},[58,59,60],"th",{},"O que alguém tenta",[58,62,63],{},"Bucket público",[58,65,66],{},"Bucket privado",[68,69,70,82,92,101],"tbody",{},[55,71,72,76,79],{},[73,74,75],"td",{},"Abrir um arquivo cuja URL exata já tem",[73,77,78],{},"Funciona, sem login",[73,80,81],{},"Exige uma política ou link assinado",[55,83,84,87,90],{},[73,85,86],{},"Pedir a lista do conteúdo do bucket",[73,88,89],{},"Só se uma política permitir",[73,91,89],{},[55,93,94,97,99],{},[73,95,96],{},"Enviar um arquivo",[73,98,89],{},[73,100,89],{},[55,102,103,106,108],{},[73,104,105],{},"Apagar ou substituir um arquivo",[73,107,89],{},[73,109,89],{},[10,111,112],{},"A própria página de ajuda do Supabase diz isso com toda a clareza possível: um\nbucket público significa que existe uma URL pública com a qual baixar o arquivo,\ne qualquer outra operação continua tendo de satisfazer as políticas daquele\nbucket.",[10,114,115],{},"Ou seja, a chave é um controle menor do que o nome sugere. Três daquelas quatro\nlinhas são decididas em outro lugar por completo, em Storage → Policies, e a\nmensagem que você recebeu era quase com certeza sobre a segunda.",[117,118],"diagram",{"alt":119,"caption":120,"src":121},"Quatro buckets lado a lado. Cada um tem uma chave de público, desligada ou ligada, e uma caixa de política vazia ou preenchida. Os dois buckets cuja caixa contém uma condição que nomeia apenas o bucket mostram todos os seis arquivos acesos e marcados com um xis, esteja a chave como estiver. Os dois de caixa vazia ou estreita não mostram nada e trazem um visto.","A chave em cima muda uma coisa. A caixa embaixo dela decide se um desconhecido recebe a lista, e faz isso do mesmo jeito quer o bucket seja público ou privado.","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fpublic-and-listable-1600x760.png",[25,123,125],{"id":124},"por-que-um-bucket-privado-ainda-pode-ser-listável","Por que um bucket privado ainda pode ser listável",[10,127,128],{},"Porque quem concede a listagem é uma política de acesso, e a política que quase\ntodo mundo cola concede isso a todos.",[10,130,131,132,136,137,140],{},"Toda leitura do Storage passa por Row Level Security em uma tabela chamada\n",[133,134,135],"code",{},"storage.objects",". Listar um bucket é uma leitura, arquivada sob ",[133,138,139],{},"SELECT",",\nexatamente como baixar um arquivo. O próprio guia rápido do Supabase mostra uma\npolítica com esta forma, de onde as cópias costumam sair:",[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],{},"Leia o que ela diz. Qualquer requisição pode ler qualquer coisa naquele bucket.\nEla não pergunta quem está perguntando, e não pergunta se o arquivo tem alguma\nrelação com quem pede. Ler abrange baixar um arquivo, e abrange entregar a lista\nde arquivos, porque são a mesma permissão usando dois chapéus.",[10,155,156],{},"A chave do próprio bucket nunca entra nisso. Uma política assim em um bucket\nprivado torna o bucket listável, e o painel vai continuar descrevendo-o, com toda\na razão, como privado.",[10,158,159,160,165,166,170],{},"A palavra que causa o estrago é «qualquer». Uma requisição levando a chave\npublicável que viaja dentro do código do seu aplicativo satisfaz aquela política\nsem esforço, e\n",[161,162,164],"a",{"href":163},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","essa chave existe para ser legível por todos",",\nque é precisamente o motivo pelo qual quem deveria estar trabalhando é a\npolítica. É a mesma forma do problema ao lado, onde\n",[161,167,169],{"href":168},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","o Row Level Security está ligado e mesmo assim permite tudo",".",[25,172,174],{"id":173},"o-que-alguém-tira-de-uma-lista-dos-seus-arquivos","O que alguém tira de uma lista dos seus arquivos",[10,176,177],{},"Nomes, principalmente. O que é bem mais do que parece.",[10,179,180,181,184,185,188,189,192],{},"Nomes de arquivo costumam descrever o conteúdo, porque alguém os escolheu\npensando no que havia dentro: ",[133,182,183],{},"fatura-marco-acme.pdf",", ",[133,186,187],{},"passaporte-frente.jpg",",\n",[133,190,191],{},"folha-final-v2.xlsx",". Uma lista desses é um resumo razoável do seu negócio, e o\ntamanho dela diz mais ou menos quantos clientes você tem. Se o bucket também for\npúblico, cada nome dessa lista é um link que funciona.",[10,194,195],{},"De volta ao telefone. Estar fora da lista vale alguma coisa até o dia em que o\ncatálogo sai, e depois disso nunca importou o quanto o número era difícil de\nadivinhar.",[117,197],{"alt":198,"caption":199,"src":200},"Duas metades. À esquerda, uma requisição ao caminho público de objetos alcança um arquivo de oito; os outros sete estão desenhados como contornos tracejados que a requisição nunca encontra. À direita, uma requisição ao caminho de listagem devolve todos os oito como linhas cheias.","Sem listagem, um desconhecido precisa chegar a um nome de arquivo de algum jeito. Com ela, entregam a ele cada nome de arquivo que você tem.","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fguess-or-list-1600x700.png",[10,202,203],{},"O jeito como isso aparece é bem comum. Um documento que pertence a um cliente\nsurge na frente de outro. Alguém repete para você o nome de um arquivo que não\ntinha como conhecer. Uma pasta de uploads é copiada inteira por um rastreador\nautomático que estava lendo todos os projetos Supabase que conseguia encontrar.",[10,205,206,207,170],{},"Nossa varredura gratuita pede uma listagem ao seu Storage usando nada além da\nchave que já está no código do seu aplicativo, e diz quais buckets responderam\ncom conteúdo. Ela lê nomes e nunca baixa um arquivo. Leva cerca de 20 segundos e\nnão pede conta: ",[161,208,210],{"href":209},"\u002F#scan","escaneie seu aplicativo",[25,212,214],{"id":213},"como-saber-em-qual-dos-dois-casos-você-está","Como saber em qual dos dois casos você está",[10,216,217],{},"Duas conferências no painel do Supabase, e a segunda é sobre o que a mensagem\nrealmente tratava.",[10,219,220,223],{},[20,221,222],{},"Storage → Buckets."," Os públicos vêm marcados como públicos. Para cada um,\npergunte se absolutamente todo arquivo ali dentro é algo que você mostraria a um\ndesconhecido. Não a maioria dos arquivos. Todos, incluindo o que cair lá na\nsemana que vem por um recurso que você ainda não construiu.",[10,225,226,229,230,232],{},[20,227,228],{},"Storage → Policies."," Leia cada política ",[133,231,139],{}," que toca o bucket. Uma\ncondição que menciona apenas o nome do bucket deixa qualquer um ler. Uma condição\nque compara o dono do arquivo com quem faz a requisição está fazendo trabalho de\nverdade. Uma lista de políticas vazia em um bucket privado significa que nada é\nlido, o que é restritivo e seguro.",[10,234,235],{},"Se seu aplicativo precisa mostrar um arquivo privado à pessoa certa, a ferramenta\npara isso é um link assinado: seu servidor pede ao Supabase uma URL que funciona\npor um número fixo de minutos e depois para de funcionar. Assim o arquivo segue\nprivado e ainda assim chega à página.",[25,237,239],{"id":238},"quando-público-é-a-resposta-certa","Quando público é a resposta certa",[10,241,242],{},"Mais vezes do que um artigo de segurança costuma admitir, e vale dizer isso.",[10,244,245],{},"Se o arquivo é para todo mundo, público está certo, e contornar isso compra um\naplicativo mais lento e mais código para manter. Avatares, logotipos, imagens de\ncapa, tudo o que um visitante deslogado deve ver: em um bucket público, e pare de\npensar no assunto.",[10,247,248],{},"A única coisa a fazer mesmo ali é deixar a listagem desligada. Um bucket público\ncheio de avatares é um recurso. O mesmo bucket entregando a lista completa de\ntodos que já enviaram um é outra coisa, e você não pediu por ela.",[10,250,251],{},"Se o arquivo pertence a uma pessoa específica, ele vai para um bucket privado com\numa política que confere quem está pedindo, e chega à página por um link\nassinado. O teste é uma pergunta só: para quem é este arquivo? Para todo mundo,\nou para uma conta com nome.",[25,253,255],{"id":254},"o-que-fazer-esta-semana","O que fazer esta semana",[257,258,259],"key-takeaways",{},[260,261,262,266,275,278,281],"ul",{},[263,264,265],"li",{},"Abra Storage → Buckets e anote quais estão públicos. Em cada um, decida se ele guarda arquivos destinados a todos ou arquivos destinados a uma pessoa só.",[263,267,268,269,271,272,274],{},"Leia cada política ",[133,270,139],{}," em ",[133,273,135],{},". Uma condição que nomeia apenas o bucket entrega a lista de arquivos a qualquer um; foi ela que tornou verdadeira a mensagem que você recebeu.",[263,276,277],{},"Mova tudo que pertence a um único usuário para um bucket privado e sirva por links assinados, que expiram sozinhos.",[263,279,280],{},"Pare de nomear arquivos enviados conforme o conteúdo deles. Um identificador aleatório não custa nada e faz uma lista vazada entregar bem menos do que entregaria.",[263,282,283],{},"Faça backup do seu Storage separado do banco de dados. Seus uploads não estão nem no seu código nem nas suas tabelas Postgres, então nada que copie esses dois está copiando seus arquivos.",[10,285,286,287,291,292,296],{},"Abra Storage → Policies no seu projeto e leia o que está lá antes de mexer em uma\núnica chave. Aquela tela é o que decide se a segunda metade da mensagem que você\nrecebeu era verdadeira. A\n",[161,288,290],{"href":289},"\u002Fchecklist","lista de segurança de 10 minutos"," cobre isso junto com o resto do\nque um aplicativo recém-lançado costuma deixar aberto, e se um bucket realmente\nestava legível,\n",[161,293,295],{"href":294},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","o que um desconhecido alcança no seu banco de dados","\né a próxima leitura, já que a política que entrega uma lista de arquivos tem a\nmesma forma da que entrega uma tabela.",{"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},"Noções de segurança","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcover-1200x630.png","Documentos dentro de um contêiner. Uma barra cobre quase toda a abertura e para antes do fim, deixando quatro deles no vão.","Um bucket público do Supabase Storage significa que quem tem a URL de um arquivo pode abri-lo. Não significa que alguém possa listar o que está lá dentro.",false,"md",[315,318,321,324,327],{"q":316,"a":317},"Disseram que meu bucket do Supabase Storage está público. Devo torná-lo privado?","Não antes de saber o que há nele. Buckets públicos existem por um motivo: fotos de perfil, logotipos, imagens de produto e tudo o mais que seu aplicativo mostra a um visitante que não fez login. Para esses arquivos, público é a configuração certa. Para faturas, documentos de identidade, exportações ou qualquer coisa que pertença a uma pessoa específica, é a errada, e o que você quer então é privado mais links assinados. A pergunta nunca foi se público é ruim. É se aqueles arquivos em particular foram feitos para ser vistos por qualquer um que peça.",{"q":319,"a":320},"Qual é a diferença entre um bucket público e um listável?","Público decide se um arquivo abre para quem já tem a URL dele. Listável decide se um desconhecido pode pedir ao seu projeto o conteúdo inteiro de um bucket e receber resposta. Os dois são configurados em lugares diferentes do painel do Supabase, e o segundo é o que transforma um palpite em um índice.",{"q":322,"a":323},"Alguém consegue adivinhar as URLs dos arquivos no meu bucket público?","Depende inteiramente de como seu aplicativo os nomeia. Se ele envia com o nome original, ou com algo organizado como fatura-4.pdf, então sim, e dá pouquíssimo trabalho. Se envia sob um identificador longo e aleatório, adivinhar deixa de ser prático. É exatamente por isso que a listagem pesa tanto: ela remove o passo de adivinhar por completo.",{"q":325,"a":326},"Como impeço que listem meu bucket?","A listagem passa por uma política de Row Level Security na tabela storage.objects, então é ali que se resolve e não no bucket em si. Abra Storage → Policies no painel do Supabase e leia cada política SELECT que toca o bucket. Uma cuja única condição é o nome do bucket deixa qualquer requisição ler aquele bucket, lista de arquivos incluída. Estreite-a para que compare o arquivo com quem está pedindo, ou remova-a e distribua links assinados a partir do seu servidor.",{"q":328,"a":329},"Meu backup do banco de dados cobre os arquivos enviados?","Não. O Storage fica fora do seu banco Postgres, então um backup do banco contém as linhas que apontam para seus arquivos e nenhum dos arquivos. Restaurá-lo devolve uma tabela cheia de links para coisas que não estão mais lá. Seus arquivos enviados precisam ser copiados à parte, e a maioria das pessoas descobre isso no dia em que importa.","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcard-800x500.png",[332,333,334,335,336,337],"bucket do supabase storage público","segurança bucket público supabase","política de acesso supabase storage","listar arquivos bucket supabase","tornar bucket supabase privado","url assinada supabase",{},true,"Um bucket público do Supabase é um problema?","\u002Fblog\u002Fsupabase-storage-bucket-public","2026-08-23",{"title":5,"description":311},"blog\u002Fsupabase-storage-bucket-public",[346,347,348],"Um bucket público do Supabase Storage significa uma coisa só: quem tem a URL de um arquivo pode abri-lo sem fazer login. Não diz nada sobre se essa pessoa consegue ver o que mais está lá dentro.","Quem concede a listagem é uma política de acesso e não a chave de público, então um bucket privado pode ser listável e um público pode não ser.","A listagem é o que precisa ser resolvido hoje, porque poupa um desconhecido do trabalho de adivinhar um único nome de arquivo.","weKYxrk669yjeFdRsqEd72NfCgBLbCkVg1EjHSHkQbg",1787826050878]