CSRF状态令牌与提供的FB PHP SDK 3.1.1 Oauth 2.0不匹配

Har*_*rei 23 facebook csrf facebook-graph-api oauth-2.0 facebook-php-sdk

我的服务器日志显示"CSRF状态令牌与提供的不匹配"错误,这似乎几乎每个用户都会发生.但是,用户是创建和/或验证的,我能够检索用户信息.我正在使用Apache的Linux服务器.我也在使用最新的Facebook PHP SDK v.3.1.1谁能告诉我为什么会这样,以及如何解决它?

jch*_*hes 36

上周我遇到了类似的问题,并state通过多次调用覆盖了该字段getLoginUrl().每次调用时getLoginUrl(),state都会在SDK中生成一个新令牌并存储在$_SESSION(它只是一个随机值),所以如果你调用它两次并且用户使用第一个链接登录,第二个调用将重置SDK的内部state令牌,您将在日志中收到此错误.

SDK state在Facebook授权用户并将其重定向回您的站点后在URL中查找相同的令牌,如果它不匹配,则会记录此错误(此处是指向的链接).


Jim*_*ane 8

在同一个处理程序中两次检查令牌时,Facebook SDK代码有一个错误.

我编辑了facebook.php像这样的getCode函数:

protected function getCode() {
    if (!isset($_REQUEST['code']) || !isset($_REQUEST['state']) || $this->state === null) {
      return false;
    }
    if ($this->state === $_REQUEST['state']) {
        // CSRF state has done its job, so clear it
        $this->state = null;
        $this->clearPersistentData('state');
        return $_REQUEST['code'];
    }
    self::errorLog('CSRF state token does not match one provided.');

    return false;
}
Run Code Online (Sandbox Code Playgroud)

如果被调用两次,则更清楚并且不会声明无效令牌.

要清楚,该函数可以在同一个url处理程序上调用两次,例如:

$facebook->getUser();然后在同一个处理程序中,$facebook->getLogoutUrl()然后getCode()调用两次,从而导致无效的错误消息


Ron*_*oni 3

嗯,我曾经遇到过这个问题,并且URL 中的state&参数有问题- 我的文件没有转发它们。code.htaccess

我猜你也有同样的问题。

CSRF 状态令牌与提供的状态令牌不匹配

希望这可以帮助