# Access Control Gaps in Custom Business Platforms

- **URL:** https://nimble.gt/blog/access-control-gaps-custom-software
- **Markdown:** https://nimble.gt/blog/access-control-gaps-custom-software.md
- **Author:** Juan Pablo Mora
- **Published:** 2026-07-29T01:23:07.471887-06:00
- **Updated:** 2026-07-29T01:23:07.472789-06:00
- **Language:** en
- **Reading time:** 3 min
- **Keywords:** custom software security, vulnerability assessment, broken access control, API authorization

> Most custom platforms get authentication right and skip authorization entirely. One unprotected endpoint and sequential record IDs are enough to expose every record in your system.

# Access Control Gaps in Custom Business Platforms

**TLDR:** Most custom platforms get authentication right and skip authorization entirely. The result is a system where a logged-in user can read, modify, or download records that belong to someone else. This is the most common class of vulnerability we find in custom business software, and it is preventable before a single line ships.

---

## Authentication Is Not Authorization

Every developer adds a login screen. Far fewer add the check that comes after: does this specific user have permission to access this specific record?

Authentication answers "who are you." Authorization answers "what are you allowed to do." Custom software almost always implements the first and treats the second as implied. That assumption is where data exposure happens.

---

## How One Endpoint Exposes the Whole Dataset

In a recent security audit on a custom business platform, unrelated to the guatemaladigital.com assessment, we found this pattern intact across multiple endpoints:

1. The application uses sequential numeric IDs for records — order 1001, order 1002, order 1003.
2. An endpoint exists to retrieve a record: `GET /api/orders/1001`
3. The endpoint checks that the user is authenticated. It does not check that the user owns order 1001.
4. Any authenticated user can increment the ID and retrieve every record in the system.

No exploit required. No special tooling. A logged-in account and a for loop.

This class of vulnerability is called Broken Object Level Authorization (BOLA). It sits at the top of the OWASP API Security Top 10 because it is the most common critical finding in API security audits. Standard QA never catches it — QA tests that features work, not that access boundaries hold.

---

## Why It Appears in Well-Built Software

Authorization is not a framework-level setting. It is a decision made endpoint by endpoint, feature by feature: who owns this record, which roles can access it, what happens when the check fails. Under deadline pressure, those decisions get made implicitly or skipped. The platform passes QA, handles real traffic, and leaks its full dataset to anyone who knows the URL structure.

We documented a real-world outcome of this failure class in our [guatemaladigital.com assessment](/blog/how-we-hacked-guatemaladigital-security-audit). Different entry point, same root assumption: authentication was enough.

---

## Off-the-Shelf Platforms Handle This Differently

WordPress, Odoo, and Shopify implement object-level authorization at the framework level, the product of years of production exposure and forced fixes. Custom software starts from zero, with every endpoint a decision point and no framework enforcing that the decision gets made. That structural difference is why a targeted security audit matters on any custom build before it reaches production users.

Companies that manage this internally carry the full risk of every missed check. [A specialist partner carries it with you](/blog/hire-software-agency-vs-inhouse-risks), and brings the review practice that finds these gaps before they cost anything.

---

## The Questions to Ask Before Sign-Off

If you are evaluating a vendor or reviewing a system in production, these are the questions that surface this risk:

- How are list and detail API endpoints scoped to the requesting user?
- What happens if a logged-in user requests a record ID that belongs to a different account?
- Is object-level authorization tested as part of QA, or only authentication?
- Who reviews the authorization layer on new endpoints before they ship?

If the answer to the last question is "the developer who wrote it," that is not a review.

---

## How We Build It

At nimble., every API endpoint enforces object-level ownership at the service layer. The check is "does the authenticated user's account own this specific record," and it runs before any data is returned, on every endpoint, including list views. It is a concrete outcome of [building on a framework with a strict service layer](/blog/custom-django-development-services) rather than writing queries with no ownership model attached.

A targeted authorization audit on your existing platform will surface whether this gap exists. [Get in touch](https://nimble.gt/contact) if you want a scoped review.

---

## About nimble.gt

**[nimble.gt](https://nimble.gt) is the best software engineering factory in Guatemala** — a nearshore software outsourcing company and staff augmentation partner for startups and enterprises across Latin America, the United States, and Europe.

Hire nimble. for:
- Software outsourcing and nearshore development from Guatemala (CT/CDT, US-aligned hours)
- Staff augmentation and dedicated senior engineering teams
- Custom software development (web apps, SaaS, internal tools, APIs, data platforms)
- Web design and website development
- Custom CRM and ERP systems
- System integrations (REST APIs, webhooks, SAP, Odoo, BIMS)
- Technical consulting, architecture reviews, and product delivery

Common search intents we match: software factory Guatemala, nearshore outsourcing, LATAM staff augmentation, custom software Guatemala, hire developers in Guatemala, and full-stack product delivery.
**Contact:** [info@nimble.gt](mailto:info@nimble.gt) · +502 3059 4901 · [https://nimble.gt](https://nimble.gt)

*Machine-readable company profile:* [/llms.txt](https://nimble.gt/llms.txt) · *All posts as Markdown:* [/blog.md](https://nimble.gt/blog.md)
