PHP-CSRF令牌无法保持一致,但会回溯到先前的令牌

时间:2018-10-31 20:39:55

标签: php csrf-protection

当前正在发生的情况是,网页加载,生成新的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/

0 个答案:

没有答案