Know-How
OWASP Top 10: Broken Access Control
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.