// docs / baas security / supabase rls scanner
Supabase RLS сканері: жоқ немесе бұзылған жол деңгейіндегі қауіпсіздігі бар кестелерді табыңыз
Жол деңгейіндегі қауіпсіздік (RLS) — Supabase негізіндегі қолданбаны жариялаған кезде клиенттеріңіздің деректері мен интернеттің арасында тұрған жалғыз нәрсе. ИИ кодтау құралдары компиляцияланатын, жариялауға кететін және үнсіз деректерді ағызатын RLS пішіндес кодты құрады — RLS қосылмай құрылған кестелер, оқитын бірақ ешқашан шектемейтін саясаттар, бағанды өзімен салыстыратын предикаттар. Бұл мақала Supabase RLS сканері сырттан не дәлелдей алатынын, vibe-кодтаған қолданбаларда көрінетін төрт бұзылған RLS пішінін және өз орналастыруыңызды бір минуттан аз уақытта қалай сканерлеуді көрсетеді.
Сыртқы RLS сканерлеу не дәлелдей алады
Пассивті RLS сканерлеу Supabase https://[project].supabase.co/rest/v1/ мекенжайында ашатын PostgREST соңғы нүктесіне қарсы орындалады. Ол тек жариялауға арналған anon кілтін — браузеріңіз пайдаланатын бір кілтті — пайдаланады және кесте тізімі метадеректерін, анонимді оқуларды және анонимді жазуларды зерттейді. Ол пайдаланушы ретінде ешқашан аутентификацияланбайды және ешқашан service-role артықшылықтарын қозғамайды. Ол не істей алса, интернеттегі аутентификацияланбаған шабуылдаушы да оны істей алады.
Дерекқордан тыс жерден сканер келесіні жоғары сенімділікпен растай алады:
- Кестеде RLS өшірілген. RLS өшірулі болғанда немесе саясат рұқсат бергенде PostgREST анонимді
SELECTүшін жолдарды қайтарады. Екі жағдай да табылған нәтиже болып табылады. - Анонимді рөл кестелерді тізе алады. Anon кілтімен
GET /rest/v1/сұрауыanonрөлінің қандай да бір артықшылығы бар әр кестенің OpenAPI схемасын қайтарады. ИИ генерациялаған қолданбалар жиі схемағаUSAGEжәне әр кестегеSELECTрұқсат береді, бұл RLS нақты оқуларды тыйса да толық схема картасын ашады. - Анонимді рөл кірістіре алады. Баған пішінін болжайтын
POSTсұрауы, RLS-те оны тыятынINSERTсаясаты болмаса,SELECTжабық болса да сәтті орындалады. - Service-role кілті браузер бумасында. RLS-ке жақын: сканер JavaScript бумасында
SUPABASE_SERVICE_ROLE_KEYнемесеrole: service_roleбар кез келген JWT-ны тапса, RLS мағынасыз — сол кілт иесі әр саясатты айналып өтеді.
Сыртқы сканерлеу не дәлелдей алмайды
Сканердің шектеулері туралы шынайы болыңыз. Сыртқы RLS сканерлеу сіздің pg_policies кестеңізді, көші-қон файлдарыңызды немесе кез келген саясаттың нақты предикатын оқи алмайды. Ол қара жәшік мінез-құлқынан тұжырым жасайды, бұл кейде қасақана жалпыға ортақ деректер (маркетингтік ақпараттық бюллетень кестесі, жалпыға ортақ өнім каталогы) болып шығатын табылған нәтиже туралы хабарлайтынын білдіреді. FixVibe есебі сканер ниетті ажырата алмаған кезде оларды орташа сенімділік деп белгілейді — кесте атауын қарап шығып, шешім қабылдаңыз.
ИИ құралдары шығаратын төрт бұзылған RLS пішіні
Cursor, Claude Code, Lovable немесе Bolt-ты Supabase-ке бағыттаған кезде мыңдаған қолданбаларда бірдей төрт бұзылған RLS үлгісі пайда болады. Әрқайсысы тип-тексеруден өтеді, компиляцияланады және жарияланады:
1-пішін: RLS ешқашан қосылмаған
Ең көп тараған сәтсіздік режимі. Көші-қон кестені жасайды, бірақ әзірлеуші (немесе ИИ құралы) ALTER TABLE ... ENABLE ROW LEVEL SECURITY туралы ұмытады. PostgREST қуана-қуана anon кілті бар кез келген адамға бүкіл кестені береді. Түзету: ALTER TABLE public.[name] ENABLE ROW LEVEL SECURITY; ALTER TABLE public.[name] FORCE ROW LEVEL SECURITY;. FORCE міндетті — онсыз кесте иесі (және кесте иелігі бар кез келген рөл) RLS-ті айналып өтеді.
ALTER TABLE public.[name] ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.[name] FORCE ROW LEVEL SECURITY;2-пішін: RLS қосылған, саясаттар жоқ
Күрделірек сәтсіздік. RLS қосылған, бірақ саясаттар жазылмаған. PostgreSQL-дегі әдепкі мән — тыйым салу, сондықтан аутентификацияланған пайдаланушылар ештеңе көрмейді — және әзірлеуші қолданбаны іске қосу үшін USING (true) қосады, бұл әркімге барлығын оқуға рұқсат береді. Түзету: auth.uid() арқылы шектелетін саясат жазыңыз: CREATE POLICY "select_own" ON public.[name] FOR SELECT USING (auth.uid() = user_id); және сәйкес INSERT/UPDATE/DELETE саясаты.
CREATE POLICY "select_own"
ON public.[name]
FOR SELECT
USING (auth.uid() = user_id);3-пішін: Саясат бағанды өзімен салыстырады
A copy-paste artefact. The developer writes <code>USING (user_id = user_id)</code> — which is always true — instead of <code>USING (auth.uid() = user_id)</code>. Type-checks pass; the policy permits every row. <strong>Fix:</strong> always compare a column to a function call (<code>auth.uid()</code>, <code>auth.jwt()->>'org_id'</code>, etc.), never to itself or to a constant.
4-пішін: SELECT-те саясат бар, бірақ INSERT/UPDATE-те жоқ
Әзірлеуші оқуларды жабады, бірақ жазу туралы ұмытады. RLS саясаттары пәрмен бойынша. FOR SELECT тек оқуларды қорғайды; анонимді клиент саясат тыймаса, әлі де INSERT жасай алады. Түзету: әр пәрменге саясат жазыңыз немесе нақты USING және WITH CHECK сөйлемдерімен FOR ALL пайдаланыңыз.
FixVibe Supabase RLS сканері қалай жұмыс істейді
baas.supabase-rls тексеруі әрқайсысында айқын сенімділік деңгейлері бар үш кезеңде орындалады:
- 1-кезең — саусақ ізін алу. Сканер орналастырылған қолданбаны айналып шығады, оның JavaScript бумасын талдайды және орындалу конфигурациясынан Supabase жоба URL мекенжайы мен anon кілтін шығарып алады. DNS болжауы жоқ, дөрекі күш жоқ — браузер оқитынды оқиды.
- 2-кезең — схеманы табу. Anon кілтімен жалғыз
GET /rest/v1/сұрауы anon рөлі көре алатын әр кестенің OpenAPI схемасын қайтарады. Сканер кесте атауларын жазады, бірақ бұл кезеңде жол деректерін оқымайды. - 3-кезең — оқу және жазу тексерулері. Табылған әр кесте үшін сканер
limit=1бар бір анонимдіSELECTжібереді. Егер жолдар қайтса, RLS рұқсат беруші болып табылады. Сканер сонда тоқтайды — ол жолдарды санамайды, парақтамайды, деректерді өзгертпейді. INSERT тексерулері расталған домен иелігіне және нақты келісімге байланысты; олар ешқашан расталмаған нысандарға қарсы іске қосылмайды.
Әр табылған нәтиже нақты сұрау URL мекенжайымен, жауап күйімен, жауап пішінімен (тек тақырып) және кесте атауымен жеткізіледі. Табылған нәтиженің төменгі жағындағы ИИ түзету шақыруы — Supabase SQL редакторында іске қосатын көшіріп-қоятын SQL блогы.
Сканер бірдеңе тапқанда не істеу керек
Әр RLS табылған нәтижесі — орындалу уақытының төтенше жағдайы. Жалпыға ортақ PostgREST соңғы нүктелерін шабуылдаушылар бірнеше минут ішінде сканерлейді. Жөндеу реттілігі механикалық:
- Әр кестені аудиттеңіз. Supabase SQL редакторында
SELECT schemaname, tablename, rowsecurity FROM pg_tables WHERE schemaname = 'public';іске қосыңыз.rowsecurity = falseбар кез келген жол — мәселе. - Әр жалпыға ортақ кестеде RLS қосыңыз. Әдепкі бойынша құрылған әр кестеде
ENABLE ROW LEVEL SECURITYжәнеFORCE ROW LEVEL SECURITYпайдаланыңыз — оны көші-қон үлгісі етіңіз. - Саясаттарды пәрмен бойынша жазыңыз.
FOR ALL USING (true)пайдаланбаңыз. SELECT, INSERT, UPDATE, DELETE үшін нақты саясаттар жазыңыз — әрқайсысыauth.uid()немесеauth.jwt()ішіндегі org-id бағанымен шектелген. - Екінші тіркелгімен тексеріңіз. Басқа пайдаланушы ретінде тіркеліп, REST API арқылы тікелей басқа пайдаланушының жазбаларын оқып көріңіз. Жауап
200болса, саясат бұзылған. - Қайта сканерлеңіз. Түзетуді қолданғаннан кейін сол URL мекенжайына қарсы FixVibe сканерлеуін қайта іске қосыңыз.
baas.supabase-rlsтабылған нәтижесі тазалануы керек.
-- Audit every table for missing RLS. Run in the Supabase SQL editor.
SELECT schemaname, tablename, rowsecurity
FROM pg_tables
WHERE schemaname = 'public'
ORDER BY rowsecurity, tablename;Бұл басқа сканерлермен қалай салыстырылады
Көптеген жалпы DAST құралдары (Burp Suite, OWASP ZAP, Nessus) PostgREST дегеннің не екенін білмейді. Олар қолданбаңызды айналып шығады, /rest/v1/ жолын елемейді және өздері түсінетін HTML беттері туралы есеп береді. Snyk және Semgrep — статикалық талдау құралдары — олар репозиторийіңізден жоқ RLS шақыруларымен көші-қон файлдарын табады, бірақ орналастырылған дерекқордың дұрыс конфигурацияланбағанын дәлелдей алмайды. FixVibe осы саңылауда орналасады: пассивті, BaaS-білетін, аутентификацияланбаған шабуылдаушы жалпыға ортақ URL-ден не дәлелдей алатынына шоғырланған.
Жиі қойылатын сұрақтар
Сканер менің деректерімді оқиды немесе өзгертеді ме?
Жоқ. Пассивті сканерлеулер RLS анонимді оқуларға рұқсат ете ме, соны растау үшін табылған әр кестеге ең көбі бір SELECT ... limit=1 жібереді. Сканер жауап пішінін жазады, жол мазмұнын емес. INSERT, UPDATE және DELETE тексерулері расталған домен иелігіне байланысты және ешқашан расталмаған нысандарға қарсы орындалмайды.
Бұл менің Supabase жобам тоқтатылған немесе арнайы доменде болса жұмыс істей ме?
Тоқтатылған жобалар әр сұрауға 503 қайтарады — сканер жобаны қол жетімсіз деп хабарлайды. Орналастырылған қолданба әлі де Supabase клиент SDK-ны браузерге жүктейтін болса, арнайы домендер жұмыс істейді; сканер кез келген жолмен бумадан жоба URL мекенжайын шығарады.
Менің anon кілтім айналдырылса немесе жариялау кілтім өзгерсе ше?
Сканерлеуді қайта іске қосыңыз. Сканер әр іске қосуда ағымдағы бумадан кілтті қайта шығарып алады. Айналдыру тек алдыңғы есепті жарамсыз етеді, дерекқордың саясат күйін емес.
Сканер жаңа Supabase жариялау-кілт үлгісін (<code>sb_publishable_*</code>) тексере ме?
Иә. Анықтаушы ескі anon JWT-терін де, жаңа sb_publishable_* кілттерін де таниды және оларды бірдей қарастырады — екеуі де жалпыға ортақ болуға арналған және екеуі де RLS-ті жалғыз қорғаныс сызығы ретінде қалдырады.
Келесі қадамдар
Өндіріс URL мекенжайыңызға қарсы тегін FixVibe сканерлеуін іске қосыңыз — baas.supabase-rls тексеруі тегін деңгейді қоса алғанда әр жоспарда қосылған. Supabase жобасынан тағы не ағуы мүмкін екенін тереңірек оқу үшін JavaScript-те ашылған Supabase service role кілті және Supabase сақтау шелегінің қауіпсіздік тізімі мақалаларын қараңыз. Барлық BaaS провайдерлеріндегі шатыр көрінісі үшін BaaS қате конфигурациясының сканері мақаласын оқыңыз.
