OAuth2.0 Стек сервера, как использовать состояние, чтобы предотвратить CSRF? для draft2.0 v20
Я использую библиотеку PHP для OAuth2.0 v20
В draft20 есть упоминание об использовании государства для предотвращения CSRF
Пока что мое собственное веб-приложение, которое реализует эту библиотеку PHP, позволяет следующее:
- 3-х сторонняя аутентификация с использованием запроса кода авторизации
- 2-х сторонняя аутентификация с использованием регистрационных данных владельца ресурса
- Запрос, который обновляет токен доступа
Нужно ли использовать состояние для всех трех вышеописанных ситуаций?
Если так, то что является хорошим примером "государства"?
что делает хорошее "государство"?
Любая идеальная длина? Любая минимальная длина? Любая максимальная длина?
Какой идеальный макияж? буквенно-цифровой включая верхний регистр?
3 ответа
Просто для #1 - 3-х сторонняя авторизация с использованием кода авторизации.
Когда ваше приложение обменивает код авторизации на токен доступа, вы хотите быть уверены, что поток OAuth, который привел к предоставленному коду авторизации, действительно был инициирован законным пользователем. Таким образом, прежде чем клиентское приложение запускает поток OAuth путем перенаправления пользователя к поставщику, клиентское приложение создает случайное значение состояния и обычно сохраняет его в сеансе на стороне сервера. Затем, когда пользователь завершает поток OAuth, вы проверяете, чтобы убедиться, что значение состояния совпадает со значением, сохраненным в пользовательском сеансе на стороне сервера, поскольку это указывает на то, что пользователь инициировал поток OAuth.
Значение состояния обычно должно быть псевдослучайным неосуществимым значением. Простое значение может быть сгенерировано как int с помощью функции rand() в PHP, хотя вы можете получить и более сложную, чтобы обеспечить большую уверенность.
Состояние существует, чтобы такие вещи, как я, не отправляли вам по электронной почте ссылку, которая содержит код авторизации для моей учетной записи, вы нажимаете на нее и приложение помещает все данные в мою учетную запись без вашего ведома.
Некоторая дополнительная информация содержится в документе модели угроз OAuth 2.0: http://tools.ietf.org/html/draft-ietf-oauth-v2-threatmodel-00
В частности, см. Раздел о защите CSRF: http://tools.ietf.org/html/draft-ietf-oauth-v2-26
Может быть полезно просмотреть пример эксплойта CSRF, чтобы понять, как параметр состояния смягчает такую атаку. В этом примере Мэллори - нападающий, а Алиса - жертва.
Атака
Мэллори посещает веб-сайт какого-либо клиента и запускает процесс авторизации этого клиента для доступа к какому-либо поставщику услуг с помощью OAuth.
Клиент запрашивает у поставщика услуг разрешение запрашивать доступ от имени Мэллори, который предоставляется
Мэллори перенаправляется на сайт поставщика услуг, где она обычно вводит свое имя пользователя / пароль для авторизации доступа
Вместо этого Мэллори перехватывает / предотвращает этот запрос и сохраняет свой URL
Мэллори каким-то образом заставляет Алису посетить этот URL. Если Алиса вошла в систему поставщика услуг со своей собственной учетной записью, то ее учетные данные будут использоваться для выдачи кода авторизации.
Код авторизации обменивается на токен доступа
Теперь учетная запись Мэллори на клиенте авторизована для доступа к учетной записи Алисы у поставщика услуг.
Итак, как мы можем предотвратить это с помощью state
параметр?
профилактика
Клиент должен создать значение, которое каким-то образом основано на исходной учетной записи пользователя (например, хэш ключа сеанса пользователя). Неважно, что это такое, пока оно уникально и генерируется с использованием какой-то частной, неопровержимой информации об исходном пользователе.
Это значение передается поставщику услуг при перенаправлении с третьего шага выше
Теперь, когда Мэллори заставляет Алису посетить сохраненный URL (шаг пять выше), этот URL включает
state
параметр генерируется с информацией о сеансе МэллориКод авторизации выдается и отправляется обратно клиенту во время сеанса Алисы вместе с Мэллори
state
параметрКлиент генерирует новый
state
значение на основе информации сеанса Алисы и сравнивает ее сstate
значение, которое было отправлено обратно из запроса на авторизацию поставщику услуг. Это значение не соответствуетstate
параметр по запросу, потому чтоstate
значение было сгенерировано на основе информации сеанса Мэллори, поэтому оно отклоняется.
Злоумышленник не должен иметь возможность генерировать значение состояния для какого-либо конкретного пользователя, и, следовательно, обман пользователя не дает возможности посетить его URL-адрес авторизации.
Поскольку "состояние" - это просто случайная строка, создание чего-то подобного должно помочь:
$state = md5(uniqid(rand(), TRUE));
Просто не забудьте сохранить это в своей сессии, чтобы вы могли проверить это позже.