FixVibe

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

  1. 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.
  2. 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.
  3. Beperk toegelate MIME-tipes per emmer. Toegelate MIME-tipes-lys — eksplisiete toelaatlys, nie blokkeerlys nie. image/jpeg, image/png, image/webp vir beeld-alleen emmers. Laat nooit text/html, application/javascript of image/svg+xml in 'n gebruikersinhoud-emmer toe nie — hulle word in die blaaier uitgevoer wanneer hulle via 'n getekende URL bedien word.
  4. 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, 'n document-uploads-emmer en 'n public-assets-emmer is makliker toe te sluit as een gemengde emmer.
  5. 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.

  1. Bevestig dat RLS op storage.objects geaktiveer is. SELECT rowsecurity FROM pg_tables WHERE schemaname = 'storage' AND tablename = 'objects'; moet true teruggee. Supabase aktiveer dit by verstek op nuwe projekte; verifieer dat dit nie afgeskakel is nie.
  2. 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 en storage.foldername() te gebruik om die eienaar uit die pad te onttrek.
  3. 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.
  4. 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.
  5. 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 403 of 404 wees, nooit 200 nie.
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]);

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.

  1. Kontroleer MIME-tipe weer bedienerkant vanuit die lêer se werklike grepe, nie die Content-Type-kopstuk nie. Gebruik 'n biblioteek soos file-type (Node) of magiese-greep-snuffeling. 'n Aanvaller kan Content-Type: image/jpeg beweer op 'n lêer wat eintlik 'n polyglot HTML- / JavaScript-vrag is.
  2. Verwyder EXIF-metadata uit opgelaaide beelde. EXIF kan GPS-koördinate, toestelreeksnommers en tydstempels bevat. Gebruik sharp met .withMetadata(false) of exif-parser om voor stoor te verwyder.
  3. Verwerp SVG's wat script-tags of onload-hanteerders bevat. SVG is XML — en baie KI-gegenereerde toepassings laat SVG-oplaaie toe as "net 'n beeld." Gebruik DOMPurify bedienerkant of weier SVG-oplaaie heeltemal.
  4. 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.

  1. Stel getekende-URL-verstryking by verstek op 1 uur of minder. Die Supabase JS-SDK se createSignedUrl(path, expiresIn) neem sekondes. Gebruik nooit waardes soos 31536000 (een jaar) nie — die URL word 'n permanente semi-openbare skakel.
  2. 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.
  3. 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.
  4. Gebruik die downloadAs-opsie wanneer jy gebruiker-opgelaaide lêers bedien. createSignedUrl(path, expiresIn, { download: '.jpg' }) dwing 'n Content-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.

  1. 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.
  2. 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.
  3. 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.
  4. Voer maandeliks 'n FixVibe-skandering uit. Die baas.supabase-storage-public-toets ondersoek emmers wat reageer op anonieme GET + 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.

// skandeer jou baas-oppervlak

Vind die oop tabel voordat iemand anders dit doen.

Plak 'n produksie-URL in. FixVibe identifiseer die BaaS-verskaffers waarmee jou toepassing kommunikeer, neem vingerafdrukke van hul openbare eindpunte en rapporteer wat 'n ongeautentiseerde kliënt kan lees of skryf. Gratis, geen installasie nie, geen kaart nie.

  • Gratis vlak — 3 skanderings / maand, geen aansluitkaart nie.
  • Passiewe BaaS-vingerafdrukke — geen domeinverifikasie nodig nie.
  • Supabase, Firebase, Clerk, Auth0, Appwrite en meer.
  • KI-regstellingsaanwysings by elke bevinding — plak terug in Cursor / Claude Code.
Voer 'n gratis BaaS-skandering uit

geen aansluiting nodig nie

Supabase-stoorbak-sekuriteitskontrolelys: 22 items — Docs · FixVibe