← Home ← Codex ← DEBT ← Engine
Browse by Category
+ added · updated 7d
← Back to glossary

Forced Browsing

Security CWE-425 OWASP A1:2021 CVSS 7.5 PHP 5.0+ Beginner
debt(d5/e5/b5/t7)
d5 Detectability Operational debt — how invisible misuse is to your safety net

Closest to 'specialist tool catches it' (d5). The detection_hints.tools list includes nikto, dirbuster, owasp-zap, and semgrep — all specialist security tools rather than default linters or compilers. A standard linter won't flag missing authorisation middleware; you need a dedicated scanner or SAST tool to identify unprotected routes systematically.

e5 Effort Remediation debt — work required to fix once spotted

Closest to 'touches multiple files / significant refactor in one component' (e5). The quick_fix is conceptually simple ('every URL must verify authorisation'), but common_mistakes reveal the problem is pervasive: sequential IDs, missing server-side checks on file requests, forgotten backup files, robots.txt reliance. Fixing this requires auditing and updating every route/endpoint across the application, not a single-line swap.

b5 Burden Structural debt — long-term weight of choosing wrong

Closest to 'persistent productivity tax' (b5). The applies_to scope is all web contexts in PHP 5.0+, and tags include authorisation and owasp-top10. Every new route or resource added to the codebase must be evaluated for proper authorisation checks. This is a persistent discipline tax on every developer adding endpoints, but it doesn't reshape the entire system architecture.

t7 Trap Cognitive debt — how counter-intuitive correct behaviour is

Closest to 'serious trap' (t7). The misconception field explicitly states the canonical wrong belief: 'Unpublished URLs are safe because attackers cannot guess them.' This directly contradicts how access control actually works and is a well-documented security anti-pattern. A competent developer new to security will naturally assume that not linking to a URL provides safety, making this a serious and dangerous cognitive trap.

About DEBT scoring →

Also Known As

unprotected endpoint path guessing direct URL access

TL;DR

Accessing resources at predictable URLs that are not linked from the application's UI but lack proper authorisation checks.

Explanation

Forced browsing (also called direct object reference or insecure direct access) occurs when an attacker guesses or enumerates URLs for resources the application assumes are private due to obscurity — backup files, admin panels, uploaded files, API endpoints, or configuration dumps. The fix is never to rely on URL secrecy: every resource must enforce server-side authorisation regardless of how it is accessed. Tools like dirb, gobuster, and OWASP ZAP automate forced browsing discovery during pen tests.

Common Misconception

Unpublished URLs are safe because attackers cannot guess them. Common paths (admin/, backup/, .git/, phpinfo.php) are in every attacker wordlist — obscurity delays discovery by minutes at most.

Why It Matters

Sensitive resources that are not linked but are predictably named are fully accessible — security through obscurity is not access control.

Common Mistakes

  • Generating download URLs or IDs sequentially — attackers enumerate ±1 from any known ID.
  • No server-side authorisation check on direct file or resource requests — only the link is hidden.
  • Backup files, old scripts, or admin panels deployed to the webroot and forgotten.
  • Relying on robots.txt to hide admin paths — it advertises them to attackers.

Code Examples

✗ Vulnerable
// No ownership check — any user can download any invoice
public function download(string $filename): Response {
    return response()->file(storage_path("invoices/$filename"));
}
✓ Fixed
// Use ID, not filename — enforce ownership
public function download(int $invoiceId): Response {
    $invoice = Invoice::findOrFail($invoiceId);

    if ($invoice->user_id !== auth()->id()) abort(403);

    return response()->file(
        storage_path("invoices/{$invoice->stored_filename}"),
        ['Content-Disposition' => "attachment; filename=invoice-$invoiceId.pdf"]
    );
}

Added 15 Mar 2026
Edited 22 Mar 2026
Views 100
Rate this term
No ratings yet
🤖 AI Guestbook educational data only
| |
Last 30 days
3 pings W 0 pings T 0 pings F 0 pings S 0 pings S 0 pings M 0 pings T 0 pings W 0 pings T 1 ping F 0 pings S 0 pings S 0 pings M 2 pings T 1 ping W 0 pings T 1 ping F 0 pings S 1 ping S 1 ping M 0 pings T 0 pings W 0 pings T 1 ping F 0 pings S 0 pings S 0 pings M 0 pings T 0 pings W 0 pings T
No pings yet today
No pings yesterday
Amazonbot 13 PetalBot 11 ChatGPT 7 Ahrefs 7 SEMrush 7 Bing 6 Perplexity 4 Applebot 3 Claude 2 Scrapy 2 Twitter/X 2 Unknown AI 2 Google 1 Meta AI 1 Brave Search 1
crawler 63 crawler_json 6
DEV INTEL Tools & Severity
🟠 High ⚙ Fix effort: Medium
⚡ Quick Fix
Every URL must verify authorisation, not just authentication — never rely on obscurity (hidden links, GUIDs) as an access control mechanism
📦 Applies To
PHP 5.0+ web
🔗 Prerequisites
🔍 Detection Hints
Routes without authentication or authorisation middleware; admin panel at /admin accessible without admin role check; backup files at /backup.zip
Auto-detectable: ✓ Yes nikto dirbuster owasp-zap semgrep
⚠ Related Problems
🤖 AI Agent
Confidence: Medium False Positives: Medium ✗ Manual fix Fix: Medium Context: File Tests: Update
CWE-425 CWE-284


✓ schema.org compliant