【问题标题】:Anti-CSRF not working correctly反 CSRF 无法正常工作
【发布时间】:2014-03-28 05:56:51
【问题描述】:
<?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。我从中删除了很多内容,所以我希望我没有搞砸它。

【问题讨论】:

  • 这段代码是否在一个 PHP 文件中(所以上面的所有代码都是按顺序执行的)?如果是这样,$_POST['csrf_token'] 应该从哪里来?
  • 除了@ComFreek 的评论之外,我们还需要您提供更多代码才能弄清楚发生了什么。如果您可以发布提交此表单的代码以及任何其他相关代码,这将对我们找到根本原因非常有帮助
  • 您是否针对每个请求更新$_SESSION['csrf_token']
  • 让我更新代码。
  • @ComFreek 抱歉,我从来没有注意到你的评论,但是是的,它是一个 PHP 文件,我更新了它,所以你可以看到 $_POST['csrf_token'] 来自哪里。

标签: php security csrf


【解决方案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();
} 
?>

【讨论】:

    【解决方案2】:
    if($csrf1 === $csrf2) {
    

    更改为:if($csrf1 == $csrf2) {

    【讨论】:

    • 都是字符串,所以应该不是问题。
    【解决方案3】:

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

    【讨论】:

    • 感谢您的帮助。我实际上只是尝试过这个,无论如何,它都会运行//得到匹配。即使我更改了 POST 值。
    猜你喜欢
    • 2017-01-05
    • 1970-01-01
    • 2015-12-21
    • 2019-07-27
    • 2019-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    相关资源
    最近更新 更多