FixVibe

// docs / baas security / supabase storage

Lista di cuntrollu di sicurezza di bucket Supabase Storage: 22 elementi

Supabase Storage hè un involucru sutile attornu à un bucket S3-cumpatibile più listessu mudellu di sicurezza à livellu di riga di a basa di dati. Ciò significheghja chì listesse trappule RLS chì colpiscenu e tabelle colpiscenu l'accessu à i schedarii — è qualche una specifica à u storage chì apparisce quandu l'attrezzi di codifica IA cullegheghjanu l'upload. Sta lista di cuntrollu hè 22 elementi trà cinque sezzioni: cunfigurazione di bucket, pulitiche RLS, validazione di upload, URL firmate, è igiena uperativa. Ognuna hè verificabile in menu di 15 minuti.

Ognunu di l'elementi sottu hè essenziale. Per i meccanismi RLS sutto, vedi Scanner RLS Supabase. Per a classa di esposizione di chjave vicinu à u storage, vedi Chjave di service-role Supabase esposta in JavaScript.

Cunfigurazione di bucket

Principia cù i ghjusti difetti. Un bucket mal cunfiguratu perde schedarii s'è u to RLS hè currettu o nò.

  1. Mette ogni bucket per difettu à privatu. In u Supabase Dashboard → Storage → Buckets, mette u toggle Public bucket in spentu salvu s'è hai una ragione esplicita (assi di marketing, avatar publichi senza PII). I bucket publichi passanu sopra à RLS per l'operazioni di lettura — chìunque abbia u nome di u bucket pò listà è scaricà.
  2. Mette un limitu duru di tagliu di schedariu nantu à ogni bucket. Dashboard → Bucket settings → File size limit. 50 MB hè un difettu raghjunevule per upload d'utenti; alzalu deliberatamente per casi d'usu video / schedariu maiò. Senza un limitu, un sulu upload maliziosu pò esaurà a to quota di storage o a to larghezza di banda mensuale.
  3. Ristringhji i tippi MIME permessi per bucket. Lista di tippi MIME permessi — lista esplicita d'auturizati, micca lista di bluccati. image/jpeg, image/png, image/webp per bucket di solu imagine. Mai permette text/html, application/javascript, o image/svg+xml in un bucket di cuntenutu d'utente — eseguiscenu in u navigatore quandu servuti via URL firmata.
  4. Adopra un bucket per tipu di cuntenutu, micca un bucket spartitu. I paràmetri per bucket (tagliu, tippi MIME, pulitiche RLS) sò a granularità chì hai. Un bucket user-avatars, un bucket document-uploads, è un bucket public-assets sò più faciuli di chjude chè un bucket mistu.
  5. Verifica a cunfigurazione CORS s'è upload da u frontend. S'è l'utenti caricanu direttamente da u navigatore à una URL firmata, u CORS di u bucket deve listà a to urigine di produzzione. * hè accettabile solu per bucket publichi — mai per bucket cuntenenu PII d'utente.

Pulitiche RLS nantu à storage.objects

Supabase Storage tene i metadata di schedarii in a tabella storage.objects. RLS in quella tabella cuntrolla chì pò leghje, caricà, aghjurnà, o sguassà schedarii. Senza RLS, a bandera publica/privata di u bucket hè a to sola prutezzione.

  1. Cunferma chì RLS hè attivatu nantu à storage.objects. SELECT rowsecurity FROM pg_tables WHERE schemaname = 'storage' AND tablename = 'objects'; deve tornà true. Supabase l'attiva per difettu nantu à i novi prughjetti; verifica ch'ellu ùn hè statu disattivatu.
  2. Scrivi una pulitica SELECT limitata à auth.uid() per bucket privati. CREATE POLICY "users_read_own_files" ON storage.objects FOR SELECT USING (auth.uid()::text = (storage.foldername(name))[1]);. A cunvenzione hè di tene i schedarii sottu à [user-id]/[filename] è aduprà storage.foldername() per estrae u patrone da u percorsu.
  3. Scrivi una pulitica INSERT chì impone listessa cunvenzione di percorsu. CREATE POLICY "users_upload_own" ON storage.objects FOR INSERT WITH CHECK (auth.uid()::text = (storage.foldername(name))[1]);. Senza WITH CHECK, un utente autenticatu pò caricà in u cartulare di un altru utente.
  4. Aghjusta pulitiche UPDATE è DELETE s'è a to app sustene mudificazioni o sguassature di schedarii. Ogni cumandu hà bisognu di a so propria pulitica. Saltà DELETE significheghja chì l'utenti autenticati ùn ponu cacciassi i so schedarii; saltà UPDATE significheghja chì e suvrascritture di schedarii fallenu in silenziu.
  5. Pruva l'accessu cross-utente in duie sessioni di navigatore. Iscriviti cum'è Utente A, carca un schedariu, copia u percorsu. Iscriviti cum'è Utente B in un altru navigatore, prova à pigghjà u schedariu via l'API REST. A risposta deve esse 403 o 404, mai 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]);

Validazione di upload

Valideghja ogni upload latu servitore, ancu quandu u bucket hà custrenze MIME è di tagliu. L'attrezzi di codifica IA generanu validazione solu lato cliente per difettu; ciò ùn prutege nunda.

  1. Ricuntrolla u tippu MIME latu servitore da i byte effettivi di u schedariu, micca da l'header Content-Type. Adopra una bibliuteca cum'è file-type (Node) o magic-byte sniffing. Un attaccante pò pretende Content-Type: image/jpeg nantu à un schedariu chì hè in realità un payload polyglot HTML / JavaScript.
  2. Caccia i metadata EXIF da l'imagine caricate. EXIF pò cuntene coordinate GPS, numeri di seriale di dispusitivu, è timestamp. Adopra sharp.withMetadata(false) o exif-parser per cacciallu prima di a memorizazione.
  3. Ricusa SVG chì cuntenenu tag script o handler onload. SVG hè XML — è parechje app generate da IA permettenu upload SVG cum'è "sulu una imagine." Adopra DOMPurify latu servitore o rifiuta uploadi SVG interamente.
  4. Adopra nomi di schedariu deterministichi è imprevedibili. Ùn preservà micca u nome di schedariu originale. Adopra un UUID o un hash di u cuntenutu di u schedariu. I nomi di schedariu originali perdenu ("passport_scan_2024_01_15.jpg") è nomi prevedibili permettenu l'enumerazione.

URL firmate

L'URL firmate sò cumu i clienti accedenu à i bucket privati. A scadenza, l'estensione di u bucket, è ciò chì hè registratu impurtanu.

  1. Mette a scadenza di l'URL firmate per difettu à 1 ora o menu. A funzione createSignedUrl(path, expiresIn) di l'SDK JS Supabase piglia secondi. Mai aduprà valori cum'è 31536000 (un annu) — l'URL diventa un ligame semi-publicu permanente.
  2. Mai stuccà URL firmate in a to basa di dati. Genereghja ne di fresche latu servitore in ogni richiesta. Una URL firmata stuccata cù una scadenza d'un annu chì perde via un dump di basa di dati cuncede accessu à longu termine.
  3. Loga a generazione di URL firmate, micca solu l'upload di schedarii. S'è suspetti un cumprumissu più tardi, hai bisognu di sapè quale hà generatu quale URL quandu. Loga auth.uid() + bucket + percorsu d'ughjettu + timestamp.
  4. Adopra l'opzione downloadAs quandu servi schedarii caricati da l'utente. createSignedUrl(path, expiresIn, { download: '.jpg' }) furza un header Content-Disposition: attachment cusì u schedariu si scarica invece di esse resu — sconfigge a classa d'esecuzione HTML / SVG / HTML-in-PDF.

Igiena uperativa

A cunfigurazione di u storage deriva cù u tempu. Quessi quattru elementi uperativi tenenu a superficia stretta.

  1. Auditeghja i bucket trimestralmente. Dashboard → Storage → Buckets. Cunferma u statu publicu/privatu è e liste di tippi MIME currispondenu à ciò chì l'app si aspetta. I bucket creati "temporaneamente" diventanu permanenti s'è nimu i caccia.
  2. Monitora l'operazioni di lista anonime. I log di storage (Dashboard → Logs → Storage) registranu e richieste LIST. Un picchju di richieste di lista anonime contru à un bucket privatu significheghja chì qualchunu u stà sundendu da l'esternu.
  3. Mette una pulitica di rittenzione per upload effemeri. Bucket temporanei (anteprima d'imagine, upload di bozza) duveranu sguassà si in modu automaticu dopu 24-72 ore via una funzione pianata. Rittenzione indefinita hè una rispunsabilità sottu à l'obbligazioni di minimisazione di dati GDPR / CCPA.
  4. Lampa una scansione FixVibe mensilmente. U check baas.supabase-storage-public sonda per bucket chì rispondenu à GET + LIST anonimi. Novi bucket sò aghjunti; vechji bucket cambianu visibilità — solu a scansione cuntinua piglia u driftu.

Prussimi passi

Lampa una scansione FixVibe contru à u to URL di produzzione — i listing anonimi di storage appariscenu sottu à baas.supabase-storage-public. Accuppia sta lista di cuntrollu cù Scanner RLS Supabase per u stratu di tabella è Chjave di service-role Supabase esposta in JavaScript per l'adiacenza di esposizione di chjave. Per i sbagli di cunfigurazione di storage trà altri fornitori BaaS, vedi Scanner di sbagli di cunfigurazione BaaS.

// scansiona a to superficia baas

Trova a tabella aperta prima chì qualcunu altru a faci.

Inserisci un URL di produzzione. FixVibe enumera i fornitori BaaS cù chì parla a to app, identifica i so endpoint pubblichi è riporta ciò chì un cliente micca autenticatu pò leghje o scrive. Gratisi, senza installazione, senza carta.

  • Pianu gratisi — 3 scansioni / mese, senza carta d'iscrizzione.
  • Fingerprinting BaaS passivu — nessuna verifica di duminiu richiesta.
  • Supabase, Firebase, Clerk, Auth0, Appwrite, è altri.
  • Suggerimenti di currezzione IA nantu à ogni risultatu — incollali in Cursor / Claude Code.
Lampa una scansione BaaS gratisa

nisuna iscrizzione richiesta

Lista di cuntrollu di sicurezza di bucket Supabase Storage: 22 elementi — Docs · FixVibe