Похоже, что вы возражаете против того, чтобы сеанс оставался открытым до тех пор, пока открыт браузер, - это проблема автоматических атак. К сожалению, обновление токена на каждой странице загружает только самых злоумышленников-любителей.
Во-первых, я предполагаю, что речь идет об атаках, специально направленных на ваш сайт. (Если мы говорим о ботах, которые просто бродят и отправляют различные формы, это не только не остановит их, но и есть гораздо лучшие и более простые способы сделать это.) Если это так, и я нацеливаюсь на своих сайт, вот что мой бот будет делать:
- Загрузить страницу формы.
- Прочитать токен на странице формы.
- Отправить автоматический запрос с этим токеном.
- Перейти к шагу 1.
(Или, если бы я достаточно исследовал вашу систему, я бы понял, что если бы я включал заголовок «это AJAX» в каждый запрос, я мог бы сохранить один токен навсегда. Или я бы понял, что токен - это мой сеанс ID и отправьте мой собственный PHPSESSID
cookie.)
Этот метод изменения токена при каждой загрузке страницы абсолютно ничего не сделает, чтобы остановить человека, который на самом деле хотел напасть на вас так сильно. Поэтому, поскольку токен не влияет на автоматизацию, сконцентрируйтесь на его влиянии на CSRF.
С точки зрения блокировки CSRF создание одного токена и его поддержка до тех пор, пока пользователь не закроет браузер, кажется, выполняет все задачи. Простые CSRF-атаки побеждены, и пользователь может открывать несколько вкладок.
TL; DR: обновление токена один раз при каждом запросе не повышает безопасность. Выберите удобство использования и сделайте один токен за сеанс.
Однако! Если вы крайне обеспокоены дублированием форм, случайным или иным образом, эту проблему все еще можно легко решить. Ответ прост: используйте два токена для двух разных заданий.
Первый токен останется прежним до конца сеанса браузера. Этот токен существует для предотвращения CSRF-атак. Любая заявка от этого пользователя с этим токеном будет принята.
Второй токен будет сгенерирован уникально для каждой загруженной формы и будет сохранен в списке в данных сеанса пользователя токенов открытой формы. Этот токен является уникальным и становится недействительным после его использования. Материалы от этого пользователя с этим токеном будут приниматься один раз и только один раз.
Таким образом, если я открою вкладку для формы A и вкладку для формы B, у каждого из них будет свой личный токен анти-CSRF (забота о CSRF) и мой одноразовый токен формы (повторная передача формы позаботится о ). Обе проблемы решаются без какого-либо вреда для пользователя.
Конечно, вы можете решить, что это слишком много для реализации такой простой функции. Я думаю, что это так или иначе. В любом случае, если вы хотите, существует твердое решение.