Токены CSRF против путаницы Nonce - они одинаковые? - PullRequest
13 голосов
/ 17 апреля 2011

В попытке сделать текущее приложение, которое я разрабатываю, более безопасным, я читал о токенах CSRF, а также о Nonce.

Мой вопрос просто так: токены CSRF и Nonce - это одно и то же?из того, что я могу сделать вывод, можно сказать, что оба эти метода имеют разные методы для достижения одной и той же цели, или я что-то неправильно понимаю?мне на некоторые ссылки, где я могу узнать больше о том, как реализовать одноразовые номера в приложениях PHP.

Спасибо!

Ответы [ 4 ]

14 голосов
/ 21 марта 2012

Нет, они не одинаковы.

Одноразовые номера предотвращают повторные атаки (не позволяют подслушивающему сохранять подписанный запрос и повторно отправлять его позже, например, если Алиса отправит «Оплатить Боба $ 100», вам не нужно, чтобы кто-то повторно отправлял это 100 раз).

CSRF-токены исправляют специфическую для HTML слабость в аутентификации действий пользователей, когда сторонний веб-сайт может отправлять формы с учетными данными пользователя, просматривающего сайт (например, JavaScript на evil.example.com, отправляющий форму на facebook.com с помощью вашего браузера, заверен как ты).

Жетоны CSRF должны быть секретными, иначе у злоумышленника будет отсутствующий фрагмент, необходимый для подделки запроса.

Одноразовые номера не должны быть секретными, если они подписаны секретом запрашивающей стороны (если злоумышленник не может заменить один одноразовый номер другим).

Вы можете разрешить воспроизведение запросов с токенами CSRF и при этом быть защищенными от CSRF (вас интересует, было ли это преднамеренным действием пользователя, но может не обязательно помешать пользователю выполнять его много раз).

На самом деле это очень часто полезное свойство, например, позволяет пользователям использовать кнопку «Назад» и повторно отправлять формы с исправленными значениями. Если вы внедрите защиту CSRF с помощью механизма Nonce-like, вы получите ложные тревоги, когда пользователи обновят отправленные страницы.

Простой способ предотвратить CSRF без одноразовых номеров - поместить идентификатор сеанса в скрытое поле from (не значение, сохраненное в сеансе, но идентификатор самого сеанса, то же самое, что вы храните в cookie [session_id() в PHP]). Когда форма отправлена, проверьте, что идентификатор сеанса формы совпадает с идентификатором в файле cookie. Этого достаточно для CSRF, поскольку злоумышленник не может знать значение файла cookie (CSRF позволяет злоумышленникам только слепо отправлять файлы cookie).

13 голосов
/ 17 апреля 2011

Nonce - это обычно произвольная строка, которая добавляется в запрос только для непредсказуемого изменения данных, которые используются для вычисления подписи. Поэтому nonce обычно не используется какой-либо серверной бизнес-логикой.

Пока CSRF-токен хранится где-то на сервере, передается клиенту и должен быть возвращен обратно на сервер для сравнения. А если совпадает - тогда ОК.

Так что в вашем случае лучше будет один раз сохранить токен csrf в переменной сеанса, например

$_SESSION['csrf_token'] = bin2hex(random_bytes(16));

и используйте его без изменений в течение жизни сеанса во всех формах, которые есть в вашем приложении.

(Если у вас нет random_bytes(), используйте random_compat , чтобы заполнить его.)

7 голосов
/ 17 апреля 2011

Это одно и то же. «Одноразовый номер» - это просто одноразовый пароль. Он может служить криптографической солью, но в основном это просто случайное значение. См. WP: Nonce

Но для подведения итогов одноразовый номер часто используется как CSRF-токен. Это деталь реализации. Разница с другими вариантами использования заключается в том, что позже утверждается.

0 голосов
/ 28 июня 2019

CSRF имеет некоторые ограничения.в случае, если у вас есть требование, где вы хотите открыть любую страницу или ссылку в новой вкладке, CSRF не позволит.Существующий токен позволит открывать страницу в новой вкладке только 5 раз.когда вы попытаетесь открыть 6-й раз, он создаст новый токен, который не будет совпадать с "server side = client side token".срок действия предыдущего токена истекает, и создается новый токен (NONCE), в этом случае вы получите ошибку 404 или 405.

...