Play 2.2.1中的CSRF在启用csrf.sign.tokens时,Scala始终失败

时间:2013-11-09 16:41:35

标签: scala csrf playframework-2.2

刚刚升级到2.2.1,我对CSRF处理的情况感到有些困惑。使用默认配置,我总是会收到“Missing CSRF token”错误,即使会话数据中有明显的csrfToken。

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

token.flatMap(Crypto.extractSignedToken)
    .map(token => Token(Crypto.signToken(token)))
CSRF.getToken中的

给我一​​个无令牌。在启用令牌签名时,有没有人知道什么会使CSRF失败 。我没有(明知)改变任何与CSRF相关的配置默认值。我的怀疑是,令牌的格式错误且Crypto.extractSignedToken失败了,但我无法弄清楚为什么会出现这种情况。

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

1 个答案:

答案 0 :(得分:1)

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

csrf.token.name=csrfToken1

有点讨厌的黑客攻击,但它确实有效。我想过将令牌移动到它自己的cookie(使用csrf.cookie.name属性但仍然导致“丢失CSRF令牌”错误