Severe
Bill-risk 100
A stranger could run up your API bill or read data that should have stayed private.
https://burnproof.dev/demo/sample · sample page · 2026-10-14 12:00:00 UTC
- CriticalInline script
OpenAI API key in the public page
An OpenAI key is in the JavaScript the browser downloads. Anyone who loads the site can copy it and spend this account's credits.
Seen as sk-p••••sT8w
Fix prompt for your coding agent
You are fixing a leaked OpenAI API key in this app. The public page includes an OpenAI key (it starts with sk-). Anyone who loads the site can copy it and spend this account's credits. Do this: 1. Search the repo for the key prefix and for NEXT_PUBLIC_ or VITE_ variables that hold it. Remove the key from client components, HTML, and committed env files. 2. Move the OpenAI call into a server route, server action, or backend function. Read OPENAI_API_KEY from the server environment only. 3. Add a per-user rate limit and a max output token cap on that route. 4. Rotate the key in the OpenAI dashboard. Deleting it from the repo is not enough, because the old key is already in the bundle people can download. Do not print the old key.
- CriticalInline script
Supabase service_role key in the public page
The Supabase service_role key is in the browser bundle. It bypasses Row Level Security, so anyone who copies it can read and write table data. Burnproof did not send this key anywhere.
Seen as eyJh••••Only
Fix prompt for your coding agent
You are fixing a Supabase service_role key in the browser. The service_role key bypasses Row Level Security. Anyone who copies it from the page can read and write rows the policies were meant to protect. Do this: 1. Remove the service_role key from client code and from any NEXT_PUBLIC_ or VITE_ variable. 2. In the Supabase dashboard, revoke that key and issue a new one. Store the new key only as a server environment variable. 3. Keep the anon key in the browser. Turn on Row Level Security for every table in the public schema, and do not use a policy of using (true) for private data. Burnproof did not send the service_role key anywhere.
- LowResponse headers
No Content-Security-Policy
The page does not send a Content-Security-Policy header. A CSP limits which scripts and APIs the browser will run. It does not hide a key that is already in the bundle.
Fix prompt for your coding agent
Add a Content-Security-Policy header so the browser only loads scripts and connections you expect. In Next.js, set headers() in next.config. Start with a policy that allows your own origin, then tighten it. A CSP does not replace moving API keys off the client.
- LowResponse headers
No Strict-Transport-Security
The HTTPS response does not send Strict-Transport-Security, so a browser will not remember to stay on HTTPS.
Fix prompt for your coding agent
Add Strict-Transport-Security so browsers stay on HTTPS after the first visit. Example: Strict-Transport-Security: max-age=63072000; includeSubDomains Only send this header on HTTPS responses.
- LowResponse headers
No X-Content-Type-Options
The page does not send X-Content-Type-Options: nosniff. Browsers may sniff a response and treat it as a script.
Fix prompt for your coding agent
Add the header X-Content-Type-Options: nosniff so browsers do not treat a file as a script when its content type says otherwise. In Next.js, add it in next.config headers().
- LowResponse headers
Page can be framed
The page does not send X-Frame-Options or a CSP frame-ancestors directive, so another site can embed it.
Fix prompt for your coding agent
Stop other sites from embedding this app in a frame. Add X-Frame-Options: DENY, or a Content-Security-Policy frame-ancestors 'none'. In Next.js, set it in next.config headers().
- LowResponse headers
No Referrer-Policy
The page does not send Referrer-Policy. The browser may send the full URL to other sites the page links to.
Fix prompt for your coding agent
Add Referrer-Policy: strict-origin-when-cross-origin so the browser does not send full page URLs to other sites. In Next.js, set it in next.config headers().
- NoteResponse headers
No Permissions-Policy
The page does not send Permissions-Policy. Camera, microphone, and location stay available to the page unless you turn them off.
Fix prompt for your coding agent
Add a Permissions-Policy header that turns off camera, microphone, and geolocation unless a feature needs them. Example: Permissions-Policy: camera=(), microphone=(), geolocation=()
What was checked
- Public HTML
- 1,263 bytes
- Scripts read
- 0
- Scripts skipped
- 0
- Security headers
- Yes
- /.env and /.git/config
- Existence only
- Supabase anon check
- Not run
Notes
- This scan is read-only. It does not sign in, submit forms, change data, or send exploit payloads.
- Scan only apps you own or have permission to test.
- Secret values are masked. If a real key showed up, rotate it even after you delete it from the code.
- A service_role key was found. Burnproof did not send it to Supabase.
- This is the public sample report. The keys are fake and were planted on purpose.