Skip to content
Burnproof

This report is public and fixed. The keys in it are fake, planted so you can see a severe bill-risk result without scanning anyone's app.

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

100of 100
Scan another URL
  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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().
  6. 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().
  7. 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().
  8. 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.

Read the sample page · Scan a URL you own