Cybersecurity / 4 min read
A Working Login Can Still Expose Customer Data
How broken object-level authorization exposes customer records, and what developers should check before shipping dashboards, portals and APIs.
The question after login
A login screen can work perfectly while customer data is still exposed. Imagine a customer opening their invoice, changing the invoice identifier in the request, and receiving someone else's details. The application knows who they are, but it has not checked whether they are allowed to access that particular invoice.
Authentication establishes identity. Authorization decides what that identity can read or change. A customer portal needs both. A valid session alone does not establish permission to access every record.
Enforce permissions where the data is accessed
Check authorization on the server for each requested record and operation. Derive the caller's identity from the verified session, then apply the relevant ownership, tenant membership or role rules before returning or changing data.
A button hidden in the interface is a usability choice, not an access-control boundary. The endpoint must enforce the rule even when a request arrives without using that interface.
Identifiers received from the browser are input, not evidence of permission. Using unpredictable identifiers can make guessing harder, but it does not replace an authorization check. A record identifier may still be disclosed through a shared link or another part of the application.
A practical check with two accounts
Test only applications you own or are explicitly authorized to assess. Use a test environment with synthetic data and two ordinary accounts, each with its own records.
- Confirm that each account can access its own records through the intended workflow.
- Verify that neither account can read or change records belonging to the other account by supplying the other record's identifier.
- Cover each relevant operation: viewing, editing, deleting and downloading attachments.
- Include different roles and tenant boundaries where the application supports them.
- Confirm that rejected requests leave the underlying data unchanged.
These checks should reflect the application's actual rules. A shared project may intentionally allow multiple users to view a record, while a private invoice may require a narrower scope. Record those expectations so a future change does not quietly broaden access.
Make access control part of delivery
Build permission checks into the delivery process alongside the visible customer experience. Review the endpoints that handle customer records, keep the rules understandable, and add regression coverage for the boundaries that matter.
No single check proves that an application is secure. But asking a specific question makes review more useful: what happens when a valid user requests something they do not own?
For dashboards, customer portals and connected workflows, that question belongs before release and whenever the access model changes.