2016-05-19 3 views
3

Я пытаюсь добавить токены CSRF в свои формы. Проблема заключается в том, что когда я добавляю его в файл, я выхожу из токена сеанса, и он совпадает с токеном во входном имени с именем «токен». Но когда я отправляю страницу и использую Token :: check, она возвращает false, и если я выхожу из значения токена из ввода и сеанса снова, я вижу, что значение сеанса изменилось, но входное значение оставалось неизменным.Изменение переменной сеанса при отправке формы.

<?php 
class Token{ 
public static function generate(){ 
    return $_SESSION['token'] = base64_encode(openssl_random_pseudo_bytes(32)); 
} 

public static function check($token){ 
    if(isset($_SESSION['token']) && $token == $_SESSION['token']){ 
     unset($_SESSION['token']); 
     return true; 
    }else{ 
     return false; 
    } 
} 
} 
?> 

Адрес этой страницы: php для управления формой.

$token = $_POST['token']; 
if(Token::check($token)){ //Continue with more code } 

Ниже приводится часть формы, которая имеет дело с лексем:

<input type="hidden" name="user_id_update" value="<?php echo $user_info[0][0]->id; ?>"/> 
          <input type="hidden" name="time_update" value="<?php echo $time; ?>"/> 
          <input type="hidden" name="token" value="<?php echo Token::generate(); ?>" 
          <hr /> 

          <div class="form-group"> 
           <input type="submit" id="submit_update" value="Update" class="btn btn-success"/> 
          </div> 

Если кто-то может пролить некоторый свет на это я очень ценю это, как я искал в Интернете для часов сейчас и не может найти ответ. Благодарю.

+0

Основываясь на вашем примере кода и объяснении, я не вижу ничего плохого. Что-то еще происходит, что не было предоставлено, что делает его полной гадательной игрой. –

ответ

0

После некоторых копаний через код. Я обнаружил, что порядок добавления этих файлов на сайт означал, что код для создания токена был выше контроллеров для формы. Таким образом, когда форма была размещена, каждый раз создавалась новая переменная сессии, поэтому размещенные данные были не такими же, как данные, хранящиеся в переменной сеанса. Изменение порядка, в котором были включены эти файлы, решило проблему. Надеюсь, это может помочь кому-то в будущем.

0

Такая же проблема была и со мной. Проведя много времени и отладки, я пришел к странному решению. Проблема заключалась в метатеге. Позвольте мне рассказать вам, как я разрешил свою проблему.

Имя файла: Token.php

<?php 
    class Token 
    { 
     public static function generate() 
     { 
      return $_SESSION['token'] = md5(time() . uniqid()); 
     } 

     public static function check($token) 
     { 
      if (isset($_SESSION['token']) && $token == $_SESSION['token']) { 
       unset($_SESSION['token']); 
       return true; 
      } else { 
       return false; 
      } 
     } 
    } 
?> 

Имя файла: myscript.php

<?php require_once 'header.php'; ?> 

<?php 
    if ($_SERVER['REQUEST_METHOD'] == 'POST') { 

     if(Token::check($_POST['token'])) { 
       echo 'valid token'; 

       // code... 
     } else { 
       echo 'invalid token'; 
     } 

    } 
?> 

<form action="" method="post"> 
    <!-- other fields --> 
    <input type="hidden" name="token" value="<?php echo Token::generate();?>"> 
    <input type="submit" value="Submit"> 
</form> 

<?php require_once 'footer.php'; ?> 

Имя файла: header.php

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8"> 
    <meta http-equiv="X-UA-Compatible" content="IE=edge"> 
    <meta name="viewport" content="width=device-width, initial-scale=1"> 
    <meta name="author" content="Ishtiyaq Husain"> 
    <link rel="shortcut icon" href="#" /> 

    <!-- other css files --> 
</head> 

Эти значения я получаю:

Первая страница загрузки:

// print old token value from session 
echo $_SESSION['token']; //no value 
// generate new token 
echo Token::generate(); // e72a2f53a25f364e8a2e62e556f7e417 
// print new token value from session 
echo $_SESSION['token']; // e72a2f53a25f364e8a2e62e556f7e417 

После обновления страницы:

// print old token value from session 
echo $_SESSION['token']; // a63e674d55e9248c25a48856649bf590 //expected value -> e72a2f53a25f364e8a2e62e556f7e417 
// generate new token 
echo Token::generate(); // 237063c2f7892242c79bfabcd48bcdc8 
// print new token value from session 
echo $_SESSION['token']; // 237063c2f7892242c79bfabcd48bcdc8 

В момент маркер проверки он получает новое значение маркера в $ _SESSION [ 'токенов']. Вот почему это не совпадает со значением из скрытого поля ввода. После отладки я обнаружил, что если мы удалим эту строку из header.php, она будет работать. Есть ли для этого обоснованное объяснение?

<link rel="shortcut icon" href="#" /> 

или использовать действительный URL для значка типа:

<link rel="shortcut icon" href="http://ishtiyaq.com/images/iLogo.png" /> 

Результат был:

Первая страница загрузки:

// print old token value from session 
echo $_SESSION['token']; //no value 
// generate new token 
echo Token::generate(); // 36e48f2307da7054c67822147878e0c6 
// print new token value from session 
echo $_SESSION['token']; // 36e48f2307da7054c67822147878e0c6 

После обновления страницы:

// print old token value from session 
echo $_SESSION['token']; // 36e48f2307da7054c67822147878e0c6 //as expected 
// generate new token 
echo Token::generate(); // 734eaeeb862d4d0d52eea1a292f007ec 
// print new token value from session 
echo $_SESSION['token']; // 734eaeeb862d4d0d52eea1a292f007ec 
Смежные вопросы