Токены CSRF против путаницы Nonce-они одинаковы?

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

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

Если они разные, не могли бы вы предоставить пример кода или указать мне некоторые ссылки, где я могу узнать больше о том, как реализовать nonces в PHP-приложениях.

спасибо!

3 ответов


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

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

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

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

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

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


нет, это не одно и то же.

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

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

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

Nonces не должны быть секретными, если они подписаны секретом запросчика (до тех пор, пока злоумышленник не может заменить один nonce другим).

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

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

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


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

но, чтобы подвести итог, часто используется nonce as CSRF токен. Это деталь реализации. Отличие от других вариантов использования заключается в том, что он позже утверждается.