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