Kort sagt
En publik bucket serverar varje fil i den till alla som har URL:en, utan nyckel och utan inloggning: dina storage-policyer tillfrågas inte vid nedladdning. På min lokala stack gav samma testfil 200 med innehållet från en publik bucket och 400 från en privat. Uppladdning, borttagning och flytt går fortfarande via policyer. Använd publika buckets för filer som är publika till sin natur, som avatarer och artikelbilder, och privata buckets med signerade URL:er för allt annat.
Min gratis Supabase-säkerhetskontroll har två regler om buckets: “Publika storage-buckets” listar dem så att du kan bekräfta att var och en ska vara publik, och “Publika buckets utan uppladdningsgränser” flaggar publika buckets utan gräns för storlek eller filtyp. Här är vad den publika flaggan faktiskt ändrar.
Vad betyder en publik bucket i Supabase?
Supabases guide om buckets definierar två åtkomstmodeller. I en privat bucket går varje operation, nedladdningar inkluderade, via RLS-policyer på storage.objects; en fil läses med användarens token eller en signerad URL som löper ut. I en publik bucket kringgår hämtning och servering av filer åtkomstkontrollen, så alla med URL:en kan läsa filen. Åtkomstkontrollen gäller fortfarande vid uppladdning, borttagning, flytt och kopiering.
Buckets är privata som standard. En bucket blir publik när någon kryssar i rutan i Dashboard eller skapar den med public: true, en vanlig genväg när en bild inte laddas.
Vad gav varje bucket i mitt test?
På en lokal Supabase-stack (CLI 2.109.1) skapade jag en publik och en privat bucket, laddade upp samma lilla textfil till båda med secret key och begärde den sedan utan någon nyckel, som en främling med länken skulle göra:
Förfrågan om 2026/invoice-001.txt |
Publik bucket | Privat bucket |
|---|---|---|
/storage/v1/object/public/…, ingen nyckel |
200, filens innehåll |
400, “Bucket not found” |
/storage/v1/object/authenticated/…, bara publishable key |
200 |
400 |
Den privata bucketen svarar som om den inte fanns, vilket är det du vill ha. Den publika lämnar ut filen till alla som kan gissa eller hitta sökvägen.
Varför spelar URL:en så stor roll?
En publik fil är bara så hemlig som sin sökväg. Sökvägar är ofta förutsägbara: ett användar-id, ett datum, ett fakturanummer. De läcker också via sidkälla, delade länkar, webbläsarhistorik och loggar. En faktura, en passkopia eller ett signerat avtal i en publik bucket är i praktiken publicerat.
Hur väljer och fixar du det?
- Publik bucket: filer avsedda för alla, som avatarer, produktbilder och bloggbilder. Sätt en gräns för filstorlek och tillåtna MIME-typer på bucketen, så att den publika uppladdningsväg som dina policyer tillåter inte kan användas för att hosta något annat.
- Privat bucket: dokument, exporter, fakturor, allt personligt. Ladda ner med användarens session, eller skapa en signerad URL som löper ut.
Så ser du dina buckets och deras gränser:
select id, public, file_size_limit, allowed_mime_types
from storage.buckets
order by public desc, id;
En privat bucket behöver också policyer på storage.objects, oftast med en kontroll att sökvägens första mapp är användarens eller företagets id. Efter att du flyttat ett projekt: räkna dessa policyer. I en app misslyckades varje uppladdning eftersom policy-migreringen aldrig kördes, vilket jag skrev om i min säkerhetschecklista för Lovable-appar. Vad mer publishable key kan nå finns i Supabase anon key vs service role key.