Find security flaws
before hackers do
Founders are getting billed $250k because a Gemini key leaked into their JS bundle. Stripe keys in client components. .env files served publicly. We scan your HTML and JS bundles for 17 secret patterns โ then give you an exact fix prompt for Claude, Cursor, or ChatGPT.
What attackers do the moment
they find your keys
Bots scan GitHub, JS bundles, and public sites 24/7. From key discovered to damage done โ under 60 seconds.
- โCreate unlimited charges to your customers' cards
- โIssue fake refunds to attacker-controlled accounts
- โDownload your full customer + payment database
- โCancel all active subscriptions instantly
- โYou get the chargebacks โ they keep the money
- โRun millions of AI API calls billed to your account
- โSell access to your key on black-market Telegram groups
- โUse your key to power their own AI product for free
- โBill: $10k/day is common. $250k cases have been reported
- โGoogle / OpenAI rarely waive the charges
- โDirect database access โ read every user's data
- โExport and sell your entire user list
- โDelete all data (ransomware โ pay or lose everything)
- โInject malicious content into your app
- โGDPR breach notification + potential fines
- โDownload 100% of your source code in minutes
- โFind hardcoded keys buried in old commits
- โUnderstand your auth logic and bypass it
- โClone and launch a competing product using your IP
- โFind other secrets in git history you forgot were there
Real attack timeline
The exact mistakes that get founders hacked
These aren't hypothetical. They're the actual lines of code we find in vibe-coded apps every day.
Prefixing secrets with NEXT_PUBLIC_
Most common mistakeClaude and Cursor often write NEXT_PUBLIC_ on env vars so they work in the browser. But NEXT_PUBLIC_ means the value is bundled into your JS and sent to every visitor.
// โ This goes into your JS bundle. Anyone can open DevTools and read it. NEXT_PUBLIC_OPENAI_API_KEY=sk-proj-... NEXT_PUBLIC_STRIPE_SECRET_KEY=sk_live_... // โ No prefix = server-only. Call it from an /api/ route instead. OPENAI_API_KEY=sk-proj-...
Calling AI APIs directly from a React component
Instant key exposureAI tools generate client-side fetch() calls to OpenAI, Gemini, or Anthropic to make things work quickly. Your secret key ships inside the JS bundle to every browser.
// โ This component renders in the browser. sk-... is visible in the bundle.
const res = await fetch("https://api.openai.com/v1/chat/completions", {
headers: { Authorization: `Bearer ${process.env.NEXT_PUBLIC_OPENAI_KEY}` }
});
// โ
Make the call in /app/api/chat/route.ts โ key never leaves the server..env committed to git, repo made public later
Permanent exposureYou start a private repo, commit .env early, then open-source the project or the repo accidentally becomes public. The key is in git history forever โ even after you delete the file.
# โ .env was committed on day 1. It's in git history permanently. git log --all -p | grep "sk_live_" # attackers run this first # โ Add .env to .gitignore BEFORE your first commit. # If it was already committed: rotate all keys, then use BFG to rewrite history.
Supabase service role key in the frontend
Full DB bypassCursor often copies the Supabase service role key into client code to skip Row Level Security errors during development. That key gives anyone admin-level database access โ bypassing all your RLS policies.
// โ service_role key bypasses ALL Row Level Security. Never use in browser. const supabase = createClient(url, process.env.NEXT_PUBLIC_SUPABASE_SERVICE_KEY) // โ Use the anon key in the browser. Use service_role only in server routes. const supabase = createClient(url, process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY)
Importing Stripe or OpenAI SDK directly in a client component
Entire SDK + key in browserWhen you import the Stripe or OpenAI Node SDK inside a React component (not a server route), Next.js bundles the entire SDK and your secret key into the JS file sent to every visitor. Anyone can open Network tab โ find the chunk โ search for 'sk_'.
// โ This is a client component. The whole OpenAI SDK ships to the browser.
import OpenAI from "openai" // โ Node SDK, not meant for browsers
const client = new OpenAI({ apiKey: process.env.NEXT_PUBLIC_OPENAI_KEY })
// Your sk-proj-... is now in _next/static/chunks/app/page-[hash].js
// Any visitor: DevTools โ Sources โ search "sk-" โ found.
// โ
Move to /app/api/generate/route.ts (server-only)
// import OpenAI only there. Client calls fetch("/api/generate") instead.Hardcoding keys directly in source โ 'I'll move it to .env later'
Never gets movedWhen prototyping fast, founders paste keys directly into code to skip the .env setup. It ships to production, gets committed to git, and 'later' never comes. This is how $250k Gemini bills happen.
// โ Hardcoded to 'test quickly' โ shipped to prod, committed to git.
const genAI = new GoogleGenerativeAI("AIzaSy...")
const stripe = new Stripe("sk_live_51...")
// Now it's in: git history, your JS bundle, and GitHub's public search index.
// GitHub's search finds exposed keys in seconds. So do bots.
// โ
Always start with .env, even on day 1 of prototyping.
const genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY!)From our last 1,000 scans of vibe-coded apps
Missing Content-Security-Policy
Source maps publicly exposed
API keys found in JS bundles
.env file returns 200
Most founders had no idea until they scanned.
19 checks across 9 categories
Most scanners only check HTTP headers. We go deeper โ fetching your actual JS bundles to find secrets hiding in client-side code, the #1 place vibe-coded apps leak keys.
HTTPS & Encryption
HTTPS, redirects, HSTS, mixed content detection
Security Headers
CSP, X-Frame-Options, XCTO, Referrer-Policy, SRI checks
API Key Leaks
Stripe, Gemini, OpenAI, Anthropic, Razorpay, AWS, Supabase service keys โ scanned in HTML and JS bundles
Exposed Files
.env, .git, backup.sql, package.json publicly accessible
Admin & API Endpoints
/admin, /wp-admin, /phpmyadmin, GraphQL introspection, Swagger docs
Source Code Leaks
Source maps (.js.map) + JS bundle contents scanned โ your full codebase readable by anyone with DevTools
Debug Mode & Stack Traces
Console.log left in production, error stack traces, dev mode indicators
CORS & Cookies
Wildcard CORS, missing Secure/HttpOnly/SameSite cookie flags
Server Info Disclosure
Server version, X-Powered-By exposing tech stack to attackers
Your site gets a security grade
Scored 0โ100, graded AโF. Know exactly where you stand.
Most vibe-coded apps score between C and F on their first scan.
One prompt. Every bug fixed.
Built only for your site.
After scanning, we generate a fix prompt written specifically for your domain, your stack, and your exact vulnerabilities โ not a generic checklist. Paste it into any AI and watch every security issue get resolved in minutes.
# Security Fix Prompt for yoursite.com
# Generated by AIExposureTool ยท 3/15/2026
Fix these security issues found on my site:
1. [CRITICAL] .env file is publicly
accessible at /. env โ move all
secrets to server env vars.
2. [HIGH] Source map exposed at
/main.js.map โ disable in build.
3. [MEDIUM] Missing CSP header โ
add Content-Security-Policy...
Specific to your domain & stack
Every prompt includes your actual URL, your real findings, and actionable steps โ not copy-paste boilerplate.
Sorted by severity
Critical issues first. The prompt tells your AI exactly what to fix and in what order so nothing gets missed.
Works with any AI coding tool
Paste into Claude, Cursor, ChatGPT, or Gemini. The prompt is formatted for immediate action โ no editing needed.
One scan โ zero vulnerabilities
Most founders fix every issue in under 30 minutes by just following what the prompt says.
How it works
Paste your URL
Enter your live site โ no install, no signup needed
We scan passively
Headers, files, source code โ read-only, nothing intrusive
Get fix prompts
Copy into Claude, Cursor, ChatGPT or Gemini to fix every issue instantly
Is your site safe right now?
Most founders are surprised by what we find. Run your free scan โ takes 10 seconds, no account needed.
Free for first scan ยท Upgrade to re-scan anytime