Launch sale: 20% off Fix Pack, Deep Audit and Monitor through Nov 30, 2026. The scan stays free. See sale prices →
Home / Sample report

Sample report: our own test app

This is a sample, not a real customer's app.

It's a real, unedited scan by the live Unspill scanner of unspill-fixture.vercel.app, a test app we built and own. We planted fake secrets, an exposed .env file, a .git folder and source maps in it on purpose, so it scores badly. None of the keys are real. Evidence is masked exactly as it is in every real report. Scanned 2026-10-26 13:27 EDT.

F
Score 0/100
https://unspill-fixture.vercel.app/ · 7 requests · 0.3s · 2026-10-26 13:27 EDT
6 Critical1 High5 Medium2 Verify4 Low2 Info

In a real app you'd fix the 7 critical/high issues first. For leaked keys: revoke them at the provider before anything else.

CriticalYour .env file is publicly downloadable

Anyone can download every secret in this file. Treat all of them as compromised.

https://unspill-fixture.vercel.app/.env: 3 variable(s): DATABASE_URL, STRIPE_SECRET_KEY, JWT_SECRET (values hidden)
How to fix
  1. Delete .env from the deployed/public directory and redeploy.
  2. Rotate every secret that was in the file.
  3. Add .env* to .gitignore and keep env values in your host's environment-variable settings.
CriticalStripe secret key exposed in your front-end code

Everything shipped to the browser is public. Rotate (revoke and re-issue) these keys first, then move them server-side.

sk_live_…test (39 chars) · Live Stripe secret/restricted key (sk_live_/rk_live_; Clerk also uses sk_live_) · in unspill-fixture.vercel.app/assets/app.js
How to fix
  1. Roll the key now in the Stripe Dashboard (Developers → API keys → ⋯ → Roll key).
  2. Remove it from client code and VITE_/NEXT_PUBLIC_ variables; keep only pk_ keys in the browser.
  3. Create Checkout Sessions/PaymentIntents in a server function and verify webhooks server-side with whsec_.
  4. Review Stripe Dashboard → Developers → Logs for API calls you did not make.
CriticalAI provider API key exposed in your front-end code

Everything shipped to the browser is public. Rotate (revoke and re-issue) these keys first, then move them server-side.

sk-ant-a…mnop (67 chars) · Anthropic API key (sk-ant-) · in unspill-fixture.vercel.app/assets/app.js
sk-proj-…cdef (52 chars) · OpenAI API key (sk-proj-/sk-svcacct-/sk-admin-) · in unspill-fixture.vercel.app/assets/app.js
How to fix
  1. Revoke the key in your provider's dashboard and create a new one.
  2. Set a monthly spend limit at the provider.
  3. Call the AI API from a server function that keeps the key in a server-only env variable.
  4. Add authentication and per-user rate limits to that function so it can't become a free proxy.
CriticalAWS access key exposed in your front-end code

Everything shipped to the browser is public. Rotate (revoke and re-issue) these keys first, then move them server-side.

AKIAU…0000 (20 chars) · AWS access key ID · in unspill-fixture.vercel.app/assets/app.js
How to fix
  1. Deactivate and delete the key in IAM → Users → Security credentials.
  2. Check CloudTrail and Billing for activity you didn't start.
  3. Use S3 presigned URLs generated by a server function for uploads.
  4. Give server credentials least-privilege IAM policies.
CriticalPrivate key / service-account credentials exposed

Everything shipped to the browser is public. Rotate (revoke and re-issue) these keys first, then move them server-side.

-----BEG…KE00 (94 chars) · Private key block (e.g. Firebase/Google service-account credentials) · in unspill-fixture.vercel.app/assets/app.js
How to fix
  1. Delete the key: Google Cloud Console → IAM & Admin → Service Accounts → Keys.
  2. Remove the JSON file and firebase-admin from client code.
  3. Use the regular Firebase web SDK in the browser, protected by Security Rules.
  4. Run admin tasks only in Cloud Functions or another server.
CriticalSupabase service_role / secret key exposed (full database access)

Everything shipped to the browser is public. Rotate (revoke and re-issue) these keys first, then move them server-side.

eyJhbGci…0000 (196 chars) · Supabase service_role JWT (bypasses Row Level Security) · in unspill-fixture.vercel.app/assets/app.js
How to fix
  1. Rotate now: in the Supabase dashboard go to Project Settings → API keys and roll/revoke the exposed secret or service_role key.
  2. Remove it from all client code and any VITE_/NEXT_PUBLIC_ env variable.
  3. Move privileged queries into an Edge Function or server route that reads the key from a server-only secret.
  4. Review your database for unexpected changes, and check Auth users and Storage for anything you did not create.
HighYour .git folder is publicly accessible

Attackers can often download your whole repository history, including secrets that were ever committed.

https://unspill-fixture.vercel.app/.git/config is readable (remote: https://github.com/example/unspill-fake-fixture.git)
How to fix
  1. Remove .git from the deployed directory, or block /.git in your server config.
  2. Rotate any secret that has ever been committed to the repo.
  3. Deploy from a build output folder or via Git integration instead of uploading the project folder.
MediumNo Content-Security-Policy header
How to fix
  1. Add a Content-Security-Policy header via vercel.json, _headers or next.config.js.
  2. Start with Content-Security-Policy-Report-Only to see what would break, then enforce.
  3. Allow your API/Supabase domains in connect-src.
MediumPage can be framed by any site (no X-Frame-Options or CSP frame-ancestors)
How to fix
  1. Add X-Frame-Options: DENY (or SAMEORIGIN if you embed yourself).
  2. Or add frame-ancestors 'none' to your Content-Security-Policy.
MediumInsecure http:// scripts, frames or styles on an HTTPS page

Browsers block or warn on these; anything loaded over HTTP can be tampered with.

http://example.com/insecure-demo.js
How to fix
  1. Change the listed http:// URLs to https://.
  2. If a resource has no HTTPS version, host it yourself.
  3. Optionally add upgrade-insecure-requests to your CSP.
MediumSource maps are publicly downloadable

Anyone can rebuild your original front-end source code (comments, file names, internal routes) from these.

unspill-fixture.vercel.app/maps/app-js-map.json
How to fix
  1. Vite: set build.sourcemap to false (or 'hidden' and upload maps to your error tracker).
  2. Next.js: make sure productionBrowserSourceMaps is not set to true.
  3. Redeploy, and check that yourfile.js.map now returns 404.
MediumPossible hard-coded secrets in your front-end code

Everything shipped to the browser is public. Rotate (revoke and re-issue) these keys first, then move them server-side.

Zx9qL2…6sD1 (24 chars) · Possible hard-coded secret in "adminPassword" · in unspill-fixture.vercel.app/assets/app.js
How to fix
  1. Look up each masked value in your code (search by the first characters shown).
  2. If it's a real secret: rotate it and move it server-side.
  3. If it's a public ID (e.g. analytics), you can ignore this finding.
VerifySupabase project detected: verify Row Level Security

Your Supabase URL and public (anon/publishable) key are in the page, which is normal. It also means anyone can query every table that lacks correct RLS policies. We did not query your database; run the 2-minute self-check in the guide.

Project ref(s): unspillfakeref000000
Public key: eyJhbGci…0000 (186 chars)
How to fix
  1. Open Supabase → SQL Editor and run the RLS status query from the guide.
  2. Enable RLS on every table in the public schema.
  3. Replace any policy that uses USING (true) on private data with one scoped to auth.uid().
  4. Open Supabase → Advisors → Security Advisor and fix every error it lists.
VerifyFirebase project detected: verify Security Rules

Firebase web config is public by design; your Firestore, Realtime Database and Storage rules are the only thing protecting data. We did not query them.

Project(s): unspill-fake
How to fix
  1. Firebase Console → Firestore → Rules: make sure there's no 'allow read, write: if true'.
  2. Do the same for Realtime Database and Storage.
  3. Scope access with request.auth.uid.
  4. Use the Rules Playground to test as an unauthenticated user.
LowMissing X-Content-Type-Options: nosniff
How to fix
  1. Add X-Content-Type-Options: nosniff to every response.
LowNo Referrer-Policy header
How to fix
  1. Add Referrer-Policy: strict-origin-when-cross-origin (or no-referrer).
LowInsecure http:// images/media on an HTTPS page
http://example.com/insecure-demo.png
How to fix
  1. Change the listed http:// URLs to https://.
  2. If a resource has no HTTPS version, host it yourself.
  3. Optionally add upgrade-insecure-requests to your CSP.
Low/api/users allows requests from any origin (*)

Fine for truly public data; risky if this route returns anything user-specific.

Access-Control-Allow-Origin: * (status 204)
How to fix
  1. Allow only your own front-end origins (an explicit list), never reflect the request's Origin.
  2. Never combine credentials: true with a wildcard or reflected origin.
  3. Public, non-user data can keep *; anything user-specific can't.
InfoNo Permissions-Policy header
How to fix
  1. Add Permissions-Policy: camera=(), microphone=(), geolocation=() (leave out any feature you use).
InfoGoogle API key in client code: make sure it's restricted

Firebase web keys are meant to be public. Other Google keys (Maps, Gemini/AI Studio) must be restricted by HTTP referrer and API, or kept server-side.

AIzaSyUN…5678 (39 chars)
How to fix
  1. Google Cloud Console → APIs & Services → Credentials: add HTTP referrer restrictions and limit the key to the APIs it needs.
  2. Never call Gemini directly from the browser with an AI Studio key; proxy it server-side.

What we checked

PASSHTTPS
FAILContent-Security-Policy
PASSHSTS
FAILClickjacking protection
FAILX-Content-Type-Options
FAILReferrer-Policy
CHECKPermissions-Policy
FAILMixed content
PASSClient JavaScript scanned (1 file(s) of 2+ referenced)
FAILPublic source maps
FAIL/.env not public
FAIL/.git/config not public
CHECKCORS on /api/users
FAILSecrets in client code (1 JS file(s) + HTML)
CHECKSupabase RLS (manual verification needed)
CHECKFirebase rules (manual verification needed)

Passive check of public files only. It cannot see your database rules, server code, or whether one logged-in user can read another user's data.

Scan your own app free  Passive, no signup. Only scan apps you own.

Also compare: Unspill vs Lovable Security Scan vs Supabase Security Advisor.