FixVibe

// 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 SELECT kada 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 uloga anon ima bilo kakvu privilegiju. AI-generirane aplikacije često dodjeljuju USAGE na shemu i SELECT na svaku tablicu, što izlaže potpunu shemu čak i kada RLS onemogućuje stvarna čitanja.
  • Anonimna uloga može vršiti insert. Probni POST s pogađanjem oblika stupaca uspjet će ako RLS nema INSERT pravila koja to zabranjuju — čak i ako je SELECT zaključan.
  • Service-role ključ nalazi se u browser bundleu. Susjedno RLS-u: ako skener pronađe SUPABASE_SERVICE_ROLE_KEY ili bilo koji JWT s role: service_role u 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.

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

sql
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:

  1. 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.
  2. 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.
  3. Faza 3 — probe čitanja i pisanja. Za svaku otkrivenu tablicu skener izdaje jedan anoniman SELECT s limit=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:

  1. Auditirajte svaku tablicu. Pokrenite SELECT schemaname, tablename, rowsecurity FROM pg_tables WHERE schemaname = 'public'; u Supabase SQL editoru. Svaki redak s rowsecurity = false je problem.
  2. Uključite RLS na svakoj javnoj tablici. Default na ENABLE ROW LEVEL SECURITY i FORCE ROW LEVEL SECURITY na svakoj stvorenoj tablici — neka to bude template za migracije.
  3. Pišite pravila naredbu po naredbu. Ne koristite FOR ALL USING (true). Napišite eksplicitna pravila za SELECT, INSERT, UPDATE, DELETE — svako ograničeno preko auth.uid() ili stupca org-id iz auth.jwt().
  4. 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.
  5. Ponovo skenirajte. Nakon primjene popravka ponovo pokrenite FixVibe sken prema istom URL-u. Nalaz baas.supabase-rls trebao bi nestati.
sql
-- 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.

// skenirajte svoju baas površinu

Pronađite otvorenu tablicu prije nego što to učini netko drugi.

Ubacite produkcijski URL. FixVibe nabraja BaaS providere s kojima vaša aplikacija razgovara, fingerprintira njihove javne endpointe i prijavljuje što neautenticirani klijent može čitati ili pisati. Besplatno, bez instalacije, bez kartice.

  • Besplatni paket — 3 skena mjesečno, bez kartice pri registraciji.
  • Pasivno BaaS fingerprintiranje — bez potrebe za verifikacijom domene.
  • Supabase, Firebase, Clerk, Auth0, Appwrite i još mnogo toga.
  • AI prompti za popravak na svakom nalazu — zalijepite natrag u Cursor / Claude Code.
Pokrenite besplatni BaaS sken

registracija nije potrebna

Supabase RLS skener: pronađite tablice s nedostajućim ili neispravnim row-level security — Docs · FixVibe