TL;DR
Veřejný bucket servíruje každý soubor v něm komukoli, kdo zná URL, bez klíče a bez přihlášení: vaše politiky storage se při stahování nekonzultují. Na mém lokálním stacku vrátil stejný testovací soubor 200 s obsahem z veřejného bucketu a 400 ze soukromého. Nahrávání, mazání a přesouvání stále procházejí politikami. Veřejné buckety používejte pro soubory, které jsou veřejné ze své podstaty, například avatary a obrázky článků, a pro vše ostatní soukromé buckety s podepsanými URL.
Můj bezplatný bezpečnostní checker pro Supabase má dvě pravidla o bucketech: „Veřejné buckety ve Storage“ je vypíše, abyste si potvrdili, že každý má být veřejný, a „Veřejné buckety bez limitů nahrávání“ hlásí veřejné buckety bez limitu velikosti nebo typu souboru. Tady je, co veřejný příznak doopravdy mění.
Co v Supabase znamená veřejný bucket?
Průvodce buckety od Supabase definuje dva modely přístupu. V soukromém bucketu prochází každá operace, včetně stahování, politikami RLS na storage.objects; soubor se čte s tokenem uživatele nebo s podepsaným URL, jehož platnost vyprší. Ve veřejném bucketu načítání a servírování souborů kontrolu přístupu obchází, takže soubor přečte kdokoli s URL. Kontrola přístupu stále platí pro nahrávání, mazání, přesouvání a kopírování.
Buckety jsou ve výchozím stavu soukromé. Veřejným se bucket stane, když někdo zaškrtne políčko v Dashboardu nebo ho vytvoří s public: true, což je častá zkratka, když se nenačte obrázek.
Co vrátil který bucket v mém testu?
Na lokálním stacku Supabase (CLI 2.109.1) jsem vytvořil jeden veřejný a jeden soukromý bucket, nahrál do obou stejný malý textový soubor pomocí secret key a pak ho vyžádal bez jakéhokoli klíče, jako cizí člověk s odkazem:
Požadavek na 2026/invoice-001.txt |
Veřejný bucket | Soukromý bucket |
|---|---|---|
/storage/v1/object/public/…, bez klíče |
200, obsah souboru |
400, „Bucket not found“ |
/storage/v1/object/authenticated/…, jen publishable key |
200 |
400 |
Soukromý bucket odpovídá, jako by neexistoval, což chcete. Veřejný vydá soubor každému, kdo cestu uhodne nebo najde.
Proč na URL tolik záleží?
Veřejný soubor je tajný jen tak, jak je tajná jeho cesta. Cesty bývají předvídatelné: id uživatele, datum, číslo faktury. Uniknou také ze zdroje stránky, ze sdílených odkazů, z historie prohlížeče a z logů. Faktura, sken pasu nebo podepsaná smlouva ve veřejném bucketu je prakticky zveřejněná.
Jak vybrat a opravit?
- Veřejný bucket: soubory pro každého, například avatary, fotky produktů a obrázky na blogu. Nastavte na bucketu limit velikosti souboru a povolené typy MIME, aby veřejnou cestu pro nahrávání, kterou vaše politiky povolí, nešlo využít k hostování čehokoli jiného.
- Soukromý bucket: dokumenty, exporty, faktury, cokoli osobního. Stahujte se session uživatele nebo vytvořte podepsané URL s omezenou platností.
Přehled bucketů a jejich limitů:
select id, public, file_size_limit, allowed_mime_types
from storage.buckets
order by public desc, id;
Soukromý bucket potřebuje také politiky na storage.objects, obvykle kontrolující, že první složka cesty je id uživatele nebo firmy. Po přesunu projektu ty politiky spočítejte: u jedné aplikace selhalo každé nahrání, protože migrace politik nikdy neproběhla, což jsem popsal v checklistu zabezpečení aplikace z Lovable. Co dalšího dosáhne publishable key, je v článku Supabase anon key vs service role key.