Přejít na obsah

Supabase veřejný bucket: kdo přečte vaše soubory

Supabase

Zobrazit jako MarkdownOtevřít v ClaudeOtevřít v ChatGPTOtevřít v Perplexity

Otázka se zkopíruje také. Pokud se chat otevře prázdný, vložte ji.

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:

Tentýž soubor, vyžádaný bez klíče. Lokální Supabase Storage, jeden veřejný a jeden soukromý bucket. Veřejný bucket: Požadavek, bez klíče → veřejný bucket → 200, soubor odeslán; Soukromý bucket: Požadavek, bez klíče → soukromý bucket → 400, nenalezeno.
Moje reprodukce na lokálním Supabase, 23. října 2026.
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.

© 2026 Denys Zaichenko. Původní článek: https://madsalt.tech/cs/notes/supabase-public-bucket/