FixVibe

// 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.

  1. 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ť.
  2. 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.
  3. 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/webp pre koše určené iba na obrázky. Nikdy nepovoľte text/html, application/javascript ani image/svg+xml v koši používateľského obsahu — vykonávajú sa v prehliadači, keď sú podávané cez podpísanú URL.
  4. 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-uploads a kôš public-assets sú jednoduchšie na uzamknutie než jeden zmiešaný kôš.
  5. 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.

  1. 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é.
  2. 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.
  3. 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.
  4. 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ú.
  5. 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ť 403 alebo 404, nikdy nie 200.
sql
-- 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č.

  1. Znova skontrolujte MIME typ na strane servera zo skutočných bajtov súboru, nie z hlavičky Content-Type. Použite knižnicu ako file-type (Node) alebo sniffing magických bajtov. Útočník môže tvrdiť Content-Type: image/jpeg na súbore, ktorý je v skutočnosti polyglot HTML / JavaScript payload.
  2. 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 sharp s .withMetadata(false) alebo exif-parser na ich odstránenie pred uložením.
  3. Odmietnite SVG, ktoré obsahujú tagy script alebo handlery onload. SVG je XML — a mnoho aplikácií generovaných AI povoľuje nahrávanie SVG ako „len obrázku". Použite DOMPurify na strane servera alebo úplne odmietnite nahrávanie SVG.
  4. 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é.

  1. 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 ako 31536000 (jeden rok) — URL sa stane trvalým polo-verejným odkazom.
  2. 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.
  3. 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.
  4. Pri podávaní súborov nahraných používateľmi použite voľbu downloadAs. createSignedUrl(path, expiresIn, { download: '.jpg' }) vynúti hlavičku Content-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ý.

  1. 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.
  2. 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.
  3. 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.
  4. Spúšťajte sken FixVibe mesačne. Kontrola baas.supabase-storage-public sonduje 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.

// naskenujte svoj baas povrch

Nájdite otvorenú tabuľku skôr, ako to urobí niekto iný.

Zadajte produkčnú URL. FixVibe vymenuje poskytovateľov BaaS, s ktorými vaša aplikácia komunikuje, zosníma odtlačky ich verejných koncových bodov a nahlási, čo môže neoverený klient čítať alebo zapisovať. Zadarmo, bez inštalácie, bez karty.

  • Bezplatná úroveň — 3 skeny / mesiac, bez karty pri registrácii.
  • Pasívne snímanie odtlačkov BaaS — bez potreby overenia domény.
  • Supabase, Firebase, Clerk, Auth0, Appwrite a ďalšie.
  • AI návrhy opráv pri každom náleze — vložte späť do Cursor / Claude Code.
Spustiť bezplatný sken BaaS

registrácia nie je potrebná

Kontrolný zoznam zabezpečenia Supabase Storage: 22 položiek — Docs · FixVibe