Итоги 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.