// docs / baas security / supabase rls scanner
Supabase RLS skener: pronađite tablice s nedostajućim ili neispravnim row-level security
Row-level security (RLS) jedino je što stoji između podataka vaših korisnika i interneta kada isporučite aplikaciju koja se oslanja na Supabase. AI alati za kodiranje generiraju RLS-oblikovani kod koji se kompilira, isporučuje i tiho propušta podatke — tablice stvorene bez uključenog RLS-a, pravila koja čitaju ali nikada ne ograničavaju, predikati koji uspoređuju stupac sa samim sobom. Ovaj članak pokazuje što Supabase RLS skener može dokazati izvana, četiri oblika neispravnog RLS-a koji se pojavljuju u vibe-coded aplikacijama te kako skenirati vlastiti deployment u manje od minute.
Što vanjski RLS sken može dokazati
Pasivan RLS sken pokreće se prema PostgREST endpointu koji Supabase izlaže na https://[project].supabase.co/rest/v1/. Koristi samo publishable anon ključ — isti ključ koji koristi vaš preglednik — i ispituje metapodatke popisa tablica, anonimna čitanja i anonimna pisanja. Nikada se ne autentificira kao korisnik niti dotiče privilegije service-rolea. Sve što on može učiniti, može i neautenticirani napadač s interneta.
Izvan baze podataka skener može potvrditi sljedeće s visokom pouzdanošću:
- RLS je onemogućen na tablici. PostgREST vraća retke na anoniman
SELECTkada je RLS isključen ili kada to pravila dopuštaju. Oba slučaja su nalaz. - Anonimna uloga može popisivati tablice.
GET /rest/v1/s anon ključem vraća OpenAPI shemu za svaku tablicu na kojoj ulogaanonima bilo kakvu privilegiju. AI-generirane aplikacije često dodjeljujuUSAGEna shemu iSELECTna svaku tablicu, što izlaže potpunu shemu čak i kada RLS onemogućuje stvarna čitanja. - Anonimna uloga može vršiti insert. Probni
POSTs pogađanjem oblika stupaca uspjet će ako RLS nemaINSERTpravila koja to zabranjuju — čak i ako jeSELECTzaključan. - Service-role ključ nalazi se u browser bundleu. Susjedno RLS-u: ako skener pronađe
SUPABASE_SERVICE_ROLE_KEYili bilo koji JWT srole: service_roleu JavaScript bundleu, RLS je suvišan — onaj tko drži taj ključ zaobilazi svako pravilo.
Što vanjski sken ne može dokazati
Budite iskreni o granicama skenera. Vanjski RLS sken ne može čitati vašu tablicu pg_policies, vaše migracijske datoteke ni točan predikat bilo kojeg pravila. Zaključuje na temelju black-box ponašanja, što znači da će ponekad prijaviti nalaz koji se ispostavi kao namjerno javan podatak (tablica marketinškog newslettera, javni katalog proizvoda). FixVibe izvještaj označava ove kao srednju pouzdanost kada skener ne može razlučiti namjeru — pregledajte ime tablice i odlučite.
Četiri oblika neispravnog RLS-a koje AI alati proizvode
Kada usmjerite Cursor, Claude Code, Lovable ili Bolt prema Supabaseu, ista četiri obrasca neispravnog RLS-a pojavljuju se u tisućama aplikacija. Svaki prolazi type-check, kompilira se i isporučuje:
Oblik 1: RLS nikada nije uključen
Najčešći način pada. Migracija stvara tablicu, ali developer (ili AI alat) zaboravi ALTER TABLE ... ENABLE ROW LEVEL SECURITY. PostgREST veselo poslužuje cijelu tablicu svakome tko ima anon ključ. Popravak: ALTER TABLE public.[name] ENABLE ROW LEVEL SECURITY; ALTER TABLE public.[name] FORCE ROW LEVEL SECURITY;. FORCE nije opcionalan — bez njega vlasnik tablice (i svaka uloga s vlasništvom nad tablicom) zaobilazi RLS.
ALTER TABLE public.[name] ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.[name] FORCE ROW LEVEL SECURITY;Oblik 2: RLS uključen, bez pravila
Suptilniji pad. RLS je uključen, ali nije napisano nijedno pravilo. Default u PostgreSQL-u je deny, pa autenticirani korisnici ne vide ništa — i developer dodaje USING (true) da bi aplikacija radila, što dopušta svima da čitaju sve. Popravak: napišite pravilo koje se ograničava preko auth.uid(): CREATE POLICY "select_own" ON public.[name] FOR SELECT USING (auth.uid() = user_id); i odgovarajuće pravilo za INSERT/UPDATE/DELETE.
CREATE POLICY "select_own"
ON public.[name]
FOR SELECT
USING (auth.uid() = user_id);Oblik 3: Pravila uspoređuju stupac sa samim sobom
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.
Oblik 4: Pravila na SELECT-u ali ne i na INSERT-u/UPDATE-u
Developer zaključava čitanja, ali zaboravlja pisanja. RLS pravila su po naredbi. FOR SELECT štiti samo čitanja; anonimni klijent i dalje može izvršiti INSERT ako to nijedno pravilo ne zabranjuje. Popravak: napišite pravilo po naredbi ili koristite FOR ALL s eksplicitnim USING i WITH CHECK klauzulama.
Kako radi FixVibe Supabase RLS skener
Provjera baas.supabase-rls radi u tri faze, svaka s eksplicitnim razinama pouzdanosti:
- Faza 1 — fingerprintiranje. Skener crawla deploy-anu aplikaciju, parsira njezin JavaScript bundle i izvlači Supabase project URL i anon ključ iz runtime konfiguracije. Bez pogađanja DNS-a, bez brute-forcea — čita ono što čita preglednik.
- Faza 2 — otkrivanje sheme. Jedan
GET /rest/v1/s anon ključem vraća OpenAPI shemu za svaku tablicu koju anonimna uloga može vidjeti. Skener bilježi imena tablica, ali u ovoj fazi ne čita podatke redaka. - Faza 3 — probe čitanja i pisanja. Za svaku otkrivenu tablicu skener izdaje jedan anoniman
SELECTslimit=1. Ako se retci vrate, RLS je permisivan. Skener tu staje — ne nabraja retke, ne paginira, ne mijenja podatke. INSERT probe uvjetovane su verificiranim vlasništvom domene i eksplicitnim opt-inom; nikada se ne pokreću prema neverificiranim ciljevima.
Svaki nalaz dolazi s točnim URL-om zahtjeva, statusom odgovora, oblikom odgovora (samo headeri) i imenom tablice. AI prompt za popravak na dnu nalaza je copy-paste SQL blok koji pokrećete u Supabase SQL editoru.
Što učiniti kada skener nešto pronađe
Svaki RLS nalaz je runtime hitnost. Javne PostgREST endpointove napadači skeniraju u roku od nekoliko minuta. Slijed sanacije je mehanički:
- Auditirajte svaku tablicu. Pokrenite
SELECT schemaname, tablename, rowsecurity FROM pg_tables WHERE schemaname = 'public';u Supabase SQL editoru. Svaki redak srowsecurity = falseje problem. - Uključite RLS na svakoj javnoj tablici. Default na
ENABLE ROW LEVEL SECURITYiFORCE ROW LEVEL SECURITYna svakoj stvorenoj tablici — neka to bude template za migracije. - Pišite pravila naredbu po naredbu. Ne koristite
FOR ALL USING (true). Napišite eksplicitna pravila za SELECT, INSERT, UPDATE, DELETE — svako ograničeno prekoauth.uid()ili stupca org-id izauth.jwt(). - Verificirajte drugim računom. Registrirajte se kao drugi korisnik, pokušajte čitati zapise drugog korisnika izravno preko REST API-ja. Ako je odgovor
200, pravilo je neispravno. - Ponovo skenirajte. Nakon primjene popravka ponovo pokrenite FixVibe sken prema istom URL-u. Nalaz
baas.supabase-rlstrebao bi nestati.
-- 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;Kako se ovo uspoređuje s drugim skenerima
Većina generičkih DAST alata (Burp Suite, OWASP ZAP, Nessus) ne zna što je PostgREST. Crawlat će vašu aplikaciju, ignorirati putanju /rest/v1/ i prijaviti HTML stranice koje razumiju. Snyk i Semgrep alati su za statičku analizu — pronalaze migracijske datoteke u vašem repozitoriju s nedostajućim RLS pozivima, ali ne mogu dokazati da je deploy-ana baza pogrešno konfigurirana. FixVibe popunjava taj prostor: pasivno, sa znanjem o BaaS-u, fokusirano na ono što neautenticirani napadač može dokazati s javnog URL-a.
Često postavljana pitanja
Hoće li skener čitati ili mijenjati moje podatke?
Ne. Pasivni skenovi izdaju najviše jedan SELECT ... limit=1 po otkrivenoj tablici da bi potvrdili dopušta li RLS anonimna čitanja. Skener bilježi oblik odgovora, a ne sadržaj redaka. INSERT, UPDATE i DELETE probe uvjetovane su verificiranim vlasništvom domene i nikada se ne pokreću prema neverificiranim ciljevima.
Radi li ovo ako je moj Supabase projekt pauziran ili na prilagođenoj domeni?
Pauzirani projekti vraćaju 503 na svaki zahtjev — skener prijavljuje projekt kao nedostupan. Prilagođene domene rade dokle god deploy-ana aplikacija i dalje učitava Supabase klijentski SDK u pregledniku; skener u svakom slučaju izvlači project URL iz bundlea.
Što ako se moj anon ključ rotira ili promijeni publishable ključ?
Ponovo pokrenite sken. Skener ponovo izvlači ključ iz trenutnog bundlea pri svakom pokretanju. Rotacija poništava samo prethodni izvještaj, ne i stanje pravila u bazi.
Provjerava li skener novi Supabase model publishable-key (<code>sb_publishable_*</code>)?
Da. Detektor prepoznaje i naslijeđene anon JWT-ove i novije sb_publishable_* ključeve i tretira ih identično — oba su namijenjena da budu javna i oba ostavljaju RLS kao jedinu liniju obrane.
Sljedeći koraci
Pokrenite besplatan FixVibe sken prema svom produkcijskom URL-u — provjera baas.supabase-rls uključena je u svakom paketu, uključujući i besplatni. Za dublji uvid u to što još može curiti iz Supabase projekta, pogledajte Supabase service role ključ izložen u JavaScriptu i Sigurnosna checklista za Supabase storage. Za pogled iz ptičje perspektive na sve BaaS providere, pročitajte Skener BaaS pogrešnih konfiguracija.
