supabase-extract-db-string
CRITICAL - Detect exposed PostgreSQL database connection strings in client-side code. Direct DB access is a P0 issue.
What this skill does
# Database Connection String Detection > ๐ด **CRITICAL: PROGRESSIVE FILE UPDATES REQUIRED** > > You MUST write to context files **AS YOU GO**, not just at the end. > - Write to `.sb-pentest-context.json` **IMMEDIATELY after each discovery** > - Log to `.sb-pentest-audit.log` **BEFORE and AFTER each action** > - **DO NOT** wait until the skill completes to update files > - If the skill crashes or is interrupted, all prior findings must already be saved > > **This is not optional. Failure to write progressively is a critical error.** This skill detects if PostgreSQL database connection strings are accidentally exposed in client-side code. ## When to Use This Skill - As part of every security audit - When reviewing code before production - When Supabase database access is suspected ## Prerequisites - Target application accessible - Supabase detection completed (auto-invokes if needed) ## Why This Is Critical Exposed database connection strings allow: | Impact | Description | |--------|-------------| | ๐ด Direct DB Access | Bypass API, connect directly to PostgreSQL | | ๐ด Full Data Access | Read/write all data without RLS | | ๐ด Schema Access | View and modify database structure | | ๐ด User Enumeration | Access auth.users table directly | **This is a P0 (Critical) finding requiring immediate action.** ## Connection String Patterns ### Supabase Database URL ``` postgresql://postgres:[password]@db.[project-ref].supabase.co:5432/postgres ``` ### Connection String Components | Component | Example | Sensitivity | |-----------|---------|-------------| | Host | `db.abc123.supabase.co` | Medium | | Port | `5432` | Low | | Database | `postgres` | Low | | Username | `postgres` | Medium | | Password | `[your-password]` | ๐ด Critical | ### Pooler Connection (Supavisor) ``` postgresql://postgres.[project-ref]:[password]@aws-0-us-east-1.pooler.supabase.com:6543/postgres ``` ## Detection Patterns ### 1. Full Connection Strings ```javascript // โ CRITICAL - Full connection string const dbUrl = 'postgresql://postgres:[email protected]:5432/postgres' ``` ### 2. Environment Variable Leaks ```javascript // โ Exposed in client bundle process.env.DATABASE_URL process.env.POSTGRES_URL process.env.SUPABASE_DB_URL ``` ### 3. Partial Exposure ```javascript // โ ๏ธ Password exposed separately const DB_PASSWORD = 'MySecretPass123' const DB_HOST = 'db.abc123.supabase.co' ``` ### 4. ORM Configuration ```javascript // โ Database config in client code const prisma = new PrismaClient({ datasources: { db: { url: 'postgresql://postgres:[email protected]:5432/postgres' } } }) ``` ## Usage ### Basic Check ``` Check for database connection strings on https://myapp.example.com ``` ### Deep Scan ``` Deep scan for DB credentials on https://myapp.example.com ``` ## Output Format ### No Connection String Found (Good) ``` โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ DATABASE CONNECTION STRING CHECK โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ Status: โ No database connection strings detected Scanned: โโโ JavaScript bundles: 5 files analyzed โโโ PostgreSQL patterns: None found โโโ Connection strings: None found โโโ Password patterns: None found Result: PASS - No direct database credentials exposed โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ ``` ### Connection String FOUND (Critical) ``` โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ ๐ด CRITICAL: DATABASE CONNECTION STRING EXPOSED โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ Severity: P0 - CRITICAL Status: โ PostgreSQL connection string found in client code! โ ๏ธ IMMEDIATE ACTION REQUIRED โ ๏ธ Connection String: postgresql://postgres:MySecr***@db.abc123def.supabase.co:5432/postgres (Password partially redacted in display, full value in context file) Parsed Components: โโโ Host: db.abc123def.supabase.co โโโ Port: 5432 โโโ Database: postgres โโโ Username: postgres โโโ Password: [EXPOSED] โ CRITICAL Location: โโโ /static/js/api.chunk.js (line 234) const DATABASE_URL = 'postgresql://postgres:...' Impact Assessment: โโโ ๐ด Direct PostgreSQL access possible โโโ ๐ด All RLS policies bypassed โโโ ๐ด Can access auth.users table โโโ ๐ด Can modify database schema โโโ ๐ด Full data exfiltration possible โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ IMMEDIATE REMEDIATION STEPS โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ 1. CHANGE DATABASE PASSWORD NOW โ Supabase Dashboard > Settings > Database > Reset database password 2. REMOVE FROM CLIENT CODE โ Delete connection string from source code โ Ensure DATABASE_URL is not in NEXT_PUBLIC_* or VITE_* env vars โ Redeploy application 3. AUDIT FOR ABUSE โ Check Supabase logs for direct PostgreSQL connections โ Review for unauthorized data access or modifications 4. USE PROPER ARCHITECTURE โ Client should ONLY use Supabase client library (REST API) โ Direct DB access should ONLY be from: - Edge Functions - Server-side code - Migration tools Documentation: โ https://supabase.com/docs/guides/database/connecting-to-postgres โ https://supabase.com/docs/guides/functions โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ ``` ## Context Output ```json { "findings": [ { "id": "DB_CONNECTION_STRING_EXPOSED", "severity": "P0", "title": "PostgreSQL Connection String Exposed", "description": "Database connection string with password found in client-side code", "location": { "file": "/static/js/api.chunk.js", "line": 234 }, "evidence": { "host": "db.abc123def.supabase.co", "port": 5432, "database": "postgres", "username": "postgres", "password_exposed": true }, "remediation": { "immediate": "Reset database password in Supabase Dashboard", "long_term": "Move DB operations to Edge Functions", "docs": "https://supabase.com/docs/guides/database/connecting-to-postgres" } } ], "supabase": { "db_string_exposed": true, "db_host": "db.abc123def.supabase.co" } } ``` ## Partial Exposure Even partial exposure is concerning: ``` โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ ๏ธ PARTIAL DATABASE CREDENTIALS FOUND โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ Severity: P1 - High Found: โโโ Database host: db.abc123def.supabase.co (line 45) โโโ Database password: [16 char string] (line 89) โโโ Could potentially be combined for access Recommendation: โ Rotate database password as precaution โ Remove all DB-related values from client code โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ ``` ## Common Causes | Cause | Solution | |-------|----------| | Wrong env prefix | Never use `NEXT_PUBLIC_DATABASE_URL` | | SSR code in client | Ensure server-only code stays server-side | | Bundler misconfiguration | Review webpack/vite config for env exposure | | Copy-paste error | Double-check what you're committing | ## Architecture Guidance ### Wrong (Direct DB in Client) ```javascript // โ NEVER in client code import { Pool } from 'pg' const pool = new Pool({ connectionString: process.env.DATABASE_URL // โ }) ``` ### Correct (API or Edge Function) ```javascript // โ Client uses Supabase client const { data } = await supabase .from('products') .select('*') // OR call an Edge Function for complex queries const { data } = await supabase.functions.invoke('complex-query') ``` ### Edge Function (Server-Side) ```typescript // supabase/functions/complex-query/index.ts import { createClient } from '@supabase/supabase-js' Deno.serve(async (req) => { // โ Direct DB access only on server const supabase = createClient( Deno.env.get('SUPABASE_URL'), Deno.env.get('SUPABASE_SERVICE_ROLE_KEY') ) // Complex query that can't be done via
Related in General
modeling-omnistudio-epc-catalog
IncludedSalesforce Industries CME EPC product-modeling skill for Product2-based catalog creation. Use when creating EPC products, configuring product attributes, building offer bundles with Product Child Items, or reviewing EPC DataPack JSON metadata for product catalog changes. TRIGGER when: user creates or updates Product2 EPC records, AttributeAssignment payloads, AttributeMetadata/AttributeDefaultValues, Offer bundles, or ProductChildItem relationships. DO NOT TRIGGER when: designing OmniScripts/FlexCards/Integration Procedures (use building-omnistudio-omniscript, building-omnistudio-flexcard, or building-omnistudio-integration-procedure), implementing Apex business logic (use generating-apex), or troubleshooting deployment pipelines (use deploying-metadata).
relationship-science-coach
IncludedUse this skill for direct, practical adult relationship coaching: couples conflict, repair, trust, marriage, dating, flirting, attachment patterns, emotional connection, sex, desire differences, eroticism, kink negotiation, affection, love languages, breakups, and long-term passion. Draw on Gottman, EFT and Hold Me Tight, attachment science, modern sex research, Perel, Nagoski, Kerner, Schnarch, Love and Stosny, and flexible love-language tools. Be concrete and low-hedge. Redirect only for imminent danger, abuse, coercive control, minors, non-consent, self-harm, stalking, or medical/legal/psychiatric decisions.
building-sf-integrations
IncludedSalesforce integration architecture and runtime plumbing with 120-point scoring. Use this skill to set up Named Credentials, External Credentials, External Services, REST/SOAP callout patterns, Platform Events, and Change Data Capture. TRIGGER when: user sets up Named Credentials, External Services, REST/SOAP callouts, Platform Events, CDC, or touches .namedCredential-meta.xml files. DO NOT TRIGGER when: Connected App/OAuth config (use configuring-connected-apps), Apex-only logic (use generating-apex), or data import/export (use handling-sf-data).
venue-templates
IncludedAccess comprehensive LaTeX templates, formatting requirements, and submission guidelines for major scientific publication venues (Nature, Science, PLOS, IEEE, ACM), academic conferences (NeurIPS, ICML, CVPR, CHI), research posters, and grant proposals (NSF, NIH, DOE, DARPA). This skill should be used when preparing manuscripts for journal submission, conference papers, research posters, or grant proposals and need venue-specific formatting requirements and templates.
let-fate-decide
IncludedDraws the 12 Houses of the Zodiac Tarot spread to inject entropy into planning when prompts are vague, ambiguous, or casually delegated. Interprets the spread to guide next steps. Use when the user says 'let fate decide', 'YOLO', 'whatever', 'idk', or other nonchalant phrases, makes Yu-Gi-Oh references, or when you are about to arbitrarily pick between multiple reasonable approaches. Prefer over ask-questions-if-underspecified when the user's tone is casual or playful rather than precision-seeking.
net-ops
IncludedCross-platform network troubleshooting (Windows, macOS, Linux) via local or remote shell. Use for: DNS broken, can't resolve hostnames, nslookup/dig works but apps fail, NRPT, WFP, scutil, /etc/resolver, systemd-resolved, /etc/resolv.conf, NetworkManager, VPN DNS leak residue (ProtonVPN/Mullvad/WireGuard/AnyConnect), AV/firewall blocking DNS or DoH, Tailscale DNS interaction, intermittent connectivity, remote diagnostics over SSH.