// docs / baas security / supabase storage
Supabase salvestuskonteinerite turvalisuse kontrollnimekiri: 22 punkti
Supabase Storage on õhuke kate S3-ühilduvate konteinerite ümber pluss sama row-level security mudel mis andmebaasis. See tähendab, et samad RLS-i lõksud, mis mõjutavad tabeleid, mõjutavad ka failidele juurdepääsu — ja mõni salvestus-spetsiifiline, mis ilmub, kui AI-koodimistööriistad üleslaadimisi ühendavad. See kontrollnimekiri on 22 punkti viies sektsioonis: konteineri seadistus, RLS-poliitikad, üleslaadimise valideerimine, allkirjastatud URL-id ja operatiivne hügieen. Iga on kontrollitav vähem kui 15 minutiga.
Iga allolev punkt on hädavajalik. Aluseks oleva RLS-mehaanika kohta vaata Supabase RLS-skanner. Salvestuse kõrval oleva võtme-paljastuse klassi kohta vaata Supabase service-role'i võti paljastunud JavaScriptis.
Konteineri seadistus
Alusta õigete vaikeväärtustega. Vääras seadistuses konteiner lekib faile, olenemata sellest, kas su RLS on õige või mitte.
- Sea iga konteiner vaikimisi privaatseks. Supabase Dashboardis → Storage → Buckets, sea Public bucket-lüliti välja, kui sul pole selget põhjust (turundusmaterjalid, avalikud avatarid ilma PII-ta). Avalikud konteinerid mööduvad lugemisoperatsioonidel RLS-ist — kõik, kes teavad konteineri nime, saavad loendada ja alla laadida.
- Sea igale konteinerile kõva faili suuruse limiit. Dashboard → Bucket-seaded → File size limit. 50 MB on mõistlik vaikeväärtus kasutaja üleslaadimistele; tõsta seda teadlikult video / suure faili kasutusjuhtude jaoks. Ilma limiidita võib üksainus pahatahtlik üleslaadimine sinu salvestuskvoodi või kuu ribalaiuse ammendada.
- Piira lubatud MIME-tüübid konteineri kaupa. Lubatud MIME-tüüpide loend — selgesõnaline allowlist, mitte blocklist.
image/jpeg,image/png,image/webpainult pilte sisaldavatele konteineritele. Ära kunagi lubatext/html,application/javascriptvõiimage/svg+xmlkasutajasisu konteineris — need käivituvad brauseris, kui neid serveeritakse allkirjastatud URL-i kaudu. - Kasuta sisutüübi kohta ühte konteinerit, mitte ühte jagatud konteinerit. Konteineripõhised seaded (suurus, MIME-tüübid, RLS-poliitikad) on see granulaarsus, mis sul on. Konteinerid
user-avatars,document-uploadsjapublic-assetson lihtsam lukku panna kui üks segakontener. - Kontrolli CORS-i seadistust, kui esirakendus saadab üles. Kui kasutajad laevad otse brauserist allkirjastatud URL-i, peab konteineri CORS sinu tootmise originit loetlema.
*on vastuvõetav ainult avalikele konteineritele — mitte kunagi kasutaja PII-d sisaldavatele.
RLS-poliitikad tabelis storage.objects
Supabase Storage salvestab faili metaandmed tabelisse storage.objects. RLS sellel tabelil kontrollib, kes saab faile lugeda, üles laadida, uuendada või kustutada. Ilma RLS-ita on konteineri public/private-lipp sinu ainus kaitse.
- Kinnita, et RLS on tabelis storage.objects sees.
SELECT rowsecurity FROM pg_tables WHERE schemaname = 'storage' AND tablename = 'objects';peab tagastamatrue. Supabase lülitab selle uutes projektides vaikimisi sisse; kontrolli, et seda pole välja lülitatud. - Kirjuta SELECT-poliitika, mis on privaatsetele konteineritele piiratud
auth.uid()-iga.CREATE POLICY "users_read_own_files" ON storage.objects FOR SELECT USING (auth.uid()::text = (storage.foldername(name))[1]);. Konventsioon on salvestada failid raja[user-id]/[filename]alla ja kasutada omaniku rajast eraldamiseksstorage.foldername()-i. - Kirjuta INSERT-poliitika, mis sundisb sama raja konventsiooni.
CREATE POLICY "users_upload_own" ON storage.objects FOR INSERT WITH CHECK (auth.uid()::text = (storage.foldername(name))[1]);. Ilma WITH CHECK-ita saab autenditud kasutaja teise kasutaja kausta üles laadida. - Lisa UPDATE- ja DELETE-poliitikad, kui sinu rakendus toetab failimuutmist või -kustutamist. Iga käsk vajab oma poliitikat. DELETE vahelejätmine tähendab, et autenditud kasutajad ei saa oma faile eemaldada; UPDATE vahelejätmine tähendab, et faili ülekirjutused ebaõnnestuvad vaikselt.
- Testi risti-kasutaja juurdepääsu kahes brauseriseansis. Logi sisse kasutajana A, laadi fail üles, kopeeri rada. Logi sisse kasutajana B teises brauseris, proovi failile REST API kaudu juurde pääseda. Vastus peab olema
403või404, mitte kunagi200.
-- 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]);Üleslaadimise valideerimine
Valideeri iga üleslaadimine serveripoolel, isegi kui konteineril on MIME- ja suuruspiirangud. AI-koodimistööriistad tekitavad vaikimisi ainult klientpoolse valideerimise; see ei kaitse millegi eest.
- Kontrolli MIME-tüüpi serveripoolel uuesti faili tegelike baitide järgi, mitte
Content-Type-päise järgi. Kasuta teeki nagufile-type(Node) või magic-baitide nuusutamist. Ründaja võib väitaContent-Type: image/jpegfaili kohta, mis on tegelikult polüglott HTML / JavaScripti koormus. - Eemalda üleslaaditud piltidelt EXIF-metaandmed. EXIF võib sisaldada GPS-koordinaate, seadme seerianumbreid ja ajatempleid. Kasuta enne salvestamist eemaldamiseks
sharp-i koos.withMetadata(false)-iga võiexif-parser-it. - Lükka tagasi SVG-d, mis sisaldavad
script-silte võionload-käsitlejaid. SVG on XML — ja paljud AI-genereeritud rakendused lubavad SVG-üleslaadimisi "lihtsalt pildina". Kasuta serveripoolelDOMPurify-t või keeldu täielikult SVG-üleslaadimistest. - Kasuta deterministlikke, äraarvamatuid failinimesid. Ära säilita algset failinime. Kasuta UUID-d või faili sisu räsi. Algsed failinimed lekivad ("
passport_scan_2024_01_15.jpg") ja ennustatavad nimed võimaldavad loendamist.
Allkirjastatud URL-id
Allkirjastatud URL-id on viis, kuidas kliendid privaatsetele konteineritele juurde pääsevad. Aegumistähtaeg, konteineri ulatus ja see, mida logitakse, on olulised.
- Sea allkirjastatud URL-i vaikeaegumistähtajaks 1 tund või vähem. Supabase JS SDK
createSignedUrl(path, expiresIn)võtab sekundeid. Ära kunagi kasuta väärtusi nagu31536000(üks aasta) — URL-ist saab püsiv pool-avalik link. - Ära kunagi salvesta allkirjastatud URL-e oma andmebaasi. Genereeri värsked iga päringu peale serveripoolel. Salvestatud allkirjastatud URL 1-aastase aegumisega, mis andmebaasi tõmmise kaudu lekib, annab pikaajalise juurdepääsu.
- Logi allkirjastatud URL-ide genereerimist, mitte ainult failide üleslaadimisi. Kui kahtlustad hiljem kompromiteerimist, pead teadma, kes mis URL-i millal genereeris. Logi
auth.uid()+ konteiner + objekti rada + ajatempel. - Kasuta
downloadAs-valikut, kui serveerid kasutaja üleslaaditud faile.createSignedUrl(path, expiresIn, { download: '.jpg' })sunnib pealeContent-Disposition: attachment-päise, nii et fail laaditakse alla, mitte ei renderdata — võidab HTML / SVG / HTML-in-PDF-täitmisklassi.
Operatiivne hügieen
Salvestuse seadistus ajab aja jooksul triivima. Need neli operatiivset punkti hoiavad pinda tihedalt.
- Auditeeri konteinereid kord kvartalis. Dashboard → Storage → Buckets. Kinnita, et public/private-olek ja MIME-tüüpide loendid vastavad sellele, mida rakendus ootab. "Ajutiselt" loodud konteinerid muutuvad püsivaks, kui keegi neid ei eemalda.
- Jälgi anonüümseid loendamisoperatsioone. Salvestuse logid (Dashboard → Logs → Storage) jäädvustavad
LIST-päringuid. Anonüümsete list-päringute hüpe privaatse konteineri vastu tähendab, et keegi sondeerib seda väljast. - Sea ajutiste üleslaadimiste säilituspoliitika. Ajutised konteinerid (pildi eelvaade, mustand-üleslaadimised) peaksid 24–72 tunni järel ajastatud funktsiooni kaudu automaatselt kustutuma. Lõputu säilitamine on kohustus GDPR / CCPA andmete minimeerimise nõuete alusel.
- Käivita FixVibe-skannimine iga kuu. Kontroll
baas.supabase-storage-publicsondeerib konteinereid, mis vastavad anonüümseleGET+LIST-ile. Uusi konteinereid lisandub; vanad muudavad nähtavust — ainult pidev skannimine tabab triivi.
Järgmised sammud
Käivita FixVibe-skannimine oma tootmise URL-i vastu — anonüümsed salvestuse loendamised ilmuvad baas.supabase-storage-public alla. Ühenda see kontrollnimekiri tabelikihi jaoks artikliga Supabase RLS-skanner ja kõrvalseisva võtme-paljastuse jaoks artikliga Supabase service-role'i võti paljastunud JavaScriptis. Salvestuse väärseadistuste kohta teiste BaaS-pakkujate juures vaata BaaS väärseadistuse skanner.
