3

刚刚升级到 2.2.1,我对 CSRF 处理的情况有点困惑。使用默认配置时,我总是会收到“缺少 CSRF 令牌”错误,即使会话数据中显然有一个 csrfToken。

经过更多的探索,我发现我可以通过csrf.sign.tokens在设置中设置为 false 来防止这种情况(默认为 true)。出于某种原因,这些行:

token.flatMap(Crypto.extractSignedToken)
    .map(token => Token(Crypto.signToken(token)))

inCSRF.getToken给了我一个 None 令牌。有谁知道只有在启用令牌签名时才会导致 CSRF 失败。我没有(故意)更改任何与 CSRF 相关的配置默认值。我的怀疑是令牌格式错误并且Crypto.extractSignedToken失败了,但我不知道为什么会这样。

我的应用程序的 CSRF 保护是使用全局WithFilters(CSRFFilter())方法完成的。

4

1 回答 1

1

这似乎是因为 Play 2.1.x 中的 CSRF 令牌与 2.2 或 2.3 中的不兼容。如果您有来自 2.1.x 应用程序的 cookie,然后将应用程序升级到 2.2,当客户端使用旧 cookie 值发出请求时,您会看到此问题。我找到的最简单的解决方案是重命名 application.conf 中的令牌,如下所示:

csrf.token.name=csrfToken1

有点讨厌的黑客,但它的工作原理。我考虑过将令牌移动到它自己的 cookie(使用该csrf.cookie.name属性,但这仍然导致“缺少 CSRF 令牌”错误

于 2014-09-18T19:35:45.233 回答