Любой пользователь может читать чужие заказы через API
Описание
Эндпоинт заказов возвращает заказ по любому переданному ID. Он проверяет, что пользователь вошёл в систему, но не проверяет, что заказ принадлежит ему.
Влияние
Любой зарегистрированный пользователь может, изменив одно число в запросе, прочитать заказы всех клиентов — имена, адреса доставки и историю заказов.
Доказательство
GET /api/orders/10482 HTTP/1.1
Host: shop.example.com
Authorization: Bearer <token of user B>HTTP/1.1 200 OK
Content-Type: application/json
{ "id": 10482, "customer": "user A", "address": "[redacted]", "items": [ … ] }Воспроизведение
- Войдите как пользователь A и оформите заказ; запишите его ID.
- В отдельной сессии войдите как пользователь B.
- Запросите ID заказа пользователя A с токеном пользователя B.
- API возвращает заказ пользователя A вместо 403 Forbidden.
Исправление
Проверяйте владельца на сервере при каждом запросе объекта: загружайте заказ, только если его владелец совпадает с аутентифицированным пользователем, иначе возвращайте 404. Примените ту же проверку ко всем эндпоинтам, принимающим ID объекта.
Перепроверка
Исправлено · перепроверено. Теперь эндпоинт возвращает 404 для заказов другого пользователя.