刚刚升级到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())
方法完成。
答案 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令牌”错误