
Next.js, Supabase और Stripe ऐप्स के लिए स्थानीय स्टैटिक सुरक्षा स्कैनर: लीक हुई कुंजियों, अनुपस्थित RLS और grants, और असुरक्षित webhooks के लिए 24 AST-आधारित जाँचें। CLI और GitHub Action।
Next.js + Supabase + Stripe ऐप्स के लिए मुफ़्त, लोकल सुरक्षा स्कैन: लीक हुई कुंजियाँ, गुम RLS और grants, असुरक्षित Stripe webhooks।
आपके AI एजेंट ने ऐप शिप कर दिया। लेकिन क्या उसने आपकी Stripe secret key, RLS के बिना एक टेबल, या ऐसा webhook भी शिप कर दिया जिसे कोई भी कॉल कर सकता है? एक कमांड इसे लोकल रूप से, एक सेकंड से भी कम समय में पता लगा लेता है।
npx github:edtrackai/nextjs-supabase-stripe-security-checker /path/to/your/app
यह अभी npm पर नहीं है, इसलिए npx इसे सीधे इस GitHub रेपो से चलाता है (Node 18+ और git आवश्यक है)।
- uses: edtrackai/nextjs-supabase-stripe-security-checker@v0
with:
fail-on: high
पूरा वर्कफ़्लो और अनुमतियाँ नीचे और docs/github-action.md में दी गई हैं।
Supabase RLS चेकर · Stripe webhook सुरक्षा · Next.js सुरक्षा स्कैन · Supabase Data API grants (42501)

git clone https://github.com/edtrackai/nextjs-supabase-stripe-security-checker.git
cd nextjs-supabase-stripe-security-checker && npm install
node bin/nss-security-check.js /path/to/your/app
Node 18 या बाद का संस्करण। एक निर्भरता (@babel/parser) है। यह मुफ़्त और MIT-लाइसेंस प्राप्त है, किसी खाते की आवश्यकता नहीं है, कोई नेटवर्क कॉल नहीं करता और आपका कोड कभी अपलोड नहीं करता।
--fail-on=high एग्ज़िट 1 देता है, और --json मशीन-पठनीय आउटपुट देता है।विज्ञापन (सशुल्क, वही लेखक): समाधान चाहिए? Launch Audit ($12 और लागू होने पर VAT) 28 जाँचें, बिना Edit या Write टूल वाला एक AI ऑडिटर एजेंट, और एक file:line फ़िक्स योजना जोड़ता है।
| फ़्लैग | यह क्या करता है |
|---|---|
--json | मशीन-पठनीय आउटपुट: {tool, version, root, filesScanned, counts, findings[]} |
--fail-on=<sev> | यदि कोई भी निष्कर्ष critical / high / medium / low पर या उससे ऊपर है तो एग्ज़िट 1 (none कभी विफल नहीं होता)। गलत आर्ग्युमेंट पर एग्ज़िट 2। |
--list | जाँच सूची प्रिंट करें |
--quiet | सशुल्क टूल के बारे में एक-पंक्ति फ़ुटर छोड़ें (केवल टर्मिनल पर stderr पर प्रिंट होता है; NO_PROMO=1, CI या GITHUB_ACTIONS के साथ भी बंद) |
--help | उपयोग |
CI में: node path/to/bin/nss-security-check.js . --fail-on=high, या GitHub Action का उपयोग करें (जॉब सारांश, एनोटेशन, एक स्टिकी PR टिप्पणी, केवल GITHUB_TOKEN)। उदाहरण वर्कफ़्लो और अनुमतियाँ docs/github-action.md में देखें।
# .github/workflows/security-check.yml
name: Security check
on: [pull_request]
permissions:
contents: read
pull-requests: write # only for the PR comment; drop it with comment: false
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: edtrackai/nextjs-supabase-stripe-security-checker@v0 # or pin @v0.5.0 / a commit SHA
with:
path: .
fail-on: high
परिवर्तन CHANGELOG.md में सूचीबद्ध हैं (0.5.0 Action जोड़ता है)।
| ID | गंभीरता | क्षेत्र | जाँच |
|---|---|---|---|
| K1 | critical | Keys | स्रोत में लाइव Stripe secret/restricted key (sk_live_/rk_live_), जिसमें + से विभाजित कुंजियाँ भी शामिल हैं (साक्ष्य redacted है) |
| K2 | critical | Keys | गुप्त जैसा दिखने वाला NEXT_PUBLIC_ वेरिएबल (service role, secret key, webhook secret…) |
| K3 | critical | Keys | मानों वाली .env फ़ाइल जो git द्वारा ट्रैक की गई है |
| K4 | critical | Keys | "use client" कंपोनेंट में उपयोग किया गया सर्वर secret या Supabase admin client |
| A1 | high | Auth | सर्वर पर getUser()/getClaims() के बजाय auth.getSession() पर भरोसा |
| A2 | high | Auth | Server Action बिना किसी auth जाँच के डेटा लिखता है |
| A3 | high | Auth | API route (POST/PUT/PATCH/DELETE) बिना किसी auth जाँच के डेटा लिखता है (webhook, cron और auth routes को छोड़कर) |
| A4 | high | Auth | अनुरोध द्वारा दिए गए id से admin client को क्वेरी किया गया, बिना owner फ़िल्टर के (IDOR) |
| A5 | medium | Auth | क्वेरी पैरामीटर से open redirect |
| R1 | critical | RLS | row level security के बिना बनाई गई टेबल |
| R2 | critical | RLS | using (true) / with check (true) वाली write policy |
| R3 | high | RLS | ऐसी policy जो anon भूमिका को लिखने देती है |
| R4 | high | RLS | निश्चित search_path के बिना security definer फ़ंक्शन |
| R5 | medium | RLS | public में बिना स्पष्ट GRANT वाली टेबल। Supabase ने घोषणा की थी कि वह 30 अक्टूबर 2026 से नई public टेबलों पर डिफ़ॉल्ट grants बंद कर देगा, लेकिन अगस्त के अंत में एक Supabase CLI मेंटेनर ने लिखा (supabase/cli PR #6337) कि पहले वाला डिफ़ॉल्ट परिवर्तन "कभी लागू ही नहीं हुआ" और होस्टेड प्रोजेक्ट्स अभी भी स्वतः grant कर रहे थे, इसलिए तारीख बदल सकती है: देखें कि आपका अपना प्रोजेक्ट क्या करता है। grant के बिना, Data API 42501 लौटाता है |
| R6 | high | RLS | anon/authenticated को व्यापक grant ... on all tables in schema public / alter default privileges ... grant (वह त्वरित 42501 समाधान जो RLS-रहित टेबलों को भी उजागर कर देता है) |
| S1 | critical | Stripe | हस्ताक्षर सत्यापन (constructEvent) के बिना Webhook |
| S2 | critical | Stripe | Webhook कच्चे body के बजाय request.json() को पार्स करता है |
| S3 | medium | Stripe | Webhook में event.id पर कोई idempotency नहीं |
| S4 | high | Stripe | अनुरोध से लिया गया Checkout मूल्य या राशि |
| S5 | high | Stripe | webhook के बजाय checkout success पेज पर एक्सेस दिया गया |
| S6 | medium | Stripe | Webhook dedupe जो विफल event को निगल सकता है: pending/completed स्थिति के बिना डुप्लिकेट छोड़े गए |
| S7 | low | Stripe | items.data[0] से पढ़ी गई billing अवधि (API 2025-03-31.basil से multi-item सदस्यताओं के लिए गलत) |
| H1 | medium | Hardening | next.config में कोई security headers नहीं |
| H2 | medium | Hardening | गैर-शाब्दिक मान के साथ dangerouslySetInnerHTML |
fixtures/vulnerable-app सभी 23 फ़ाइल-आधारित जाँचों को ट्रिगर करता है, और परीक्षण प्रत्येक को अपेक्षित फ़ाइल पर सत्यापित करते हैं। K3 का परीक्षण एक अस्थायी git रेपो पर होता है।fixtures/clean-app (एक hardened संदर्भ ऐप) और fixtures/near-miss (सुरक्षित कोड जो प्रत्येक गलती जैसा दिखता है: pending/completed idempotency वाले raw-body webhooks, multi-item-सुरक्षित अवधि लुकअप, सुरक्षित redirects, owner-फ़िल्टर किए गए admin queries, select using (true), JSON-LD) को 0 findings उत्पन्न करनी चाहिए।npm test node:test सूट चलाता है, जिसमें CLI flags और exit codes शामिल हैं। npm run smoke एक-पंक्ति सारांश देता है।