A01: Broken Access Control
Уязвимость №1 рейтинга OWASP 2021 — когда пользователь делает то, что ему не положено.
Broken Access Control — нарушение контроля доступа: приложение не проверяет (или проверяет неверно), имеет ли пользователь право на запрашиваемое действие или данные.
Это самая распространённая категория уязвимостей. Суть проста: аутентификация отвечает на вопрос «кто ты», а авторизация — «что тебе можно». Когда второй вопрос забывают задать, начинаются проблемы.
IDOR: доступ к чужому объекту
Классический пример — Insecure Direct Object Reference. Пользователь видит свой заказ по адресу вида /orders/123. Если, поменяв число на 124, он увидит чужой заказ — значит, сервер не проверяет, принадлежит ли заказ запросившему.
GET /orders/123 -- мой заказ, всё ок
GET /orders/124 -- а это уже чужой заказ; сервер обязан проверить владельцаОбход проверок и повышение прав
Другие проявления: обычный пользователь обращается к админскому эндпоинту /admin/users; проверка прав есть только на фронтенде (кнопка скрыта, но запрос проходит); права берутся из изменяемого клиентом поля (например, роль в cookie или в теле запроса).
Как защищаться
- Проверяйте авторизацию на сервере для каждого запроса — не полагайтесь на скрытие элементов интерфейса.
- Запрещайте по умолчанию (deny by default): доступ открывается явной проверкой, а не отсутствием запрета.
- Проверяйте владение объектом: «принадлежит ли заказ #124 текущему пользователю?».
- Не доверяйте роли/идентификатору, пришедшим от клиента; берите их из проверенной серверной сессии или подписанного токена.
- Логируйте отказы в доступе и следите за всплесками — это признак перебора.
// Псевдокод серверной проверки
order = bd.najti(orderId)
if (order == null) return 404
if (order.ownerId != currentUser.id AND !currentUser.isAdmin) return 403
vernut(order)Частые ошибки разработчиков
- Проверяют только, что пользователь вошёл (аутентификация), но не что ему можно (авторизация).
- Полагаются на «никто не догадается поменять id в URL» — безопасность через неясность не работает.
- Берут роль пользователя из тела запроса или cookie, которые клиент может подделать.
Итог
- Access Control = проверка прав на каждое действие на сервере.
- IDOR — доступ к чужому объекту через подмену идентификатора.
- Deny by default и проверка владения объектом закрывают большинство случаев.