// 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.
- 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.
- 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.
- Omejite dovoljene MIME-tipe za vsako vedro. Seznam dovoljenih MIME-tipov — izrecen seznam dovoljenih, ne blokiranih.
image/jpeg,image/png,image/webpza vedra, ki sprejemajo samo slike. Nikoli ne dovolitetext/html,application/javascriptaliimage/svg+xmlv vedru z uporabniško vsebino — v brskalniku se izvedejo, ko se postrežejo prek podpisanega URL-ja. - 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-uploadsinpublic-assetsje lažje zakleniti kot eno mešano vedro. - 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.
- Potrdite, da je RLS omogočena na storage.objects.
SELECT rowsecurity FROM pg_tables WHERE schemaname = 'storage' AND tablename = 'objects';mora vrnititrue. Supabase jo na novih projektih privzeto omogoči; preverite, da ni bila onemogočena. - 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 zstorage.foldername()izvleči lastnika iz poti. - 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. - 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.
- 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
403ali404, nikoli200.
-- 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.
- MIME-tip na strani strežnika znova preverite iz dejanskih bajtov datoteke, ne iz glave
Content-Type. Uporabite knjižnico, kot jefile-type(Node), ali vohljanje magičnih bajtov. Napadalec lahko trdiContent-Type: image/jpegna datoteki, ki je v resnici poliglotska HTML / JavaScript-tovor. - Iz naloženih slik odstranite metapodatke EXIF. EXIF lahko vsebuje koordinate GPS, serijske številke naprav in časovne žige. Pred shranjevanjem uporabite
sharps.withMetadata(false)aliexif-parser. - Zavrnite SVG-je, ki vsebujejo oznake
scriptali rokovalnikeonload. SVG je XML — in mnogo UI-generiranih aplikacij dovoli nalaganja SVG kot „samo sliko". UporabiteDOMPurifyna strani strežnika ali popolnoma zavrnite nalaganja SVG. - 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.
- 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 je31536000(eno leto) — URL postane trajna pol-javna povezava. - 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.
- 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. - Pri streženju uporabniško naloženih datotek uporabite možnost
downloadAs.createSignedUrl(path, expiresIn, { download: '.jpg' })vsili glavoContent-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.
- Č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.
- 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. - 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.
- FixVibe-pregled zaženite mesečno. Pregled
baas.supabase-storage-publicsondira vedra, ki se odzivajo na anonimneGET+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.
