FixVibe

// docs / baas security / supabase storage

Supabase сақтау шелегінің қауіпсіздік тізімі: 22 тармақ

Supabase Storage — S3-үйлесімді шелектің жұқа орамасы және дерекқор сияқты бірдей Row-Level Security үлгісі. Бұл кестелерге әсер ететін бірдей RLS қателіктері файл қол жеткізуіне де әсер ететінін білдіреді — және ИИ кодтау құралдары жүктеп салуларды қосқанда пайда болатын бірнеше сақтауға тән қателіктер. Бұл тізім бес бөлімде 22 тармақ: шелек конфигурациясы, RLS саясаттары, жүктеп салу тексеруі, қол қойылған URL-дер және операциялық гигиена. Әрқайсысын 15 минуттан аз уақытта тексеруге болады.

Төмендегі әр тармақ маңызды. Негізгі RLS механикасы үшін Supabase RLS сканері қараңыз. Сақтауға жақын кілт-ашылу класы үшін JavaScript-те ашылған Supabase service role кілті қараңыз.

Шелек конфигурациясы

Дұрыс әдепкі мәндермен бастаңыз. Қате конфигурацияланған шелек RLS дұрыс болса да файлдарды ағызады.

  1. Әр шелекті әдепкі бойынша жекеге орнатыңыз. Supabase бақылау тақтасында → Storage → Buckets, нақты себеп болмаса (маркетингтік активтер, PII жоқ жалпыға ортақ аватарлар) Public bucket ауыстырғышын өшіріңіз. Жалпыға ортақ шелектер оқу операциялары үшін RLS-ті айналып өтеді — шелек атауы бар кез келген адам тізе және жүктей алады.
  2. Әр шелекте қатаң файл өлшемі шегін орнатыңыз. Бақылау тақтасы → Bucket settings → File size limit. 50 МБ — пайдаланушы жүктеп салулары үшін орынды әдепкі; видео / ірі файл пайдалану жағдайлары үшін оны әдейі көтеріңіз. Шектеусіз бір зиянды жүктеп салу сіздің сақтау квотаңызды немесе айлық өткізу қабілеттілігіңізді сарқып шығара алады.
  3. Шелек бойынша рұқсат етілген MIME түрлерін шектеңіз. Рұқсат етілген MIME түрлерінің тізімі — нақты ақ тізім, тыйым тізімі емес. Тек кескін шелектері үшін image/jpeg, image/png, image/webp. Пайдаланушы мазмұны шелегінде ешқашан text/html, application/javascript немесе image/svg+xml рұқсат бермеңіз — олар қол қойылған URL арқылы ұсынылған кезде браузерде орындалады.
  4. Жалпы шелек емес, мазмұн түріне бір шелек пайдаланыңыз. Шелек бойынша параметрлер (өлшемі, MIME түрлері, RLS саясаттары) — сіз ие гранулярлық. user-avatars шелегі, document-uploads шелегі және public-assets шелегі бір аралас шелекке қарағанда бекітуге оңайырақ.
  5. Алдыңғы жақ жүктеп салса CORS конфигурациясын тексеріңіз. Пайдаланушылар браузерден қол қойылған URL-ге тікелей жүктеп салса, шелек CORS өндіріс шығу тегіңізді тізуі керек. * тек жалпыға ортақ шелектер үшін қолайлы — пайдаланушы PII бар шелектер үшін ешқашан емес.

storage.objects ішіндегі RLS саясаттары

Supabase Storage файл метадеректерін storage.objects кестесінде сақтайды. Сол кестедегі RLS файлдарды кім оқи, жүктей, жаңарта немесе жоя алатынын басқарады. RLS-сіз шелектің жалпыға ортақ/жеке жалауы — сіздің жалғыз қорғанысыңыз.

  1. storage.objects ішінде RLS қосылғанын растаңыз. SELECT rowsecurity FROM pg_tables WHERE schemaname = 'storage' AND tablename = 'objects'; true қайтаруы керек. Supabase оны жаңа жобаларда әдепкі бойынша қосады; өшірілмегенін тексеріңіз.
  2. Жеке шелектер үшін auth.uid() мәніне шектелген SELECT саясатын жазыңыз. CREATE POLICY "users_read_own_files" ON storage.objects FOR SELECT USING (auth.uid()::text = (storage.foldername(name))[1]);. Конвенция — файлдарды [user-id]/[filename] астында сақтап, иесін жолдан шығару үшін storage.foldername() пайдалану.
  3. Сондай жол конвенциясын мәжбүрлейтін INSERT саясатын жазыңыз. CREATE POLICY "users_upload_own" ON storage.objects FOR INSERT WITH CHECK (auth.uid()::text = (storage.foldername(name))[1]);. WITH CHECK-сіз аутентификацияланған пайдаланушы басқа пайдаланушының қалтасына жүктей алады.
  4. Қолданбаңыз файл өңдеу немесе жоюды қолдаса UPDATE және DELETE саясаттарын қосыңыз. Әр пәрменге өз саясаты керек. DELETE өткізу аутентификацияланған пайдаланушылар өз файлдарын жоя алмайтынын білдіреді; UPDATE өткізу файл қайта жазуы үнсіз сәтсіз болатынын білдіреді.
  5. Екі браузер сеансында кросс-пайдаланушы қол жеткізуін тексеріңіз. A пайдаланушы ретінде кіріп, файл жүктеп, жолды көшіріңіз. Басқа браузерде B пайдаланушы ретінде кіріп, файлды REST API арқылы алып көріңіз. Жауап 403 немесе 404 болуы керек, ешқашан 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]);

Жүктеп салуды тексеру

Шелекте MIME және өлшем шектеулері болғанда да әр жүктеп салуды сервер жағында тексеріңіз. ИИ кодтау құралдары әдепкі бойынша тек клиенттік тексеруді жасайды; бұл ештеңені қорғамайды.

  1. MIME түрін Content-Type тақырыбынан емес, файлдың нақты байттарынан сервер жағында қайта тексеріңіз. file-type (Node) кітапханасын немесе сиқырлы-байт исқаптауды пайдаланыңыз. Шабуылдаушы шын мәнінде полиглот HTML / JavaScript пайдалы жүгі болатын файлда Content-Type: image/jpeg деп мәлімдей алады.
  2. Жүктеп салынған кескіндерден EXIF метадеректерін алып тастаңыз. EXIF GPS координаттарын, құрылғы сериялық нөмірлерін және уақыт белгілерін қамтуы мүмкін. Сақтауға дейін тазалау үшін .withMetadata(false) бар sharp немесе exif-parser пайдаланыңыз.
  3. script тегтері немесе onload өңдеушілері бар SVG-ларды қабылдамаңыз. SVG — XML — және көптеген ИИ-генерациялаған қолданбалар SVG жүктеп салуларын "тек кескін" ретінде рұқсат береді. Сервер жағында DOMPurify пайдаланыңыз немесе SVG жүктеп салуларынан мүлдем бас тартыңыз.
  4. Анықтаушы, болжанбайтын файл атауларын пайдаланыңыз. Бастапқы файл атауын сақтамаңыз. UUID немесе файл мазмұнының хэшін пайдаланыңыз. Бастапқы файл атаулары ағады ("passport_scan_2024_01_15.jpg") және болжамды атаулар санауды мүмкіндендіреді.

Қол қойылған URL-дер

Қол қойылған URL-дер — клиенттердің жеке шелектерге қол жеткізу тәсілі. Аяқталу мерзімі, шелек ауқымы және не журналданатыны маңызды.

  1. Қол қойылған URL аяқталу мерзімін әдепкі бойынша 1 сағат немесе одан аз етіңіз. Supabase JS SDK-ның createSignedUrl(path, expiresIn) функциясы секундтарды қабылдайды. Ешқашан 31536000 (бір жыл) сияқты мәндерді пайдаланбаңыз — URL тұрақты жарты-жалпыға ортақ сілтеме болады.
  2. Қол қойылған URL-дерді ешқашан дерекқорыңызда сақтамаңыз. Әр сұрауда сервер жағында жаңаларын генерациялаңыз. 1-жылдық аяқталу мерзімі бар сақталған қол қойылған URL дерекқор дампі арқылы ағып кетсе, ұзақ мерзімді қол жеткізуге мүмкіндік береді.
  3. Тек файл жүктеп салуларын емес, қол қойылған URL генерациялауын журналдаңыз. Кейінірек компромат күдік етсеңіз, кім қашан қайсы URL-ді генерациялағанын білуіңіз керек. auth.uid() + шелек + нысан жолы + уақыт белгісін журналдаңыз.
  4. Пайдаланушы жүктеген файлдарды ұсынғанда downloadAs опциясын пайдаланыңыз. createSignedUrl(path, expiresIn, { download: '.jpg' }) файлдың рендерлеу орнына жүктелуі үшін Content-Disposition: attachment тақырыбын мәжбүрлейді — HTML / SVG / HTML-PDF орындау класын жеңеді.

Операциялық гигиена

Сақтау конфигурациясы уақыт өте келе ауысады. Бұл төрт операциялық тармақ бетті қатаң ұстайды.

  1. Шелектерді тоқсан сайын аудиттеңіз. Бақылау тақтасы → Storage → Buckets. Жалпыға ортақ/жеке күйі мен MIME-түрі тізімдері қолданба күтетінмен сәйкес келетінін растаңыз. "Уақытша" жасалған шелектер ешкім оларды жоймаса тұрақты болады.
  2. Анонимді тізу операцияларын бақылаңыз. Сақтау журналдары (Бақылау тақтасы → Logs → Storage) LIST сұрауларын жазады. Жеке шелекке қарсы анонимді тізу сұрауларының секіруі біреудің оны сырттан зерттеп жатқанын білдіреді.
  3. Уақытша жүктеп салулар үшін сақтау саясатын орнатыңыz. Уақытша шелектер (кескін алдын ала қарау, жоба жүктеп салулары) жоспарланған функция арқылы 24-72 сағаттан кейін авто-жойылуы керек. Шексіз сақтау GDPR / CCPA деректерді минимизациялау міндеттері бойынша жауапкершілік.
  4. Ай сайын FixVibe сканерлеуін іске қосыңыз. baas.supabase-storage-public тексеруі анонимді GET + LIST сұрауларына жауап беретін шелектерді зерттейді. Жаңа шелектер қосылады; ескілерінің көрінуі өзгереді — тек үздіксіз сканерлеу ауысуды ұстайды.

Келесі қадамдар

Өндіріс URL мекенжайыңызға қарсы FixVibe сканерлеуін іске қосыңыз — анонимді сақтау тізімдері baas.supabase-storage-public астында пайда болады. Бұл тізімді кесте қабаты үшін Supabase RLS сканері және кілт-ашылу жақындығы үшін JavaScript-те ашылған Supabase service role кілті мақаласымен жұптаңыз. Басқа BaaS провайдерлеріндегі сақтау қате конфигурациялары үшін BaaS қате конфигурациясының сканері қараңыз.

// baas бетіңізді сканерлеңіз

Ашық кестені біреу одан бұрын тапқанша табыңыз.

Өндіріс URL мекенжайын енгізіңіз. FixVibe сіздің қолданбаңыз сөйлесетін BaaS провайдерлерін санайды, олардың жалпыға ортақ соңғы нүктелерінің саусақ ізін алады және аутентификацияланбаған клиент не оқи немесе жаза алатынын хабарлайды. Тегін, орнатусыз, картасыз.

  • Тегін деңгей — айына 3 сканерлеу, тіркелу картасы жоқ.
  • Пассивті BaaS саусақ ізін алу — домен иелігін растау қажет емес.
  • Supabase, Firebase, Clerk, Auth0, Appwrite және басқалары.
  • Әр табылған нәтижеде ИИ түзету шақырулары — Cursor / Claude Code ішіне қайта қойыңыз.
Supabase сақтау шелегінің қауіпсіздік тізімі: 22 тармақ — Docs · FixVibe