Broken Access Control je od roku 2021 zranitelnost číslo jedna v OWASP Top 10. Každá třetí webová aplikace má problém s autorizací — uživatelé přistupují k datům, ke kterým nemají oprávnění.
Co je Broken Access Control¶
Access control zajišťuje, že uživatel může dělat pouze to, k čemu má oprávnění. Broken access control nastává, když aplikace tuto kontrolu neprovádí správně — uživatel může měnit cizí data, přistupovat k admin rozhraní nebo eskalovat svá práva.
Typické útoky¶
- IDOR (Insecure Direct Object Reference): Změna ID v URL — /api/users/123 → /api/users/456
- Forced browsing: Přímý přístup na /admin bez kontroly role
- Parameter tampering: Změna role v POST requestu — role=user → role=admin
- Path traversal: Přístup k souborům mimo povolený adresář
Příklad zranitelného kódu¶
// ❌ ŠPATNĚ — žádná kontrola vlastnictví app.get(‘/api/orders/:id’, async (req, res) => { const order = await Order.findById(req.params.id); res.json(order); }); // ✅ SPRÁVNĚ — kontrola vlastnictví app.get(‘/api/orders/:id’, async (req, res) => { const order = await Order.findById(req.params.id); if (!order || order.userId !== req.user.id) { return res.status(403).json({ error: ‘Forbidden’ }); } res.json(order); });
Prevence¶
- Deny by default — vše zakázáno, pokud není explicitně povoleno
- Kontrola autorizace na serveru, nikdy jen na klientu
- Používejte RBAC nebo ABAC pro správu oprávnění
- Logujte všechny pokusy o neautorizovaný přístup
- Automatizované testy autorizace v CI/CD
Middleware pattern¶
const authorize = (allowedRoles) => { return (req, res, next) => { if (!req.user || !allowedRoles.includes(req.user.role)) { return res.status(403).json({ error: ‘Insufficient permissions’ }); } next(); }; }; app.delete(‘/api/users/:id’, authorize([‘admin’]), deleteUser);
Klíčový takeaway¶
Access control patří na server. Každý endpoint musí ověřit, zda aktuální uživatel má právo provést danou akci. Deny by default, logujte pokusy, testujte automaticky.