Один токен против нескольких токенов для предотвращения 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 стр. Так как я могу решить эту проблему? Должен ли я генерировать только один токен для каждого пользователя, когда он успешно войдет в систему, а затем использовать этот токен на всех страницах, с которыми он может иметь дело? Есть ли у этого подхода какие-либо риски или недостатки?

Ответы на вопрос(2)

Ваш ответ на вопрос