В попытке сделать текущее приложение я развиваю более безопасным, я читал о токенах CSRF, а также Nonce. Думаю, я понял идею жетонов CSRF, но у меня проблемы с поиском «хороших и упрощенных», ресурсов и примеров Nonces.
Мой вопрос – это жетоны CSRF и Nonce то же самое? из того, что я мог бы собрать до сих пор, заключается в том, что оба эти метода имеют разные методы для достижения одной и той же цели, или я что-то неправильно понимаю?
Если они отличаются друг от друга, можете ли вы быть достаточно хороши, чтобы предоставить некоторый пример кода или указать мне некоторые ссылки, где я могу узнать больше о том, как внедрять nonces в приложениях PHP.
Благодаря!
Nonce обычно представляет собой случайную строку, которая добавляется для запроса просто изменить непредсказуемым образом данные, которые используются для вычисления подписи. Таким образом, nonce обычно не используется какой-либо бизнес-логикой на стороне сервера.
В то время как CSRF-токен хранится где-то на сервере, передается клиенту и его нужно возвращать обратно на сервер для сравнения. И если совпадения – тогда ОК.
Таким образом, в вашем случае лучше будет сохранять токен csrf один раз в переменной сеанса, например
$_SESSION['csrf_token'] = bin2hex(random_bytes(16));
и использовать его без изменений во время сеанса во всех формах, которые у вас есть в приложении.
(Если у вас нет random_bytes()
, используйте random_compat для полиполяции.)
Нет, они не то же самое.
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]) , Когда форма отправляется, проверьте, что идентификатор сеанса формы соответствует идентификатору в файле cookie. Этого достаточно для CSRF, так как злоумышленник не может знать значение cookie (CSRF позволяет злоумышленникам слепо отправлять cookie).
Это то же самое. «Nonce» – это всего лишь одноразовый пароль. Он может служить криптографической солью, но в основном это просто случайное значение. См. WP: Nonce
Но, чтобы подвести итог, nonce часто используется как токен CSRF. Это деталь реализации. Разница с другими вариантами использования заключается в том, что она позже утверждается.