Нужно ли нам генерировать токен для каждой формы на веб-сайте? Я имею в виду, каждый раз, чтобы генерировать различный токен для каждой запрошенной формы? Если нет, то почему?
Защита CSRF: нужно ли нам генерировать токен для каждой формы?
Ответ 1
В общем, достаточно всего одного токена за сеанс, так называемого токена для каждого сеанса:
В общем, разработчикам требуется только генерировать этот токен один раз для текущего сеанса. После первоначальной генерации этого токена значение сохраняется в сеансе и используется для каждого последующего запроса до окончания сеанса.
Если вы хотите еще больше повысить безопасность, вы можете использовать один токен для каждой формы /URL (маркер для каждой формы), чтобы смягчить воздействие, когда утечка одного токена (например, XSS), поскольку злоумышленник сможет только успешно атаковать эту конкретную форму /URL.
Но используя токены для каждого запроса, т.е. е. токены, которые изменяются с каждым запросом, скорее сокращают удобство использования веб-сайта, так как ограничивают параллельный просмотр:
Чтобы еще больше повысить безопасность этого предлагаемого дизайна, рассмотрите возможность рандомизации маркера CSRF [...] для каждого запроса. Внедрение этого подхода приводит к генерации токенов для каждого запроса, в отличие от токенов для каждого сеанса. Обратите внимание, однако, что это может привести к проблемам удобства использования. Например, функция браузера кнопки "Назад" часто препятствует, поскольку предыдущая страница может содержать токен, который больше недействителен. Взаимодействие с этой предыдущей страницей приведет к ложному положительному событию безопасности CSRF на сервере.
Поэтому я рекомендую вам использовать токены для каждого сеанса или токены для каждой формы.
Ответ 2
Нет, вам просто нужно создать токен для каждого сеанса.
Токены очень маловероятны, чтобы случайно просочиться от пользователей, и генерация токена в форме делает вещи очень сложными, если пользователь просматривает сайт в двух разных вкладках/окнах одновременно.