// 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ò.
- 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à.
- 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.
- 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/webpper bucket di solu imagine. Mai permettetext/html,application/javascript, oimage/svg+xmlin un bucket di cuntenutu d'utente — eseguiscenu in u navigatore quandu servuti via URL firmata. - 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 bucketdocument-uploads, è un bucketpublic-assetssò più faciuli di chjude chè un bucket mistu. - 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.
- 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. - 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. - 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. - 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.
- 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
403o404, mai200.
-- 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.
- 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ò pretendeContent-Type: image/jpegnantu à un schedariu chì hè in realità un payload polyglot HTML / JavaScript. - Caccia i metadata EXIF da l'imagine caricate. EXIF pò cuntene coordinate GPS, numeri di seriale di dispusitivu, è timestamp. Adopra
sharpcù.withMetadata(false)oexif-parserper cacciallu prima di a memorizazione. - Ricusa SVG chì cuntenenu tag
scripto handleronload. SVG hè XML — è parechje app generate da IA permettenu upload SVG cum'è "sulu una imagine." AdopraDOMPurifylatu servitore o rifiuta uploadi SVG interamente. - 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.
- 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. - 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.
- 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. - Adopra l'opzione
downloadAsquandu servi schedarii caricati da l'utente.createSignedUrl(path, expiresIn, { download: '.jpg' })furza un headerContent-Disposition: attachmentcusì 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.
- 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.
- 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. - 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.
- Lampa una scansione FixVibe mensilmente. U check
baas.supabase-storage-publicsonda per bucket chì rispondenu àGET+LISTanonimi. 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.
