// docs / baas security / supabase rls scanner
Sganiwr RLS Supabase: dod o hyd i dablau heb ddiogelwch ar lefel rhes neu gyda diogelwch toredig
Diogelwch ar lefel rhes (RLS) yw'r unig beth sy'n sefyll rhwng data dy gwsmeriaid a'r rhyngrwyd pan fyddi'n llongio ap a gefnogir gan Supabase. Mae offer codio AI yn cynhyrchu cod siâp RLS sy'n crynhoi, yn llongio, ac yn gollwng data'n dawel — tablau a grëwyd heb RLS wedi'i alluogi, polisïau sy'n darllen ond byth yn cyfyngu, rhagfynegiadau sy'n cymharu colofn â'i hun. Mae'r erthygl hon yn dangos beth y gall sganiwr RLS Supabase ei brofi o'r tu allan, y pedair ffurf RLS toredig sy'n ymddangos mewn apiau wedi'u codio gan deimlad, a sut i sganio dy leoliad dy hun mewn llai na munud.
Beth all sgan RLS allanol ei brofi
Mae sgan RLS goddefol yn rhedeg yn erbyn y pwynt terfyn PostgREST y mae Supabase yn ei amlygu yn https://[project].supabase.co/rest/v1/. Mae'n defnyddio dim ond yr allwedd cyhoeddadwy anon — yr un allwedd y mae dy borwr yn ei defnyddio — ac yn olrhain am fetaddata rhestr tablau, darlleniadau anhysbys, ac ysgrifennu anhysbys. Nid yw byth yn dilysu fel defnyddiwr ac nid yw byth yn cyffwrdd â breintiau service-role. Beth bynnag y gall ei wneud, gall ymosodwr heb ei ddilysu ar y rhyngrwyd ei wneud.
O'r tu allan i'r gronfa ddata, gall sganiwr gadarnhau'r canlynol gyda hyder uchel:
- Mae RLS wedi'i analluogi ar dabl. Mae PostgREST yn dychwelyd rhesi ar gyfer
SELECTanhysbys pan fydd RLS i ffwrdd neu pan fydd polisi'n ei ganiatáu. Mae'r naill achos neu'r llall yn ganfyddiad. - Gall yr ymrôl anhysbys restru tablau. Mae
GET /rest/v1/gyda'r allwedd anon yn dychwelyd y sgema OpenAPI ar gyfer pob tabl y mae gan yr ymrôlanonunrhyw fraint arno. Mae apiau a gynhyrchwyd gan AI yn aml yn rhoiUSAGEar y sgema aSELECTar bob tabl, sy'n datgelu'r map sgema llawn hyd yn oed pan fydd RLS yn gwadu'r darlleniadau gwirioneddol. - Gall yr ymrôl anhysbys fewnosod. Bydd
POSTarchwiliol gyda dyfaliad ar siâp colofn yn llwyddo os nad oes gan RLS bolisiINSERTyn ei wadu — hyd yn oed os ywSELECTwedi'i gloi i lawr. - Mae'r allwedd service-role yn y bwndel porwr. Yn gyfagos i RLS: os yw sganiwr yn canfod
SUPABASE_SERVICE_ROLE_KEYneu unrhyw JWT gydarole: service_roleyn y bwndel JavaScript, mae RLS yn ddibwys — mae'r deiliad o'r allwedd honno'n osgoi pob polisi.
Beth na all sgan allanol ei brofi
Bydd yn onest am ffiniau'r sganiwr. Ni all sgan RLS allanol ddarllen dy dabl pg_policies, dy ffeiliau mudo, na rhagfynegiad union unrhyw bolisi. Mae'n casglu o ymddygiad blwch-du, sy'n golygu y bydd weithiau'n adrodd am ganfyddiad sy'n troi allan i fod yn ddata cyhoeddus bwriadol (tabl cylchlythyr marchnata, catalog cynnyrch cyhoeddus). Mae adroddiad FixVibe yn fflagio'r rhain fel hyder canolig pan na all y sganiwr wahaniaethu bwriad — adolyga enw'r tabl a phenderfyna.
Y pedair ffurf RLS toredig y mae offer AI yn eu cynhyrchu
Pan fyddi'n pwyntio Cursor, Claude Code, Lovable, neu Bolt at Supabase, mae'r un pedwar patrwm RLS toredig yn ymddangos ar draws miloedd o apiau. Mae pob un yn pasio gwiriad math, yn crynhoi, ac yn llongio:
Ffurf 1: Ni alluogwyd RLS erioed
Y modd methiant mwyaf cyffredin. Mae'r mudo'n creu'r tabl ond mae'r datblygwr (neu'r offeryn AI) yn anghofio ALTER TABLE ... ENABLE ROW LEVEL SECURITY. Mae PostgREST yn hapus i wasanaethu'r tabl cyfan i unrhyw un â'r allwedd anon. Trwsio: ALTER TABLE public.[name] ENABLE ROW LEVEL SECURITY; ALTER TABLE public.[name] FORCE ROW LEVEL SECURITY;. Nid yw FORCE yn ddewisol — heb hynny, mae perchennog y tabl (ac unrhyw ymrôl sydd â pherchnogaeth tabl) yn osgoi RLS.
ALTER TABLE public.[name] ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.[name] FORCE ROW LEVEL SECURITY;Ffurf 2: RLS wedi'i alluogi, dim polisïau
Methiant mwy cynnil. Mae RLS wedi'i alluogi ond ni ysgrifennir unrhyw bolisïau. Y diofyn yn PostgreSQL yw gwrthod, felly nid yw defnyddwyr dilysedig yn gweld dim — ac mae'r datblygwr yn ychwanegu USING (true) i wneud i'r ap weithio, sy'n caniatáu i bawb ddarllen popeth. Trwsio: ysgrifenna bolisi sy'n cwmpasu yn ôl auth.uid(): CREATE POLICY "select_own" ON public.[name] FOR SELECT USING (auth.uid() = user_id); a pholisi INSERT/UPDATE/DELETE cyfatebol.
CREATE POLICY "select_own"
ON public.[name]
FOR SELECT
USING (auth.uid() = user_id);Ffurf 3: Polisi'n cymharu colofn â'i hun
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.
Ffurf 4: Polisi ar SELECT ond nid ar INSERT/UPDATE
Mae'r datblygwr yn cloi darlleniadau i lawr ond yn anghofio ysgrifennu. Mae polisïau RLS yn ôl gorchymyn. Mae FOR SELECT yn diogelu darlleniadau yn unig; gall cleient anhysbys INSERT o hyd os nad oes polisi'n ei wadu. Trwsio: awdura bolisi fesul gorchymyn, neu defnyddia FOR ALL gyda chymalau USING a WITH CHECK penodol.
Sut mae sganiwr RLS Supabase FixVibe yn gweithio
Mae'r gwiriad baas.supabase-rls yn rhedeg mewn tri cham, pob un â lefelau hyder penodol:
- Cam 1 — olrhain. Mae'r sganiwr yn cropian yr ap a leolwyd, yn dosrannu ei fwndel JavaScript, ac yn echdynnu URL prosiect Supabase a'r allwedd anon o'r cyfluniad amser rhedeg. Dim dyfalu DNS, dim grym creulon — mae'n darllen yr hyn y mae'r porwr yn ei ddarllen.
- Cam 2 — darganfod sgema. Mae un
GET /rest/v1/gyda'r allwedd anon yn dychwelyd y sgema OpenAPI ar gyfer pob tabl y gall yr ymrôl anon ei weld. Mae'r sganiwr yn cofnodi enwau tablau ond nid yw'n darllen data rhes yn y cam hwn. - Cam 3 — archwiliadau darllen ac ysgrifennu. Ar gyfer pob tabl a ddarganfuwyd, mae'r sganiwr yn cyhoeddi un
SELECTanhysbys gydalimit=1. Os yw rhesi'n dychwelyd, mae RLS yn rhy ganiataol. Mae'r sganiwr yn stopio yno — nid yw'n rhifo rhesi, nid yw'n tudalennu, nid yw'n addasu data. Mae archwiliadau INSERT yn cael eu gosod y tu ôl i ddilysu perchnogaeth parth a'u cytuno'n benodol; nid ydynt byth yn tanio yn erbyn targedau heb eu dilysu.
Mae pob canfyddiad yn llongio gyda'r URL cais union, statws ymateb, siâp ymateb (pennawd yn unig), ac enw'r tabl. Mae'r awgrym trwsio AI ar waelod y canfyddiad yn floc SQL copïo-gludo y byddi'n ei redeg yng ngolygydd SQL Supabase.
Beth i'w wneud pan fydd y sganiwr yn dod o hyd i rywbeth
Mae pob canfyddiad RLS yn argyfwng amser rhedeg. Mae pwyntiau terfyn cyhoeddus PostgREST yn cael eu sganio gan ymosodwyr mewn munudau. Mae'r dilyniant adfer yn fecanyddol:
- Archwilia bob tabl. Rheda
SELECT schemaname, tablename, rowsecurity FROM pg_tables WHERE schemaname = 'public';yng ngolygydd SQL Supabase. Mae unrhyw res ârowsecurity = falseyn broblem. - Galluoga RLS ar bob tabl cyhoeddus. Diofyn at
ENABLE ROW LEVEL SECURITYaFORCE ROW LEVEL SECURITYar bob tabl a grëir — gwna'n dempled mudo. - Awdura bolisïau gorchymyn-wrth-orchymyn. Paid â defnyddio
FOR ALL USING (true). Ysgrifenna bolisïau penodol ar gyfer SELECT, INSERT, UPDATE, DELETE — pob un wedi'i gwmpasu iauth.uid()neu golofn org-id oauth.jwt(). - Dilysa gydag ail gyfrif. Cofrestra fel defnyddiwr gwahanol, ceisia ddarllen cofnodion defnyddiwr arall trwy'r API REST yn uniongyrchol. Os yw'r ymateb yn
200, mae'r polisi'n doredig. - Ail-sganio. Ar ôl cymhwyso'r trwsiad, ail-redeg sgan FixVibe yn erbyn yr un URL. Dylai'r canfyddiad
baas.supabase-rlsglirio.
-- 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;Sut mae hyn yn cymharu â sganwyr eraill
Nid yw'r rhan fwyaf o offer DAST generig (Burp Suite, OWASP ZAP, Nessus) yn gwybod beth yw PostgREST. Byddant yn cropian dy ap, yn anwybyddu'r llwybr /rest/v1/, ac yn adrodd ar y tudalennau HTML y maent yn eu deall. Mae Snyk a Semgrep yn offer dadansoddiad statig — maent yn canfod ffeiliau mudo yn dy ystorfa gyda galwadau RLS coll, ond ni allant brofi bod y gronfa ddata a leolwyd wedi'i cham-gyflunio. Mae FixVibe yn eistedd yn y bwlch: goddefol, sy'n ymwybodol o BaaS, yn canolbwyntio ar yr hyn y gall ymosodwr heb ei ddilysu ei brofi o'r URL cyhoeddus.
Cwestiynau cyffredin
A fydd y sganiwr yn darllen neu'n addasu fy data?
Na. Mae sganiau goddefol yn cyhoeddi ar y mwyaf un SELECT ... limit=1 fesul tabl a ddarganfuwyd i gadarnhau a yw RLS yn caniatáu darlleniadau anhysbys. Mae'r sganiwr yn cofnodi siâp yr ymateb, nid cynnwys y rhes. Mae archwiliadau INSERT, UPDATE, a DELETE yn cael eu gosod y tu ôl i ddilysu perchnogaeth parth ac nid ydynt byth yn rhedeg yn erbyn targedau heb eu dilysu.
A yw hyn yn gweithio os yw fy mhrosiect Supabase wedi'i atal neu ar barth wedi'i deilwra?
Mae prosiectau wedi'u hatal yn dychwelyd 503 ar bob cais — mae'r sganiwr yn adrodd y prosiect fel un anghyrraeddadwy. Mae parthau wedi'u teilwra'n gweithio cyn belled â bod yr ap a leolwyd yn dal i lwytho SDK cleient Supabase yn y porwr; mae'r sganiwr yn echdynnu URL y prosiect o'r bwndel beth bynnag.
Beth os yw fy allwedd anon yn cael ei chylchdroi neu mae fy allwedd cyhoeddadwy'n newid?
Ail-redeg y sgan. Mae'r sganiwr yn ail-echdynnu'r allwedd o'r bwndel cyfredol ar bob rhediad. Mae cylchdroi yn annilysu'r adroddiad blaenorol yn unig, nid cyflwr polisi'r gronfa ddata.
A yw'r sganiwr yn gwirio model allwedd cyhoeddadwy newydd Supabase (<code>sb_publishable_*</code>)?
Ydy. Mae'r canfyddwr yn cydnabod JWT anon hen ac allweddi sb_publishable_* newydd ac yn eu trin yn unfath — mae'r ddau wedi'u bwriadu i fod yn gyhoeddus ac mae'r ddau'n gadael RLS fel yr unig linell amddiffyn.
Camau nesaf
Rheda sgan FixVibe am ddim yn erbyn dy URL cynhyrchu — mae'r gwiriad baas.supabase-rls wedi'i alluogi ar bob cynllun gan gynnwys yr haen am ddim. Am ddarlleniad dyfnach ar yr hyn arall a all ollwng o brosiect Supabase, gweler Allwedd service role Supabase wedi'i datgelu yn JavaScript a Rhestr wirio diogelwch bwced storio Supabase. Am yr olwg ymbarél ar draws pob darparwr BaaS, darllena Sganiwr cam-gyfluniad BaaS.
