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

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

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

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

Спасибо!

Ответ 1

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

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

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

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

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

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

Ответ 2

Нет, они не то же самое.

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

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

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

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

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

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

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

Ответ 3

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

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

Ответ 4

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