TL;DR
Verejný bucket servíruje každý súbor v ňom komukoľvek, kto pozná URL, bez kľúča a bez prihlásenia: vaše politiky storage sa pri sťahovaní nekonzultujú. Na mojom lokálnom stacku vrátil rovnaký testovací súbor 200 s obsahom z verejného bucketu a 400 zo súkromného. Nahrávanie, mazanie a presúvanie stále prechádzajú politikami. Verejné buckety používajte pre súbory, ktoré sú verejné zo svojej podstaty, napríklad avatary a obrázky článkov, a pre všetko ostatné súkromné buckety s podpísanými URL.
Môj bezplatný bezpečnostný checker pre Supabase má dve pravidlá o bucketoch: „Verejné buckety v Storage“ ich vypíše, aby ste si potvrdili, že každý má byť verejný, a „Verejné buckety bez limitov nahrávania“ hlási verejné buckety bez limitu veľkosti alebo typu súboru. Tu je, čo verejný príznak naozaj mení.
Čo v Supabase znamená verejný bucket?
Sprievodca bucketmi od Supabase definuje dva modely prístupu. V súkromnom buckete prechádza každá operácia, vrátane sťahovania, politikami RLS na storage.objects; súbor sa číta s tokenom používateľa alebo s podpísaným URL, ktorého platnosť vyprší. Vo verejnom buckete načítavanie a servírovanie súborov kontrolu prístupu obchádza, takže súbor prečíta ktokoľvek s URL. Kontrola prístupu stále platí pre nahrávanie, mazanie, presúvanie a kopírovanie.
Buckety sú v predvolenom stave súkromné. Verejným sa bucket stane, keď niekto zaškrtne políčko v Dashboarde alebo ho vytvorí s public: true, čo je častá skratka, keď sa nenačíta obrázok.
Čo vrátil ktorý bucket v mojom teste?
Na lokálnom stacku Supabase (CLI 2.109.1) som vytvoril jeden verejný a jeden súkromný bucket, nahral do oboch rovnaký malý textový súbor pomocou secret key a potom si ho vyžiadal bez akéhokoľvek kľúča, ako cudzí človek s odkazom:
Požiadavka na 2026/invoice-001.txt |
Verejný bucket | Súkromný bucket |
|---|---|---|
/storage/v1/object/public/…, bez kľúča |
200, obsah súboru |
400, „Bucket not found“ |
/storage/v1/object/authenticated/…, iba publishable key |
200 |
400 |
Súkromný bucket odpovedá, akoby neexistoval, čo chcete. Verejný vydá súbor každému, kto cestu uhádne alebo nájde.
Prečo na URL tak záleží?
Verejný súbor je tajný iba tak, ako je tajná jeho cesta. Cesty bývajú predvídateľné: id používateľa, dátum, číslo faktúry. Uniknú aj zo zdroja stránky, zo zdieľaných odkazov, z histórie prehliadača a z logov. Faktúra, sken pasu alebo podpísaná zmluva vo verejnom buckete je prakticky zverejnená.
Ako vybrať a opraviť?
- Verejný bucket: súbory pre všetkých, napríklad avatary, fotky produktov a obrázky na blogu. Nastavte na buckete limit veľkosti súboru a povolené typy MIME, aby verejnú cestu na nahrávanie, ktorú vaše politiky povolia, nešlo využiť na hosťovanie čohokoľvek iného.
- Súkromný bucket: dokumenty, exporty, faktúry, čokoľvek osobné. Sťahujte so session používateľa alebo vytvorte podpísané URL s obmedzenou platnosťou.
Prehľad bucketov a ich limitov:
select id, public, file_size_limit, allowed_mime_types
from storage.buckets
order by public desc, id;
Súkromný bucket potrebuje aj politiky na storage.objects, zvyčajne kontrolujúce, že prvý priečinok cesty je id používateľa alebo firmy. Po presune projektu tie politiky spočítajte: pri jednej aplikácii zlyhalo každé nahratie, pretože migrácia politík nikdy nebežala, čo som popísal v checkliste bezpečnosti aplikácie z Lovable. Čo ďalšie dosiahne publishable key, je v článku Supabase anon key vs service role key.