PHP - CSRF токен не остается согласованным, но возвращается к предыдущему токену - PullRequest
0 голосов
/ 31 октября 2018

В настоящее время происходит то, что веб-страница загружается, генерирует новый токен CSRF, назначает его переменной SESSION, а также добавляет его к скрытому вводу. Он отправляет его в php-файл, где он проверяется, а затем переменную csrf SESSION для сброса / сброса. Но происходит то, что токен SESSION, похоже, не обновляется при отправке запроса, а происходит обновление до предыдущего токена. Скажем по запросу 1. Оба токена отправлены отлично. Перезагрузите страницу, затем отправьте, и мы видим только токен во входном обновлении, сеанс остается тем же. По запросу 3 сеанс обновляется до токена запроса 2 и не обновляется до запроса 3s токена. Его возвращение на шаг позади. Почему это так, кто-нибудь может мне помочь с моим кодом?

HTML-файл:

<form action="file.php" method="POST">
<input type="text" name="field1">
<input type="text" name="field2">
<?php
session_start();
$CSRFToken = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM));
$_SESSION["register-csrf-token"] = $CSRFToken;
echo'<input type="hidden" name="csrf-token" value="' . $CSRFToken . '">';
?>
<button type="submit">Submit</button>
</form>

PHP-файл:

<?php
// Hash Equals Function
if(!function_exists('hash_equals')) {
  function hash_equals($str1, $str2) {
    if(strlen($str1) != strlen($str2)) {
      return false;
    } else {
      $res = $str1 ^ $str2;
      $ret = 0;
      for($i = strlen($res) - 1; $i >= 0; $i--) $ret |= ord($res[$i]);
      return !$ret;
    }
  }
}



session_start();
$CSRFToken = $_POST["csrf-token"];
$field1 = $_POST["field1"];
$field2 = $_POST["field2"];
// Validating CSRF-Token
if (hash_equals($_SESSION["register-csrf-token"], $CSRFToken)) {
    unset($_SESSION['register-csrf-token']);
} else {
    echo "csrfTokenExpired";
    die();
}
?>

Это также можно увидеть в действии на моем сайте: http://fortniteprosnipes.x10.bz/register/

...