IDOR vs BOLA

Same vulnerability, different names. Here's why both exist and when to use which term.

IDORBOLA
Full nameInsecure Direct Object ReferenceBroken Object Level Authorization
OriginOWASP Web Top 10 (since 2007)OWASP API Security Top 10 (2019)
ContextWeb applicationsAPIs
MechanismChange an ID in a URL or form parameterChange an object ID in an API request
Root causeSame: missing authorization check on the objectSame: missing authorization check on the object
RankingPart of A01: Broken Access Control#1 on OWASP API Security Top 10
TestingSwap IDs in browser requestsSwap IDs in API calls with different auth tokens

The short answer

They're the same vulnerability under two names. IDOR is the older term from the web application testing tradition; BOLA is what the OWASP API Security Top Ten calls it. If someone tells you they're different bugs, the distinction they're reaching for is usually about context — APIs versus web pages — rather than about mechanism.

Why two names exist, and when the difference matters

The terms come from different lineages. "Insecure Direct Object Reference" entered general use through the OWASP Top Ten in the 2000s, when the surface was server-rendered applications and the object reference was typically a query-string parameter. "Broken Object Level Authorization" was coined for the 2019 API Security Top Ten, where it sits at number one. The rename was deliberate: "insecure direct object reference" describes the symptom (a reference the user can manipulate) while "broken object level authorization" names the actual defect (a missing check). The second framing is more useful, because it points at the fix.

Use BOLA when you're writing about APIs, particularly in a report to a team that works from the API Security Top Ten — it maps to a category they already track. Use IDOR in bug bounty contexts, where it remains the dominant vocabulary and is what triagers search for. Most platforms accept either, and the sensible move in a report is to lead with one and mention the other once, so it's findable under both.

Where the distinction does carry weight is severity modelling. APIs tend to expose object references more directly and in greater volume than server-rendered applications did — every resource is an addressable identifier, and there's no UI layer incidentally limiting what most users ever request. That's a real difference in exposure, and it's why the API list elevated it to first place. It's a difference in surface area, not in the bug.

Worked example: the same defect on both sides of a rename

A document platform has a legacy web interface and a newer REST API over the same data.

Web, circa the IDOR vocabulary: /viewDoc.jsp?docId=4471. Change the number and you read another tenant's document. The handler loads by primary key and renders.

API, in BOLA vocabulary: GET /api/v1/documents/4471. Change the number and you get the same document as JSON. The handler loads by primary key and serializes.

Identical defect, identical fix — scope the query by the caller's tenant so the record cannot be returned at all — and two different names depending on which report template you opened. What's genuinely different is discovery cost: the API version is trivially enumerable with a script, returns clean structured data, and sits alongside a few hundred sibling endpoints with the same pattern, so a single missing check is likely to be one of many.

Finding them, whatever you call them

The method doesn't change with the terminology. Hold two authenticated sessions in different accounts or tenants. Exercise the application fully as account A, capturing traffic. Replay those requests with account B's credentials and look at what succeeds. Burp's Autorize extension automates exactly this loop and is the single most useful tool for the class.

The subtleties are worth knowing. Sequential integers are the obvious case, but UUIDs only help if they're both unguessable and still checked — plenty of applications treat an opaque identifier as authorization in itself, which fails the moment an identifier leaks through a share link, an export, or a referrer header. Check the non-obvious verbs: an endpoint that correctly rejects a foreign ID on read may accept it on update, on delete, or on a "duplicate this record" action nobody classified as a read. Check asynchronous paths, where a background worker fetches the object and never sees the requesting user: export jobs, PDF generation, webhooks, notification emails.

Mass assignment sits next door and is frequently reported as IDOR. If you can add "account_id": 7 or "role": "admin" to a request body and the framework binds it, the object reference was never the problem — that's a separate finding with a separate fix.

Fixing it properly

Adding a check to the handler fixes one endpoint. The defect is that the check was omissible, and the next endpoint will omit it too. The durable fix is to make the ownership constraint structural: scope queries at the data access layer so a record outside the caller's tenant cannot be returned, and deny by default. Unpredictable identifiers are worth using as defense in depth, and are not a substitute for the check. More at IDOR, API Security and Authorization.

Common questions

Are IDOR and BOLA actually the same thing?

Yes. Same defect — a missing object-level authorization check — under two names from different lineages. BOLA is the API Security Top Ten term, IDOR the older OWASP and bug bounty term.

Which term should I use in a report?

Match your audience: BOLA for API security teams working from the OWASP API list, IDOR for bug bounty triage. Mentioning both once makes the report findable either way.

Why is BOLA ranked first in the API Security Top Ten?

APIs expose object references directly, in volume, with no UI incidentally constraining what most callers request. The bug is the same as it always was; the surface area is much larger.

Do UUIDs prevent IDOR?

They make enumeration impractical, which is worth having, but they aren't authorization. Identifiers leak through share links, exports, logs and referrer headers — and an application that treats possession of a UUID as permission fails as soon as one does.

Is mass assignment a type of IDOR?

No. IDOR is being served an object you shouldn't get; mass assignment is setting a field you shouldn't control. They often appear in the same endpoint and they have different fixes.

More comparisons: SSRF vs CSRF XSS vs CSRF XSS Types AuthN vs AuthZ SQLi vs NoSQLi SAST vs DAST Bounty vs Pentest SBOM vs SLSA Validation vs Encoding DAST vs IAST vs RASP SCA vs SAST OAuth vs SAML Pentest vs Red Team WAF vs RASP