反CSRF无法正常工作

时间:2014-03-26 20:28:29

标签: php security csrf

<?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;

所以,我的代码中有一些生成CSRF令牌的PHP,将其置于会话中,然后检查会话值和POST值是否相同。问题是,if语句没有执行。当我在使用ajax发送请求之前回显会话令牌时,会话令牌是相同的。我非常确定会话令牌正在改变,我不确定为什么。

编辑:我添加了我的javascript。我从中删除了很多,所以我希望我没有把它搞砸了。

3 个答案:

答案 0 :(得分:1)

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();
} 
?>

答案 1 :(得分:0)

if($csrf1 === $csrf2) {

改变:if($csrf1 == $csrf2) {

答案 2 :(得分:0)

我会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>");
}