FixVibe

// 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 SELECT anhysbys 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ôl anon unrhyw fraint arno. Mae apiau a gynhyrchwyd gan AI yn aml yn rhoi USAGE ar y sgema a SELECT ar 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 POST archwiliol gyda dyfaliad ar siâp colofn yn llwyddo os nad oes gan RLS bolisi INSERT yn ei wadu — hyd yn oed os yw SELECT wedi'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_KEY neu unrhyw JWT gyda role: service_role yn 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.

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

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

  1. 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.
  2. 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.
  3. Cam 3 — archwiliadau darllen ac ysgrifennu. Ar gyfer pob tabl a ddarganfuwyd, mae'r sganiwr yn cyhoeddi un SELECT anhysbys gyda limit=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:

  1. Archwilia bob tabl. Rheda SELECT schemaname, tablename, rowsecurity FROM pg_tables WHERE schemaname = 'public'; yng ngolygydd SQL Supabase. Mae unrhyw res â rowsecurity = false yn broblem.
  2. Galluoga RLS ar bob tabl cyhoeddus. Diofyn at ENABLE ROW LEVEL SECURITY a FORCE ROW LEVEL SECURITY ar bob tabl a grëir — gwna'n dempled mudo.
  3. 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 i auth.uid() neu golofn org-id o auth.jwt().
  4. 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.
  5. Ail-sganio. Ar ôl cymhwyso'r trwsiad, ail-redeg sgan FixVibe yn erbyn yr un URL. Dylai'r canfyddiad baas.supabase-rls glirio.
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;

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.

// sganio dy wyneb baas

Canfod y tabl agored cyn i rywun arall wneud.

Gollwng URL cynhyrchu i mewn. Mae FixVibe yn rhifo'r darparwyr BaaS y mae dy ap yn siarad â hwy, yn olrhain eu pwyntiau terfyn cyhoeddus, ac yn adrodd ar yr hyn y gall cleient heb ei ddilysu ei ddarllen neu ei ysgrifennu. Am ddim, dim gosod, dim cerdyn.

  • Haen am ddim — 3 sgan / mis, dim cerdyn cofrestru.
  • Olrhain BaaS goddefol — dim angen dilysu parth.
  • Supabase, Firebase, Clerk, Auth0, Appwrite, a mwy.
  • Awgrymiadau trwsio AI ar bob canfyddiad — gludo'n ôl i Cursor / Claude Code.
Rhedeg sgan BaaS am ddim

dim angen cofrestru

Sganiwr RLS Supabase: dod o hyd i dablau heb ddiogelwch ar lefel rhes neu gyda diogelwch toredig — Docs · FixVibe