FixVibe

// docs / baas security / supabase service role exposure

Supabase service role key avdúkaður í JavaScript: hvat tað merkir og hvussu tað verður funnið

Supabase service role key er meistaralykilin til tín dátugrunn. Hvør tann, sum hevur hann, fer uttanum Row-Level Security, kann lesa hvønn dálk av hvørjari talvu og kann skriva ella strika nakað, sum tey vilja. Hann er gjørdur til at búgva einans í servara-kotu — aldri í kagaranum. Tá eitt AI-kotuamboð sendir hann til JavaScript-bunkan, er tín dátugrunnur, í veruleikanum, almennur. Henda greinin greiðir frá JWT-formini, sum eyðmerkir ein lekan lykil, hinum trimum AI-amboðsmynstrum, sum framleiða lekan, hvat tú skalt gera í fyrsta tíma eftir uppgøtan, og hvussu tú skannar fyri tað sjálvirkandi, áðrenn brúkarar gera.

Hvat service role key er

Supabase gevur tveir ymiskar lyklar út fyri hvørt projekt: anon-lykilin (eisini nevndur tann almenni lykilin í nýggjari projektum) og service_role-lykilin. Báðir eru JSON Web Tokens undirskrivaðir av tínum projektsins JWT-loyndarmáli. Munurin er role-krøvið innbakað í JWT-innihaldinum — anon fyri hin almenna lykil, service_role fyri meistaralykilin. PostgREST, Supabase Storage og Supabase Auth skifta øll í uttanumalt-um-modus, tá tey síggja service_role-krøvið.

Avkoda nakran Supabase-lykil á jwt.io og hygg at innihaldinum. Formin á einari service-role-JWT er ógjøgnumkomandi:

Avkodað innihald av einari service-role-JWT (víst sum eitt syntaks-merkt blokk niðanfyri).

json
{
  "iss": "supabase",
  "ref": "[project-ref]",
  "role": "service_role",
  "iat": 1700000000,
  "exp": 2000000000
}

Nýggjari Supabase-projekt geva loyndar-stíl lyklar út við forsetningini sb_secret_ í staðin fyri eina JWT. Atferðin er sama — alt, sum hevur sb_secret_ í einum almennum bunka, er júst so katastrofalt.

Hvussu AI-kotuamboð leka service role key

Vit hava sæð somu tríggj mynstrini í túsundtals vibe-kotaðum appum. Hvørt byrjar við einum menningarmanni, sum biður eitt AI-amboð um hjálp, og endar við tí, at service-lykilin er innlagdur í ein bunka.

Mynstur 1: Einstøk .env-fíla við NEXT_PUBLIC_-forsetningi

Menningarmaðurin biður AI-amboðið um at "seta Supabase upp" og góðtekur eina einstøka .env við báðum lyklum. AI-amboðið — venjað á einum korpusi, har flestu umhvørvi-broytur verða avdúkaðar gjøgnum NEXT_PUBLIC_* — setur báðum forsetningina NEXT_PUBLIC_. Next.js innleggur alt, sum samsvarar tí forsetningini, í klient-bunkan við bygging. Avgreiða til Vercel, og service-lykilin er í main.[hash].js.

Mynstur 2: Skeivur lykil í createClient-kalli

Menningarmaðurin innsetur báðar lyklar í eina config.ts-fílu, sum AI'in framleiddi, og AI'in fyllir kagara-síðu-createClient()-kallið við process.env.SUPABASE_SERVICE_ROLE_KEY við feil. Bygging dregur broytuna inn, og JWT-in lendir í bunkanum.

Mynstur 3: Service-role-lykil harðkotaður í seed-skriftum

Menningarmaðurin biður AI-amboðið um at skriva eina skrift, sum sáar dátugrunnin. AI'in harðkotar service-role-lykilin beinleiðis inn í fíluna (í staðin fyri at lesa frá umhvørvinum), commitir fíluna til repositoriið, og hin almenni GitHub-repo ella tann deployaða appins /scripts/seed.js-leið veitir nú lykilin.

Hvussu FixVibes bunka-skanning uppgøtar lekan

FixVibes bundle-secrets-eftirkanning lastar niður hvørja JavaScript-fílu, sum hin deployaði appin vísir á — entry-bitar, leysblastir bitar, web workers, service workers — og koyrir tær gjøgnum ein detektor, sum avkodar alt, sum samsvarar JWT-formini (eyJ[base64-header].eyJ[base64-payload].[signature]). Um avkodaða innihaldið hevur "role": "service_role", fráboðar skanningin tað sum eina kritiska finding við fílu-leiðini og neyvu linjuni, har lykilin er. Sama eftirkanning samsvarar eisini nýggjara sb_secret_*-mynstri við forsetningi.

Skanningin vátta seg ongantíð við hinum uppgøtaða lykli. Hon eyðmerkir formina og fráboðar lekan — at brúka lykilin fyri at prógva nýtsluvirkni hevði verið óloyvt atgongd til tínan dátugrunn. Prógvið er í JWT-innihaldinum sjálvum.

Uppgøtað — hvat at gera í fyrsta tíma

Ein lekan service role key er ein runtime-neyðstøða. Royn, at lykilin er skrapaður — árásarmenn fylgja við almennum bunkum í realtíð. Viðger dátugrunnin sum kompromitteraðan, til tú hevur rotað lykilin og endurskoðað nýligar virksemi.

  1. Rotara lykilin beinanvegin. Í Supabase Dashboard fer til Project Settings → API → Service role key → Reset. Hin gamli lykilin er ógyldiður innan sekunda. Allur servara-síðu-koturin, sum brúkar lykilin, má verða dagført og endurdeployaður, áðrenn rotering lendir.
  2. Endurskoða nýligt dátugrunnsvirksemi. Lat Database → Logs upp í dashboardinum. Sía á seinastu 7 dagar. Leita eftir óvanligum SELECT *-fyrispurningum móti talvum við PII, stórum UPDATE- ella DELETE-uppgerðum og fyrispurningum frá IP-adressum uttanfyri tína kendu infrastruktur. Supabase loggar x-real-ip-headaran á hvørjari fyrispurning.
  3. Eftirkanna goymsluobjekt. Vita Storage → Logs og endurskoða nýligar fílu-niðurlastingar. Ein lekan service-role-lykil gevur uttanumalt-um-atgongd eisini til privatar bøttur.
  4. Tak lykilin úr koduvarðveitslu. Sjálvt eftir rotering merkir tað, at lata JWT vera í tíni git-søgu, at hon er uppgøtanlig í hinum almenna repoinum. Brúk git filter-repo ella BFG Repo-Cleaner fyri at skrapa hana úr søguni, og koyr síðan force-push (varga samstarvsfelagar fyrst).
  5. Skanna aftur eftir fixi. Koyr eina nýggja FixVibe-skanning móti hinari endurdeployaðu appini. Bundle-secrets-findingin eigur at hvørva. Vátta at eingin service_role-JWT og eingin sb_secret_*-streingur er eftir í nøkrum bita.

At forða fyri lekan í fyrsta lagi

Hin strukturella fixin er navnaagi plús amboðs-stigs vernarmúrur:

  • Set ongantíð forsetningina NEXT_PUBLIC_*, VITE_* ella nakra aðra bunka-innleggjandi forsetning fyri service-lykilin. Navnasamleikin er markið — hvør ramma virðir tað.
  • Hav service-lykilin út úr .env heilt á menningar-maskinuni. Les hann úr einum loyndarmáls-stjóra (Doppler, Infisical, Vercel encrypted env vars) við deploying, commit hann aldri staðiliga.
  • <strong>Mark every Supabase client construction with explicit context.</strong> Files named <code>supabase/browser.ts</code> use the anon key; files named <code>supabase/server.ts</code> use the service-role key with <code>import 'server-only'</code> at the top. The <code>server-only</code> import causes a build error if a client component tries to consume the module.
  • <strong>Add a pre-commit hook that greps for JWT-shaped strings.</strong> <code>git diff --staged | grep -E 'eyJ[A-Za-z0-9_-]+\.eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+'</code> catches both anon and service tokens before they leave your machine.
  • Legg eitt CI-stig afturat, sum skannar byggingar-úttakið. Eftir next build, grep .next/static/chunks/-úttakið fyri service_role-streingnum. Lat byggingina rinda, um nakað samsvarar.
bash
# Pre-commit hook: refuse any staged JWT-shaped string.
git diff --staged \
  | grep -E 'eyJ[A-Za-z0-9_-]+\.eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+' \
  && echo "JWT detected in staged changes — refusing commit" \
  && exit 1

# CI gate: fail the build if "service_role" shipped to the static bundle.
grep -RE 'service_role|sb_secret_' .next/static/chunks/ \
  && echo "Service-role credential leaked into bundle" \
  && exit 1

Ofta settir spurningar

Hvussu skjótt finna árásarmenn lekaðar Supabase service-role-lyklar?

Almenn-bunka-skannarar trolla nýggj deploymenti innan minuttir. Granskarar hava skjalfest virkandi nýtslur móti nýggjum Supabase-projektum á minni enn einum tíma frá fyrsta deploymenti. Viðger nakra service-role-avdúkan sum eitt 60-minutta vindeyga, ikki sum eitt 60-daga vindeyga.

Er rotering nóg mikið, ella má eg roynda dátu-útdráking?

Rotering ógyldir hin lekaða lykilin men ger ikki um dátur, sum longu eru dripnar. Um tínar talvur hava PII, gjaldsdátur ella nakrar regulerar dátur, hevur tú máská eina fráboðanarskyldu undir GDPR (72 tímar), CCPA ella HIPAA. Endurskoða loggar og ráðfør lógligan ráðgeva, um endurskoðanin vísir at vísa hesa atgongd.

Kann RLS verja meg, um service-role-lykilin lekkir?

Nei. Row-Level Security verður heilt umrunnin av service_role-krøvinum. Tað er við ætlan — lykilin er júst til, fyri at lata backend-kotu hoppa um RLS fyri admin-uppgávur. Bótin er at tryggja, at lykilin ongantíð kemur fram til samanhangi, har árásarmaður kann lesa hann.

Eigur hetta um til nýggja Supabase-almenna / loyndarmáls-lyklamyndina (<code>sb_publishable_</code> / <code>sb_secret_</code>)?

Ja — sami váðaflokkur. sb_secret_*-lykilin er hin nýggi loyndar-lykla-formurin, sum kemur í staðin fyri service-role-JWT'in í nýggjari projektum. Alt, sum hevur sb_secret_* í einum bunka, er júst so katastrofalt sum ein lekan service-role-JWT. FixVibes bundle-secrets-detektor samsvarar báðar formir.

Hvat um anon / almenna lykilin — er hann trygg í bunkanum?

Ja, við ætlan. Anon-lykilin er ætlaður at búgva í kagaranum og er tað, sum hvør Supabase-web-klientur brúkar. Hansara trygd hongur heilt um, at RLS er rætt skipa á hvørjari almennari talvu. Sí Supabase RLS-skannara-greinina fyri hvat at kanna.

Næstu stig

Koyr eina FixVibe-skanning móti tíni framleiðslu-URL — bundle-secrets-eftirkanningin er ókeypis, eingin tilmelding, og fráboðar service_role-avdúkan á minni enn einum minuttu. Pør hetta við Supabase RLS-skannara-greinini til at vátta at RLS-lagið ger sítt arbeiði og Supabase goymslubøtta-trygdarlistanum fyri at læsa fílu-atgongd. Fyri bakgrund um, hví AI-amboð framleiða henda lekaflokk so álitsligt, les Hví AI-kotuamboð lata trygdarholur eftir.

// skanna tína baas-yvirflatu

Finn ta opnu talvuna, áðrenn onkur annar ger tað.

Set eina framleiðslu-URL inn. FixVibe telur upp tær BaaS-veitarar, sum tín app tosar við, fingraavryggjar teirra alment endapunkt og fráboðar, hvat ein óvátt klientur kann lesa ella skriva. Ókeypis, eingin innleggjing, eitt einki kort.

  • Ókeypis støði — 3 skanningar/mánaði, einki kort við tilmelding.
  • Passiv BaaS-fingraavrygging — eingin domena-vátting kravd.
  • Supabase, Firebase, Clerk, Auth0, Appwrite og fleiri.
  • AI-fix-leiðbeiningar á hvørjari findingi — set aftur inn í Cursor / Claude Code.
Supabase service role key avdúkaður í JavaScript: hvat tað merkir og hvussu tað verður funnið — Docs · FixVibe