FixVibe

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

  1. 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.
  2. 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.
  3. Piira lubatud MIME-tüübid konteineri kaupa. Lubatud MIME-tüüpide loend — selgesõnaline allowlist, mitte blocklist. image/jpeg, image/png, image/webp ainult pilte sisaldavatele konteineritele. Ära kunagi luba text/html, application/javascript või image/svg+xml kasutajasisu konteineris — need käivituvad brauseris, kui neid serveeritakse allkirjastatud URL-i kaudu.
  4. 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-uploads ja public-assets on lihtsam lukku panna kui üks segakontener.
  5. 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.

  1. Kinnita, et RLS on tabelis storage.objects sees. SELECT rowsecurity FROM pg_tables WHERE schemaname = 'storage' AND tablename = 'objects'; peab tagastama true. Supabase lülitab selle uutes projektides vaikimisi sisse; kontrolli, et seda pole välja lülitatud.
  2. 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 eraldamiseks storage.foldername()-i.
  3. 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.
  4. 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.
  5. 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 403 või 404, mitte kunagi 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]);

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

  1. Kontrolli MIME-tüüpi serveripoolel uuesti faili tegelike baitide järgi, mitte Content-Type-päise järgi. Kasuta teeki nagu file-type (Node) või magic-baitide nuusutamist. Ründaja võib väita Content-Type: image/jpeg faili kohta, mis on tegelikult polüglott HTML / JavaScripti koormus.
  2. 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õi exif-parser-it.
  3. Lükka tagasi SVG-d, mis sisaldavad script-silte või onload-käsitlejaid. SVG on XML — ja paljud AI-genereeritud rakendused lubavad SVG-üleslaadimisi "lihtsalt pildina". Kasuta serveripoolel DOMPurify-t või keeldu täielikult SVG-üleslaadimistest.
  4. 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.

  1. 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 nagu 31536000 (üks aasta) — URL-ist saab püsiv pool-avalik link.
  2. Ä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.
  3. 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.
  4. Kasuta downloadAs-valikut, kui serveerid kasutaja üleslaaditud faile. createSignedUrl(path, expiresIn, { download: '.jpg' }) sunnib peale Content-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.

  1. 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.
  2. 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.
  3. 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.
  4. Käivita FixVibe-skannimine iga kuu. Kontroll baas.supabase-storage-public sondeerib konteinereid, mis vastavad anonüümsele GET + 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.

// skanni oma baas-pinda

Leia avatud tabel enne, kui keegi teine seda teeb.

Anna ette tootmise URL. FixVibe loendab BaaS-pakkujad, kellega sinu rakendus suhtleb, võtab nende avalikest otspunktidest sõrmejäljed ja teatab, mida autentimata klient lugeda või kirjutada saab. Tasuta, paigaldust ei vaja, kaarti ei vaja.

  • Tasuta tase — 3 skannimist kuus, registreerimiseks kaarti ei vaja.
  • Passiivne BaaS-sõrmejäljevõtmine — domeeni kinnitamist ei vaja.
  • Supabase, Firebase, Clerk, Auth0, Appwrite ja palju muud.
  • AI-paranduskäskluse leid igale leiule — kleebi tagasi Cursor / Claude Code'i.
Käivita tasuta BaaS-skannimine

registreerimist ei nõuta

Supabase salvestuskonteinerite turvalisuse kontrollnimekiri: 22 punkti — Docs · FixVibe