FixVibe

// docs / baas security / supabase storage

Kontrolni seznam za varnost vedra Supabase Storage: 22 točk

Supabase Storage je tanek ovoj okoli vedra, združljivega s S3, plus isti model varnosti na ravni vrstic kot baza podatkov. To pomeni, da iste RLS-pasti, ki prizadenejo tabele, prizadenejo tudi dostop do datotek — in nekaj pasti, specifičnih za shrambo, ki se pojavijo, ko UI-orodja postavijo nalaganje. Ta kontrolni seznam je 22 točk v petih razdelkih: konfiguracija vedra, RLS-politike, preverjanje nalaganja, podpisani URL-ji in operativna higiena. Vsak je preverljiv v manj kot 15 minutah.

Vsak element spodaj je bistven. Za osnovno mehaniko RLS glejte Skener Supabase RLS. Za razred razkritja ključev, sosednji shrambi, glejte Supabase service-role ključ izpostavljen v JavaScriptu.

Konfiguracija vedra

Začnite s pravimi privzetimi nastavitvami. Napačno konfigurirano vedro odteka datoteke ne glede na to, ali je vaša RLS pravilna.

  1. Vsako vedro privzeto nastavite na zasebno. V nadzorni plošči Supabase → Storage → Buckets nastavite stikalo Public bucket na izklopljeno, razen če imate izrecen razlog (marketinški viri, javne podobe profila brez PII). Javna vedra za bralne operacije obidejo RLS — vsak z imenom vedra lahko izpiše seznam in prenese vsebino.
  2. Nastavite trdo omejitev velikosti datoteke za vsako vedro. Dashboard → Bucket settings → File size limit. 50 MB je smiselna privzeta vrednost za uporabniška nalaganja; namensko jo povečajte za primere z videom / velikimi datotekami. Brez omejitve lahko eno samo zlonamerno nalaganje izčrpa vašo shrambo ali mesečno pasovno širino.
  3. Omejite dovoljene MIME-tipe za vsako vedro. Seznam dovoljenih MIME-tipov — izrecen seznam dovoljenih, ne blokiranih. image/jpeg, image/png, image/webp za vedra, ki sprejemajo samo slike. Nikoli ne dovolite text/html, application/javascript ali image/svg+xml v vedru z uporabniško vsebino — v brskalniku se izvedejo, ko se postrežejo prek podpisanega URL-ja.
  4. Uporabite eno vedro na tip vsebine, ne enega skupnega vedra. Nastavitve per vedro (velikost, MIME-tipi, RLS-politike) so vsa granulnost, ki jo imate. Vedra user-avatars, document-uploads in public-assets je lažje zakleniti kot eno mešano vedro.
  5. Preverite konfiguracijo CORS, če frontend nalaga. Če uporabniki nalagajo neposredno iz brskalnika na podpisan URL, mora CORS vedra navajati vaš produkcijski izvor. * je sprejemljiv samo za javna vedra — nikoli za vedra z uporabniškim PII.

RLS-politike na storage.objects

Supabase Storage hrani metapodatke datotek v tabeli storage.objects. RLS na tej tabeli nadzira, kdo lahko bere, nalaga, posodablja ali briše datoteke. Brez RLS je javno/zasebno stikalo vedra vaša edina zaščita.

  1. Potrdite, da je RLS omogočena na storage.objects. SELECT rowsecurity FROM pg_tables WHERE schemaname = 'storage' AND tablename = 'objects'; mora vrniti true. Supabase jo na novih projektih privzeto omogoči; preverite, da ni bila onemogočena.
  2. Napišite SELECT-politiko, omejeno na auth.uid() za zasebna vedra. CREATE POLICY "users_read_own_files" ON storage.objects FOR SELECT USING (auth.uid()::text = (storage.foldername(name))[1]);. Konvencija je hraniti datoteke pod [user-id]/[filename] in z storage.foldername() izvleči lastnika iz poti.
  3. Napišite INSERT-politiko, ki uveljavlja isto konvencijo poti. CREATE POLICY "users_upload_own" ON storage.objects FOR INSERT WITH CHECK (auth.uid()::text = (storage.foldername(name))[1]);. Brez WITH CHECK lahko avtenticiran uporabnik nalaga v mapo drugega uporabnika.
  4. Dodajte UPDATE- in DELETE-politiki, če vaša aplikacija podpira urejanje ali brisanje datotek. Vsak ukaz potrebuje svojo politiko. Izpustitev DELETE pomeni, da avtenticirani uporabniki ne morejo odstraniti svojih datotek; izpustitev UPDATE pomeni, da prepisi datotek tiho ne uspejo.
  5. Preizkusite navzkrižno-uporabniški dostop v dveh brskalniških sejah. Prijavite se kot uporabnik A, naložite datoteko, kopirajte pot. Prijavite se kot uporabnik B v drugem brskalniku, poskusite datoteko pridobiti prek REST-API-ja. Odziv mora biti 403 ali 404, nikoli 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]);

Preverjanje nalaganja

Vsako nalaganje preverite na strani strežnika, tudi kadar ima vedro omejitve MIME in velikosti. UI-orodja privzeto generirajo le odjemalsko preverjanje; to ne ščiti ničesar.

  1. MIME-tip na strani strežnika znova preverite iz dejanskih bajtov datoteke, ne iz glave Content-Type. Uporabite knjižnico, kot je file-type (Node), ali vohljanje magičnih bajtov. Napadalec lahko trdi Content-Type: image/jpeg na datoteki, ki je v resnici poliglotska HTML / JavaScript-tovor.
  2. Iz naloženih slik odstranite metapodatke EXIF. EXIF lahko vsebuje koordinate GPS, serijske številke naprav in časovne žige. Pred shranjevanjem uporabite sharp s .withMetadata(false) ali exif-parser.
  3. Zavrnite SVG-je, ki vsebujejo oznake script ali rokovalnike onload. SVG je XML — in mnogo UI-generiranih aplikacij dovoli nalaganja SVG kot „samo sliko". Uporabite DOMPurify na strani strežnika ali popolnoma zavrnite nalaganja SVG.
  4. Uporabite deterministična, neugibljiva imena datotek. Ne ohranjajte izvirnega imena datoteke. Uporabite UUID ali zgoščevalec vsebine datoteke. Izvirna imena ("passport_scan_2024_01_15.jpg") odtekajo informacije, predvidljiva imena pa omogočajo naštevanje.

Podpisani URL-ji

Podpisani URL-ji so način, kako odjemalci dostopajo do zasebnih veder. Pomembni so čas veljavnosti, obseg vedra in to, kar se zabeleži.

  1. Privzeto nastavite veljavnost podpisanega URL-ja na 1 uro ali manj. createSignedUrl(path, expiresIn) v Supabase JS SDK sprejema sekunde. Nikoli ne uporabljajte vrednosti, kot je 31536000 (eno leto) — URL postane trajna pol-javna povezava.
  2. Podpisanih URL-jev nikoli ne hranite v svoji bazi podatkov. Generirajte sveže na strani strežnika pri vsaki zahtevi. Shranjen podpisan URL z 1-letno veljavnostjo, ki odteče prek izvoza baze podatkov, podeli dolgoročen dostop.
  3. Beležite generiranje podpisanih URL-jev, ne le nalaganja datotek. Če pozneje sumite kompromis, morate vedeti, kdo je generiral kateri URL kdaj. Beležite auth.uid() + vedro + pot objekta + časovni žig.
  4. Pri streženju uporabniško naloženih datotek uporabite možnost downloadAs. createSignedUrl(path, expiresIn, { download: '.jpg' }) vsili glavo Content-Disposition: attachment, tako da se datoteka prenese namesto izrisa — premaga razred izvajanja HTML / SVG / HTML-v-PDF.

Operativna higiena

Konfiguracija shrambe se sčasoma premakne. Te štiri operativne točke ohranjajo površino tesno.

  1. Četrtletno preglejte vedra. Dashboard → Storage → Buckets. Potrdite javno/zasebno stanje in sezname MIME-tipov, da se ujemajo s pričakovanji aplikacije. Vedra, ustvarjena „začasno", postanejo trajna, če jih nihče ne odstrani.
  2. Spremljajte anonimne operacije listanja. Dnevniki shrambe (Dashboard → Logs → Storage) beležijo zahteve LIST. Skok anonimnih zahtev za listanje proti zasebnemu vedru pomeni, da ga nekdo od zunaj sondira.
  3. Nastavite politiko hrambe za začasna nalaganja. Začasna vedra (predogled slik, osnutki nalaganj) bi se morala samodejno izbrisati po 24–72 urah prek načrtovane funkcije. Nedoločena hramba je odgovornost po GDPR / CCPA-obveznostih minimizacije podatkov.
  4. FixVibe-pregled zaženite mesečno. Pregled baas.supabase-storage-public sondira vedra, ki se odzivajo na anonimne GET + LIST. Nova vedra se dodajo; stara spreminjajo vidnost — samo neprekinjeno skeniranje ujame premik.

Naslednji koraki

Zaženite FixVibe-pregled proti svojemu produkcijskemu URL-ju — anonimna izpisovanja shrambe se pojavijo pod baas.supabase-storage-public. Ta kontrolni seznam združite s Skenerjem Supabase RLS za plast tabel in Supabase service-role ključ izpostavljen v JavaScriptu za sosednji razred razkritja ključa. Za napačne konfiguracije shrambe pri drugih BaaS-ponudnikih glejte Skener napačnih konfiguracij BaaS.

// preglejte svojo baas-površino

Najdite odprto tabelo, preden jo kdo drug.

Vnesite produkcijski URL. FixVibe ugotovi, s katerimi BaaS-ponudniki vaša aplikacija govori, prepozna njihove javne končne točke in poroča, kaj lahko nepristni odjemalec prebere ali zapiše. Brezplačno, brez namestitve, brez kartice.

  • Brezplačni paket — 3 skeniranja na mesec, brez kartice ob prijavi.
  • Pasivno prstno odtisovanje BaaS — preverjanje lastništva domene ni potrebno.
  • Supabase, Firebase, Clerk, Auth0, Appwrite in več.
  • Pozivi za UI-popravke pri vsakem najdenem problemu — prilepite nazaj v Cursor / Claude Code.
Kontrolni seznam za varnost vedra Supabase Storage: 22 točk — Docs · FixVibe