Маркер формы не совпадает, когда пользователь обновляет страницу - PullRequest
0 голосов
/ 05 апреля 2011

Я написал следующие три функции в попытке предотвратить перехват сеанса.Они работают.Я вызываю set_auth_token в начале скрипта.Затем в HTML-форме я вызываю get_auth_token.После того, как форма была опубликована, я звоню check_auth_token.Однако иногда после того, как пользователь заполнил форму и неправильно ее заполнил, он, как правило, нажимает клавишу F5 / Обновить.Это заставляет страницу «умереть».Это не происходит до заполнения формы.

Что я могу сделать, чтобы улучшить их, чтобы они не умирали каждый раз, когда пользователь нажимает кнопку обновления?

function set_auth_token()
{
   if (!isset($_SESSION['auth_token']))
   {
      $_SESSION['auth_token'] = hash('sha256',rand().time().$_SERVER['HTTP_USER_AGENT'].$_SERVER['REQUEST_URI']);
   }
}

get_auth_token isвсегда вызывается после вызова set_auth_token, следовательно, он умирает, если не может найти токен авторизации:

function get_auth_token()
{
   if (isset($_SESSION['auth_token']))
   {
      return $_SESSION['auth_token'];   
   }
   else
   {
      die('"No auth token."');
   }
}

Функция, вызывающая умирание страницы:

function check_auth_token()
{
   if (array_key_exists('auth_token', $_SESSION) && array_key_exists('auth_token', $_POST))
   {
      if ($_SESSION['auth_token'] == $_POST['auth_token'])
      {
         $_SESSION['auth_token'] = hash('sha256', rand() . time() . $_SERVER['HTTP_USER_AGENT'] . $_SERVER['REQUEST_URI']);
      }
      else
      {
         die('Woah! It seems like you pressed Refresh (or Back/Forward). Just click here to sort it out.'); # TODO: hyperlink silly
      }
   }
   else
   {
      die('no auth token');
   }
}

Cheers.

1 Ответ

1 голос
/ 05 апреля 2011

Я предполагаю (основываясь на вашем комментарии), что когда пользователь обновляется, он снова отправляет свои данные POST, но auth_token обновляется в начале скрипта, и, следовательно, значение в $_POST(сгенерированный на предыдущей странице) больше не будет соответствовать новому значению (сгенерированному в начале скрипта).

Вы должны посмотреть Post / Redirect / Get , чтобы остановить повторную отправку сообщенияdata.

Вы можете также не восстанавливать ключ, пока не подтвердите или не утвердите существующий.

...