// docs / baas security / supabase storage
Kontrolný zoznam zabezpečenia Supabase Storage: 22 položiek
Supabase Storage je tenký obal okolo koša kompatibilného s S3 plus rovnaký Row-Level Security model ako databáza. To znamená, že rovnaké úskalia RLS, ktoré ovplyvňujú tabuľky, ovplyvňujú prístup k súborom — plus niekoľko ďalších špecifických pre úložisko, ktoré sa objavujú, keď nástroje na kódovanie s AI zapájajú nahrávanie. Tento kontrolný zoznam má 22 položiek v piatich sekciách: konfigurácia koša, RLS politiky, validácia nahrávania, podpísané URL a operatívna hygiena. Každú možno overiť za menej než 15 minút.
Každá položka nižšie je nevyhnutná. Pre podkladovú mechaniku RLS si pozrite Skener Supabase RLS. Pre triedu odhalenia kľúčov susediacu s úložiskom si pozrite Kľúč servisnej role Supabase odhalený v JavaScripte.
Konfigurácia koša
Začnite správnymi predvolenými hodnotami. Chybne nakonfigurovaný kôš nechá uniknúť súbory bez ohľadu na to, či je vaše RLS správne alebo nie.
- Každý kôš predvolene nastavte ako privátny. V Supabase Dashboarde → Storage → Buckets nastavte prepínač Public bucket na vypnutý, pokiaľ nemáte explicitný dôvod (marketingové aktíva, verejné avatary bez PII). Verejné koše obchádzajú RLS pre operácie čítania — ktokoľvek s názvom koša môže vypisovať a sťahovať.
- Nastavte tvrdý limit veľkosti súborov na každom koši. Dashboard → Bucket settings → File size limit. 50 MB je rozumné predvolené nastavenie pre používateľské nahrávanie; pre video / použitie s veľkými súbormi ho zvýšte zámerne. Bez limitu môže jedno škodlivé nahranie vyčerpať vašu úložnú kvótu alebo mesačnú šírku pásma.
- Obmedzte povolené MIME typy podľa koša. Zoznam povolených MIME typov — explicitný zoznam povolených, nie zoznam zakázaných.
image/jpeg,image/png,image/webppre koše určené iba na obrázky. Nikdy nepovoľtetext/html,application/javascriptaniimage/svg+xmlv koši používateľského obsahu — vykonávajú sa v prehliadači, keď sú podávané cez podpísanú URL. - Použite jeden kôš na jeden typ obsahu, nie jeden zdieľaný kôš. Nastavenia per-kôš (veľkosť, MIME typy, RLS politiky) sú granularita, ktorú máte. Kôš
user-avatars, kôšdocument-uploadsa kôšpublic-assetssú jednoduchšie na uzamknutie než jeden zmiešaný kôš. - Overte konfiguráciu CORS, ak frontend nahráva. Ak používatelia nahrávajú priamo z prehliadača na podpísanú URL, CORS koša musí uvádzať vašu produkčnú origin.
*je prijateľné iba pre verejné koše — nikdy nie pre koše obsahujúce používateľské PII.
RLS politiky na storage.objects
Supabase Storage ukladá metadáta súborov v tabuľke storage.objects. RLS na tejto tabuľke kontroluje, kto môže čítať, nahrávať, aktualizovať alebo mazať súbory. Bez RLS je vaša jediná ochrana príznak verejnosti/privátnosti koša.
- Potvrďte, že RLS je zapnuté na storage.objects.
SELECT rowsecurity FROM pg_tables WHERE schemaname = 'storage' AND tablename = 'objects';musí vrátiťtrue. Supabase ho v nových projektoch zapína predvolene; overte, že nebolo vypnuté. - Napíšte SELECT politiku obmedzenú na
auth.uid()pre privátne koše.CREATE POLICY "users_read_own_files" ON storage.objects FOR SELECT USING (auth.uid()::text = (storage.foldername(name))[1]);. Konvencia je ukladať súbory pod[user-id]/[filename]a použiťstorage.foldername()na extrakciu vlastníka z cesty. - Napíšte INSERT politiku, ktorá vynucuje rovnakú konvenciu cesty.
CREATE POLICY "users_upload_own" ON storage.objects FOR INSERT WITH CHECK (auth.uid()::text = (storage.foldername(name))[1]);. Bez WITH CHECK môže overený používateľ nahrávať do priečinka iného používateľa. - Pridajte UPDATE a DELETE politiky, ak vaša aplikácia podporuje úpravy alebo mazanie súborov. Každý príkaz potrebuje svoju vlastnú politiku. Vynechanie DELETE znamená, že overení používatelia nemôžu odstrániť svoje vlastné súbory; vynechanie UPDATE znamená, že prepisovania súborov potichu zlyhajú.
- Otestujte krížový prístup medzi používateľmi v dvoch reláciách prehliadača. Prihláste sa ako Používateľ A, nahrajte súbor, skopírujte cestu. Prihláste sa ako Používateľ B v inom prehliadači, skúste načítať súbor cez REST API. Odpoveď musí byť
403alebo404, nikdy nie200.
-- Confirm RLS on storage.objects
SELECT rowsecurity
FROM pg_tables
WHERE schemaname = 'storage' AND tablename = 'objects';
-- SELECT policy: scope reads to the owning user's folder.
CREATE POLICY "users_read_own_files"
ON storage.objects
FOR SELECT
USING (auth.uid()::text = (storage.foldername(name))[1]);
-- INSERT policy: enforce the [user-id]/[filename] path convention.
CREATE POLICY "users_upload_own"
ON storage.objects
FOR INSERT
WITH CHECK (auth.uid()::text = (storage.foldername(name))[1]);Validácia nahrávania
Validujte každé nahrávanie na strane servera, aj keď má kôš obmedzenia na MIME a veľkosť. AI nástroje na kódovanie predvolene generujú iba klientsku validáciu; tá nechráni nič.
- Znova skontrolujte MIME typ na strane servera zo skutočných bajtov súboru, nie z hlavičky
Content-Type. Použite knižnicu akofile-type(Node) alebo sniffing magických bajtov. Útočník môže tvrdiťContent-Type: image/jpegna súbore, ktorý je v skutočnosti polyglot HTML / JavaScript payload. - Odstráňte EXIF metadáta z nahraných obrázkov. EXIF môže obsahovať GPS súradnice, sériové čísla zariadení a časové pečiatky. Použite
sharps.withMetadata(false)aleboexif-parserna ich odstránenie pred uložením. - Odmietnite SVG, ktoré obsahujú tagy
scriptalebo handleryonload. SVG je XML — a mnoho aplikácií generovaných AI povoľuje nahrávanie SVG ako „len obrázku". PoužiteDOMPurifyna strane servera alebo úplne odmietnite nahrávanie SVG. - Použite deterministické, nezhádnuteľné názvy súborov. Nezachovávajte pôvodný názov súboru. Použite UUID alebo hash obsahu súboru. Pôvodné názvy súborov nechávajú uniknúť informácie („
passport_scan_2024_01_15.jpg") a predvídateľné názvy umožňujú vymenovanie.
Podpísané URL
Podpísané URL sú spôsob, akým klienti pristupujú k privátnym košom. Doba platnosti, rozsah koša a to, čo sa loguje, sú dôležité.
- Predvolenú dobu platnosti podpísanej URL nastavte na 1 hodinu alebo menej.
createSignedUrl(path, expiresIn)v Supabase JS SDK berie sekundy. Nikdy nepoužívajte hodnoty ako31536000(jeden rok) — URL sa stane trvalým polo-verejným odkazom. - Nikdy neukladajte podpísané URL vo vašej databáze. Generujte nové na strane servera pri každej požiadavke. Uložená podpísaná URL s ročnou platnosťou, ktorá unikne cez databázový dump, udeľuje dlhodobý prístup.
- Logujte generovanie podpísaných URL, nielen nahrávanie súborov. Ak neskôr podozrievate kompromitáciu, potrebujete vedieť, kto kedy vygeneroval ktorú URL. Logujte
auth.uid()+ kôš + cestu objektu + časovú pečiatku. - Pri podávaní súborov nahraných používateľmi použite voľbu
downloadAs.createSignedUrl(path, expiresIn, { download: '.jpg' })vynúti hlavičkuContent-Disposition: attachment, takže sa súbor stiahne namiesto vykreslenia — porazí triedu vykonávania HTML / SVG / HTML-v-PDF.
Operatívna hygiena
Konfigurácia úložiska sa časom posúva. Tieto štyri operatívne položky udržujú povrch napnutý.
- Auditujte koše štvrťročne. Dashboard → Storage → Buckets. Potvrďte, že stav verejné/privátne a zoznamy MIME typov zodpovedajú tomu, čo aplikácia očakáva. Koše vytvorené „dočasne" sa stávajú trvalými, ak ich nikto neodstráni.
- Monitorujte anonymné operácie LIST. Logy úložiska (Dashboard → Logs → Storage) zaznamenávajú požiadavky
LIST. Skok v anonymných LIST požiadavkách proti privátnemu košu znamená, že ho niekto sonduje zvonku. - Nastavte politiku zachovania pre efemérne nahrávania. Dočasné koše (náhľad obrázkov, koncepty nahrávania) by sa mali automaticky vymazávať po 24-72 hodinách cez naplánovanú funkciu. Nedefinované zachovávanie je zodpovednosťou podľa povinností minimalizácie dát GDPR / CCPA.
- Spúšťajte sken FixVibe mesačne. Kontrola
baas.supabase-storage-publicsonduje koše, ktoré odpovedajú na anonymnýGET+LIST. Pribúdajú nové koše; staré menia viditeľnosť — iba kontinuálne skenovanie zachytí drift.
Ďalšie kroky
Spustite sken FixVibe proti vašej produkčnej URL — anonymné výpisy úložiska sa zobrazia pod baas.supabase-storage-public. Spárujte tento kontrolný zoznam s Skenerom Supabase RLS pre tabuľkovú vrstvu a Kľúčom servisnej role Supabase odhaleným v JavaScripte pre susedstvo odhalenia kľúčov. Pre chybné konfigurácie úložiska naprieč ďalšími BaaS poskytovateľmi si pozrite Skener chybnej konfigurácie BaaS.
