Один токен против нескольких токенов для предотвращения CSRF-атак
Я использую Codeigniter, и я хочу предотвратить попытки CSRF-атак. И для этого я добавляю скрытый входной тег со случайным токеном в каждую форму, которую я хочу защитить, и в то же время сохраняю этот токен в сеансе для сравнения, когда начинаю обрабатывать данные формы.
// set a token to prevent CSRF attacks
$csrf_token = md5(uniqid(rand(), true));
$this->session->set_userdata("csrf_token", $csrf_token);
И форма будет выглядеть так:
И на странице, где я обрабатываю представленные данные, я проверяю CSRF-атаки примерно так:
// make sure there is no CSRF attack attempt
$csrf_token = $this->session->userdata("csrf_token");
if (empty($csrf_token) || $csrf_token !== $this->input->post("csrf_token")) {
die("Some message here!!");
}
И это работает довольно хорошо. Но, как вы видите, я генерирую случайный токен для каждой страницы, содержащей форму, и в некоторых случаях это вызывает проблему, если, например, я открыл другую вкладку в браузере, чтобы выполнить какое-то другое действие. Рассмотрим этот сценарий:
я открылadd.php
страница, чтобы добавить новый элемент.Я заполнил все необходимые данные, но я неотправить форму.Теперь я решил открытьedit.php
страницу в другой вкладке в браузере для редактирования существующего элемента.Затем я вернулся кadd.php
страница, которая была заполнена и пыталась предоставить данные.В этот момент я получу сообщение об ошибке, поскольку значение токена, который был сохранен в сеансе при открытииadd.php
страница была изменена и заменена другим токеном при открытииedit.php
стр. Так как я могу решить эту проблему? Должен ли я генерировать только один токен для каждого пользователя, когда он успешно войдет в систему, а затем использовать этот токен на всех страницах, с которыми он может иметь дело? Есть ли у этого подхода какие-либо риски или недостатки?