// docs / baas security / supabase storage
Supabase-stoorbak-sekuriteitskontrolelys: 22 items
Supabase-Stoorplek is 'n dun omhulsel rondom 'n S3-versoenbare emmer plus dieselfde ry-vlak-sekuriteitsmodel as die databasis. Dit beteken dieselfde RLS-slaggate wat tabelle raak, raak lêertoegang — en 'n paar stoorspesifieke wat opduik wanneer KI-koderingsgereedskap oplaaie bedraad. Hierdie kontrolelys is 22 items oor vyf afdelings: emmerkonfigurasie, RLS-beleide, oplaai-validasie, getekende URL's en operasionele higiëne. Elkeen is in minder as 15 minute verifieerbaar.
Elke item hieronder is essensieel. Vir die onderliggende RLS-meganika, sien Supabase RLS-skandeerder. Vir die sleutel-blootstelling-klas wat aan stoorplek grens, sien Supabase-diens-rol-sleutel blootgestel in JavaScript.
Emmerkonfigurasie
Begin met die regte versteke. 'n Wankonfigureerde emmer lek lêers ongeag of jou RLS korrek is of nie.
- Stel elke emmer by verstek as privaat. In die Supabase-Dashboard → Stoorplek → Emmers, stel die Openbare emmer-skakelaar af, tensy jy 'n eksplisiete rede het (bemarkingsbates, openbare avatars sonder PII). Openbare emmers omseil RLS vir leesoperasies — enigiemand met die emmernaam kan lys en aflaai.
- Stel 'n harde lêergrootte-limiet op elke emmer. Dashboard → Emmer-instellings → Lêergrootte-limiet. 50 MB is 'n sinvolle verstek vir gebruikersoplaaie; verhoog dit doelbewus vir video- / groot-lêer-gevalle. Sonder 'n limiet kan 'n enkele kwaadwillige oplaai jou stoorkwota of jou maandelikse bandwydte uitput.
- Beperk toegelate MIME-tipes per emmer. Toegelate MIME-tipes-lys — eksplisiete toelaatlys, nie blokkeerlys nie.
image/jpeg,image/png,image/webpvir beeld-alleen emmers. Laat nooittext/html,application/javascriptofimage/svg+xmlin 'n gebruikersinhoud-emmer toe nie — hulle word in die blaaier uitgevoer wanneer hulle via 'n getekende URL bedien word. - Gebruik een emmer per inhoudstipe, nie een gedeelde emmer nie. Per-emmer-instellings (grootte, MIME-tipes, RLS-beleide) is die korrelgrootte wat jy het. 'n
user-avatars-emmer, 'ndocument-uploads-emmer en 'npublic-assets-emmer is makliker toe te sluit as een gemengde emmer. - Verifieer CORS-konfigurasie as frontend-oplaaie plaasvind. As gebruikers direk vanaf die blaaier na 'n getekende URL oplaai, moet die emmer-CORS jou produksie-oorsprong lys.
*is slegs aanvaarbaar vir openbare emmers — nooit vir emmers wat gebruikers-PII bevat nie.
RLS-beleide op storage.objects
Supabase-Stoorplek stoor lêer-metadata in die storage.objects-tabel. RLS op daardie tabel beheer wie lêers kan lees, oplaai, opdateer of skrap. Sonder RLS is die emmer se openbare/privaat-vlag jou enigste beskerming.
- Bevestig dat RLS op storage.objects geaktiveer is.
SELECT rowsecurity FROM pg_tables WHERE schemaname = 'storage' AND tablename = 'objects';moettrueteruggee. Supabase aktiveer dit by verstek op nuwe projekte; verifieer dat dit nie afgeskakel is nie. - Skryf 'n SELECT-beleid beperk tot
auth.uid()vir privaat emmers.CREATE POLICY "users_read_own_files" ON storage.objects FOR SELECT USING (auth.uid()::text = (storage.foldername(name))[1]);. Die konvensie is om lêers onder[user-id]/[filename]te stoor enstorage.foldername()te gebruik om die eienaar uit die pad te onttrek. - Skryf 'n INSERT-beleid wat dieselfde padkonvensie afdwing.
CREATE POLICY "users_upload_own" ON storage.objects FOR INSERT WITH CHECK (auth.uid()::text = (storage.foldername(name))[1]);. Sonder WITH CHECK kan 'n geautentiseerde gebruiker in 'n ander gebruiker se vouer oplaai. - Voeg UPDATE- en DELETE-beleide by as jou toepassing lêerwysigings of -skrappings ondersteun. Elke opdrag benodig sy eie beleid. Om DELETE oor te slaan, beteken geautentiseerde gebruikers kan nie hul eie lêers verwyder nie; om UPDATE oor te slaan, beteken lêeroorskryfings misluk stil.
- Toets kruis-gebruiker-toegang in twee blaaiersessies. Teken aan as Gebruiker A, laai 'n lêer op, kopieer die pad. Teken aan as Gebruiker B in 'n ander blaaier, probeer die lêer via die REST-API haal. Die antwoord moet
403of404wees, nooit200nie.
-- 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]);Oplaai-validasie
Valideer elke oplaai bedienerkant, selfs wanneer die emmer MIME- en grootte-beperkings het. KI-koderingsgereedskap genereer by verstek slegs kliëntkant-validasie; dit beskerm niks.
- Kontroleer MIME-tipe weer bedienerkant vanuit die lêer se werklike grepe, nie die
Content-Type-kopstuk nie. Gebruik 'n biblioteek soosfile-type(Node) of magiese-greep-snuffeling. 'n Aanvaller kanContent-Type: image/jpegbeweer op 'n lêer wat eintlik 'n polyglot HTML- / JavaScript-vrag is. - Verwyder EXIF-metadata uit opgelaaide beelde. EXIF kan GPS-koördinate, toestelreeksnommers en tydstempels bevat. Gebruik
sharpmet.withMetadata(false)ofexif-parserom voor stoor te verwyder. - Verwerp SVG's wat
script-tags ofonload-hanteerders bevat. SVG is XML — en baie KI-gegenereerde toepassings laat SVG-oplaaie toe as "net 'n beeld." GebruikDOMPurifybedienerkant of weier SVG-oplaaie heeltemal. - Gebruik deterministiese, onraaibare lêername. Behou nie die oorspronklike lêernaam nie. Gebruik 'n UUID of 'n hutsing van die lêerinhoud. Oorspronklike lêername lek ("
passport_scan_2024_01_15.jpg") en voorspelbare name maak opsomming moontlik.
Getekende URL's
Getekende URL's is hoe kliënte toegang tot privaat emmers kry. Die verstryking, die emmerbereik en wat aangeteken word, maak saak.
- Stel getekende-URL-verstryking by verstek op 1 uur of minder. Die Supabase JS-SDK se
createSignedUrl(path, expiresIn)neem sekondes. Gebruik nooit waardes soos31536000(een jaar) nie — die URL word 'n permanente semi-openbare skakel. - Stoor nooit getekende URL's in jou databasis nie. Genereer vars by elke versoek bedienerkant. 'n Gestoorde getekende URL met 'n 1-jaar-verstryking wat via 'n databasisstorting lek, gee langtermyn-toegang.
- Teken die genereer van getekende URL's aan, nie net lêeroplaaie nie. As jy later vermoed dat 'n kompromis plaasgevind het, moet jy weet wie watter URL wanneer gegenereer het. Teken
auth.uid()+ emmer + objekpad + tydstempel aan. - Gebruik die
downloadAs-opsie wanneer jy gebruiker-opgelaaide lêers bedien.createSignedUrl(path, expiresIn, { download: '.jpg' })dwing 'nContent-Disposition: attachment-kopstuk af sodat die lêer aflaai in plaas van vertoon — verslaan die HTML- / SVG- / HTML-in-PDF-uitvoeringsklas.
Operasionele higiëne
Stoorkonfigurasie dryf met verloop van tyd. Hierdie vier operasionele items hou die oppervlak styf.
- Oudit emmers kwartaalliks. Dashboard → Stoorplek → Emmers. Bevestig openbare/privaat-toestand en MIME-tipe-lyste pas by wat die toepassing verwag. Emmers wat "tydelik" geskep is, word permanent as niemand hulle verwyder nie.
- Monitor anonieme lys-operasies. Stoor-logs (Dashboard → Logs → Stoor) teken
LIST-versoeke aan. 'n Sprong van anonieme lys-versoeke teen 'n privaat emmer beteken iemand ondersoek dit van buite. - Stel 'n behoudbeleid vir efemerele oplaaie. Tydelike emmers (beeldvoorskou, konsep-oplaaie) moet outomaties skrap na 24-72 uur via 'n geskeduleerde funksie. Onbepaalde behoud is 'n aanspreeklikheid onder GDPR- / CCPA-data-minimalisering-verpligtinge.
- Voer maandeliks 'n FixVibe-skandering uit. Die
baas.supabase-storage-public-toets ondersoek emmers wat reageer op anoniemeGET+LIST. Nuwe emmers word bygevoeg; oues verander sigbaarheid — slegs deurlopende skandering vang die drywing.
Volgende stappe
Voer 'n FixVibe-skandering teen jou produksie-URL uit — anonieme stoorlysings verskyn onder baas.supabase-storage-public. Kombineer hierdie kontrolelys met Supabase RLS-skandeerder vir die tabel-laag en Supabase-diens-rol-sleutel blootgestel in JavaScript vir die aangrensende sleutel-blootstelling. Vir stoor-wankonfigurasies oor ander BaaS-verskaffers, sien BaaS-wankonfigurasieskandeerder.
