All posts

March 11, 2026 · 5 min read

Your Admin Panel Deserves Its Own Checklist, Not Just a Login Screen

Admin panels have come up in nearly every post on this blog in one way or another, usually as the example of a route that should require login but sometimes doesn't. I want to give the topic its own dedicated pass, because an admin panel is the single most powerful part of most apps, and in my experience it's also the part built fastest, latest, and reviewed least, precisely because it's not customer-facing.

Confirm it requires real authentication, server-side

This is the check that's come up repeatedly, and it's worth restating here specifically: open a private browser window with no session at all and try to reach every admin route directly by URL. It should refuse you completely. If it renders anything before redirecting, or if the underlying API routes behind the admin UI respond without a valid session, the check is happening in the wrong layer.

Confirm 'logged in' and 'admin' are two different checks

A route that only checks whether someone is logged in, not whether they're specifically an admin, will happily let any regular user reach it if they simply know or guess the URL. Verify this distinction is actually enforced by logging in as a normal, non-admin test account and trying to reach admin routes directly.

Check what a compromised admin account could actually do

Admin panels often accumulate power gradually as features get added: view all users, then edit any user, then impersonate any user, then export all data, then change billing. Ask directly: if this one account got compromised today, what's the actual worst case? If the answer is 'basically everything, unrestricted,' consider whether some of that power genuinely needs to sit behind a single login, or whether the most dangerous actions deserve an extra confirmation step, or a second admin's approval.

Log what happens inside it

Most apps log errors. Far fewer log admin actions specifically: who viewed which user's data, who changed what, when. Once an admin panel can touch real user data, a basic audit log of who did what and when is worth having, both to catch misuse and, just as often, to answer your own questions later about what actually happened during some past incident.

Check whether the admin panel is discoverable at all

Being reachable at a guessable path like /admin isn't a vulnerability on its own if the authentication behind it is solid, but it does mean it's one of the first things any automated scan of your app will try. Confirm the strength of what's actually protecting it rather than leaning on the assumption that nobody will think to look.

The condensed version

  • Real server-side authentication, tested from a logged-out private window.
  • A specific admin check, separate from a general logged-in check, tested from a non-admin account.
  • A clear answer to what a compromised admin account could actually do.
  • Some form of logging for sensitive admin actions.
  • No assumption that an unguessable-feeling URL is doing any of the actual protecting.

The admin panel is where the highest-value target in your entire app usually lives, and it's exactly the part that gets the least scrutiny because real customers never see it. That mismatch is worth correcting on purpose, not discovering the hard way.

Related reading

Harbova is a security service for apps built with AI tools. Start with a free scan, and if it finds something serious, we can fix it and prove it is closed.