Leaked Secret Scanner
A leaked secret scanner checks whether files and credentials that should never be public can be fetched from your website by anyone: an .env file with database passwords, a .git folder that hands over your whole source history, a backup archive left in the web root, or a live API key sitting inside a JavaScript bundle. Enter a URL and this scanner probes the well-known exposure paths, verifies the content of anything that answers, and scans the page and its scripts for known secret patterns — showing only masked values, never the secret itself. The companion guide, exposed .env files and leaked keys, explains how these exposures happen and why deleting the file is never enough on its own. Pair this with the Security Headers Check for response hardening and the Third-Party Script Audit for the scripts you load from other people.
Last updated:
Want this watched continuously? Monitor this free with myeventwatch — expiry and downtime alerts, no card required.
What counts as exposed — and what does not
The scanner probes a published list of well-known paths — /.env and its common variants, /.git/HEAD and /.git/config, configuration files, backup archives and key files — with plain public GET requests, exactly the requests an attacker, a search engine or a curious visitor could make. A path only counts as exposed when the response content matches what that file should actually look like: an env file must parse as key–value lines, a Git HEAD must look like a Git ref. Plenty of servers answer 200 for every path — single-page-app fallbacks, custom error pages, catch-all rewrites — and a 200 with your homepage HTML in it is not a leak. Those paths are listed separately on the result as responded but unconfirmed, so you can judge them yourself; this tool never calls an unconfirmed 200 a leak, and neither should any scanner you use.
Alongside the file probes, the scanner fetches the page itself and up to about fifteen of its JavaScript bundles and searches them for known secret shapes: cloud access key IDs, private-key headers, generic API key and token assignments, database connection strings and similar high-signal patterns. Client-side code is public by definition — anything shipped to a browser can be read by every visitor — so a real credential found in a bundle is exposed even though no file was misconfigured. Findings are reported by type, by source file and by occurrence count, with the value masked to at most its first four characters: enough for you to recognise which key it is, never enough for anyone reading the report to use it. The full secret is never fetched into, stored in or shown by this report.
Limits, stated plainly
This is a public, read-only probe of well-known paths, and its limits are part of the result. It only requests the paths on the published list — a secret in an unusually named file will not be found. It scans the landing page and roughly fifteen script bundles, not every asset on a large site, and it does not log in, crawl behind authentication, brute-force filenames or test anything that is not already reachable by an unauthenticated GET. Scans are rate-limited to 5 per hour per visitor and results are cached for 10 minutes, so a re-scan inside that window may show the cached verdict. A scan also runs to a time budget: when a slow target uses it up, the result is marked partial and says so — treat a partial clean result as “not fully checked”, not as “clean”.
If the scan finds something, the order of work matters more than speed of deletion. Rotate the credential first — revoke the exposed key and issue a new one — because copies may already exist in caches, archives and other people’s hands; deleting the file stops new downloads but does nothing about a key that is already out. Then remove or block the file at the server, purge CDN and proxy caches that may hold a copy, and check your access logs for earlier fetches of the same path. The companion article, exposed .env files and leaked keys, walks through the first-hour playbook attackers use and the full recovery sequence in order.
Neighbouring checks complete the picture: the Third-Party Script Audit covers the external scripts your pages load — a different supply-chain risk from your own leaked files — and the Security Headers Check grades the browser protections your responses carry. A note on method: a clean result means none of the probed paths answered with matching content and no known secret pattern appeared in the scanned files, at scan time, from the checker’s network position. It is evidence about those paths and files, not a guarantee about the whole server — keep the files out of the web root in the first place, and re-scan after every deployment change that touches what your server publishes.
The probe list, published
| /.env and variants | Environment files (.env, .env.local, .env.production and similar) holding database passwords, mail credentials and API keys. Confirmed only when the body parses as key–value lines. |
| /.git/HEAD and /.git/config | A served .git folder discloses the repository: HEAD proves the layout, config often names the remote. With both, the full source history is usually reconstructible. |
| Configuration files | Well-known config paths (for example wp-config backups, config.php copies and framework configuration files) that carry credentials in plain text. |
| Backup and archive files | Database dumps, .zip / .tar.gz site archives and editor backup copies left in the web root — often a complete copy of the site, credentials included. |
| Key and certificate files | Private-key shaped files (.pem, .key, id_rsa style names) that should never be web-accessible; a served private key is a critical finding on its own. |
| JavaScript bundles | The page plus up to about 15 script bundles, searched for cloud key IDs, private-key headers, token assignments and connection strings. Values are masked to at most four leading characters. |
| Confirmation rule | A probe counts as exposed only when the response content matches the expected file shape. A bare 200 is listed as responded-but-unconfirmed and is never reported as a leak. |
| Budget and caching | Public GET probes only, read-only, 5 scans per hour per visitor, results cached 10 minutes. A scan that exhausts its time budget is flagged partial. |
Frequently asked questions
The scan says a path “responded but unconfirmed”. Is that a leak?
Not on this evidence. It means the path answered with HTTP 200 but the content did not match the shape of the file being probed — the usual cause is a catch-all route or fallback page answering every URL with your homepage or app shell. Open the path in a private browser window and look at what actually comes back: if you see the real file contents, treat it as exposed; if you see your normal site, it is the fallback.
The scanner found one of my keys. What do I do first?
Rotate it — revoke the exposed credential and issue a replacement — before anything else. Copies of a public file escape quickly into caches, archives and scanners’ databases, so deleting the file does not un-leak a key. Then remove or block the file, purge CDN and proxy caches, review access logs for the path, and check where else the same credential was used.
Does the scanner store or display the full secrets it finds?
No. The checker reports the secret type, the file it was found in and an occurrence count, with the value masked to at most its first four characters — enough to identify which credential it is, never enough to use it. The report contains nothing worth stealing, which is deliberate: a leak report should not become a second leak.
Can it scan my staging site or a page behind login?
No. The scanner only makes unauthenticated public GET requests, so anything behind a login, a VPN or an IP allowlist is out of reach — by design, since the question it answers is what a stranger on the internet can fetch. Blocked targets, including this site’s own infrastructure addresses, are refused outright.
Why is my result cached or partial?
Results are cached for 10 minutes to keep repeated checks cheap and to stay a polite guest on the target server; the result states when it is cached. A partial result means the scan hit its time budget — usually a slow target or many large bundles — before finishing every probe; the banner says so, and a partial clean result should be re-run rather than trusted as fully clean.