Дополнительный уровень защиты для Django Rest Framework и OAuth2 Toolkit
Это дополнительный вопрос для этого.
Я использую последний Django OAuth2 Toolkit (0.10.0) с Python 2.7, Django 1.8 и Django REST Framework 3.3
Немного предыстории:
При аутентификации клиент получает новый AccessToken
что он использует каждый раз, когда делает новый запрос к серверу. это AccessToken
принадлежит клиенту и передается с использованием Authorization
Заголовок по запросу.
Простым тестом, который я сделал, было получение этого токена доступа от аутентифицированного клиента и отправка его в Authorization header
используя простой HTTP-запрос с другого компьютера.
В результате этот новый "клиент" теперь аутентифицирован так же, как и оригинальный клиент, и он может отправлять запросы по своему усмотрению.
Итак, проблема в следующем:
Маркер доступа не привязан ни к какой форме проверки клиента (например, идентификатор сеанса или IP-адрес клиента). Любой, кто может получить / найти / украсть / поиск клиента AccessToken
, могут быть поддельные запросы от имени этого клиента.
Я исследовал эту проблему, но не смог найти никого, кто бы занимался этим вопросом. Может быть, я делаю что-то не так в аутентификации клиента? Я хотел бы получить некоторые идеи. Возможно, это простая конфигурация, готовое решение, которое я пропустил.
Спасибо!
1 ответ
Этот метод атаки называется повторной атакой. Это видео профессора Мессера объясняет повторную атаку.
Вы не можете реализовать что-либо на стороне клиента (браузера), чтобы преодолеть это из-за прозрачности веб-браузеров.
Что вы можете сделать, это реализовать дайджест-проверку подлинности с использованием одноразового номера.
В криптографии одноразовый номер - это произвольное число, которое может использоваться только один раз.
базовая реализация выглядит следующим образом.
- Пользователь запрашивает API сервер.
- Сервер API отвечает HTTP 401 и одноразовым номером в
WWW-Authenticate
заголовок [вы должны отслеживать одноразовые номера] (JWT с одноразовым номером, для которого задано время истечения в небольшом окне, может быть лучше и не сохраняющим состояние в течение 2 секунд или менее). - Клиент подписывает запрос полученным одноразовым номером, одноразовым номером клиента и паролем и снова вызывает ресурс.
- Сервер API проверяет подпись. Если подпись действительна, запрос принимается.
- Злоумышленник захватывает запрос и подделывает пользователя.
- Поскольку срок действия одноразового номера истек / "используется только один раз", запрос злоумышленника отклоняется.