Нет, они не одинаковы.
Одноразовые номера предотвращают повторные атаки (не позволяют подслушивающему сохранять подписанный запрос и повторно отправлять его позже, например, если Алиса отправит «Оплатить Боба $ 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).