<?php
$_SESSION['csrf_token'] = md5(uniqid(rand(), true));
?>
<?php
$csrf1 = $_POST['csrf_token'];
$csrf2 = $_SESSION['csrf_token'];
if($csrf1 === $csrf2) {
//not executing
} else {
}
?>
JavaScript
var csrf = "<?php echo $_SESSION['csrf_token']; ?>";
var ajax = ajaxObj("POST", "index.php");
ajax.onreadystatechange = function() {
if(ajaxReturn(ajax) == true) {
if(ajax.responseText != "success"){
} else {
window.location.replace("login.php");
}
}
}
ajax.send("csrf_token="+csrf);
}
return false;
所以,这是我的代码中的一些PHP,它生成一个CSRF令牌,将其放入会话中,然后检查会话值和POST值是否相同。问题是,if 语句没有执行。当我在使用 ajax 发送请求之前回显会话令牌时,会话令牌是相同的。我相当确定会话令牌正在更改,但不确定原因。
编辑:我添加了我的javascript。我从中删除了很多东西,所以我希望我没有搞砸任何东西。
OP 未能提供的一个非常重要的信息是,请求转到制作其令牌的同一脚本。因此,正在发生的事情正是应该发生的事情。这是我在不同的网站上提供给他的解决方案。
<?php
if((isset($_SESSION['csrf_token'], $_SESSION['time']) && time() - $_SESSION['time'] > 60) || !isset($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = md5(uniqid(rand(), true));
$_SESSION['time'] = time();
}
?>
if($csrf1 === $csrf2) {
更改为:if($csrf1 == $csrf2) {
我会echo
内容并直观地比较两者以检查相同的值。 对于它的价值,你试过strcmp()
吗?
if(strcmp($csfr1, $csfr2) == 0) {
//Got a match
} else {
//No match, look at the two strings for debug purposes.
print("<pre> CSRF1: $csrf1 'n CSRF2: $csrf2 </pre>");
}