Doors nobody remembered to lock
Watch it happen
Mallory walks around the building trying unmarked doors. The front door is guarded, but the staff, old and test doors open for anyone.
Alice and Mallory walk up to the bank. The front door is well guarded: it needs a badge and an appointment. The bank feels safe.
Mallory says: Guarded. Let me look around.In bank terms and app terms
| In the bank | In your app |
|---|---|
Are you exposed?
Some routes are protected only because the UI doesn’t link to them. Old API versions, demo pages or debug routes are still deployed in production. Authorization lives in the frontend (hiding buttons) rather than on each server route.
Require auth and role checks on the server for every route, with a default-deny wrapper or middleware, and still check inside sensitive handlers. Delete retired API versions, test pages and debug routes from production builds. List all your routes regularly and check each one has an owner and a lock. Treat “nobody knows about it” as no protection.
Ask your AI tool to fix it
Paste this into Cursor, Claude, Lovable, Bolt or whatever you build with.
List every route and API endpoint in this project (including admin, debug, test and old versioned routes). For each, state whether authentication and role checks are enforced on the server. Add default-deny middleware so new routes require auth, remove unused or debug routes from production, and retire old API versions. Output a table of routes and their protection.Where this comes from
The facts, figures and fixes on this page were checked against these sources on 25 Oct 2026. They are linked so you can check for yourself.
- WSTG: Enumerate Infrastructure and Application Admin InterfacesOWASPHidden admin paths such as /admin are guessed easily and must be found and protected
- API9:2023 Improper Inventory ManagementOWASPOld API versions left running and unpatched; keep an inventory and retire old versions
- API5:2023 Broken Function Level AuthorizationOWASPAdmin functions are prime targets; enforce deny-by-default on every function
- Forced browsingOWASPAttackers guess unlinked URLs that the app doesn't reference but still serves
- Authorization Cheat SheetOWASPDeny by default and validate permissions on every request
- Access control vulnerabilities and privilege escalationPortSwigger Web Security AcademyHiding a URL is security by obscurity, not access control
Spot a mistake or something out of date? Report a correction · How these guides are made and checked
The free, open-source scanner checks for most of the problems in these guides.