Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当启用CSRF.sign.tokens时,Play 2.2.1 Scala中的CSRF总是失败_Scala_Csrf_Playframework 2.2 - Fatal编程技术网

当启用CSRF.sign.tokens时,Play 2.2.1 Scala中的CSRF总是失败

当启用CSRF.sign.tokens时,Play 2.2.1 Scala中的CSRF总是失败,scala,csrf,playframework-2.2,Scala,Csrf,Playframework 2.2,刚刚升级到2.2.1,我对CSRF的处理有点困惑。使用默认配置时,我总是会出现“缺少CSRF令牌”错误,即使会话数据中显然有csrfToken 再仔细观察一下,我发现我可以通过在设置中将csrf.sign.tokens设置为false(默认值为true)来防止这种情况。出于某种原因,这些行: token.flatMap(Crypto.extractSignedToken) .map(token => Token(Crypto.signToken(token))) 他给了我一个“没

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

再仔细观察一下,我发现我可以通过在设置中将
csrf.sign.tokens
设置为false(默认值为true)来防止这种情况。出于某种原因,这些行:

token.flatMap(Crypto.extractSignedToken)
    .map(token => Token(Crypto.signToken(token)))
他给了我一个“没有”的代币。是否有人知道只有在启用令牌签名时,什么会使CSRF失败。我没有(故意)更改任何与CSRF相关的配置默认值。我的怀疑是,不知何故,令牌的格式是错误的,并且出现了故障,但我不明白为什么会出现这种情况


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

这似乎是因为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令牌”错误

我也遇到了同样的问题。我无法手动复制错误,但每天都会收到一些错误报告。有更新吗?迈克?谢谢你的发布。对不起,兰迪,我仍然没有时间重新访问此问题,并且仍在使用未签名的令牌。如果我弄明白了,我会在这里提供答案。谢谢迈克。我切换到了未签名的令牌和令牌直到得到错误。对我来说,这只发生在面向公众的表单上。@RandyFindley仍然没有正确地诊断出这一点,但我注意到,从第2.2.2-RC1场开始,我不再需要禁用签名令牌。这当然对你没有帮助,但我可能会四处看看已经做了哪些更改,这些更改可能指向某个地方的罪犯。如果你还没有打开2.2.2-RC1,值得一试(我没有发现任何问题——不过,请注意,2.2.2-RC2完全破坏了子项目的增量编译)。当您查看标记值时,这一点很明显——在2.1.x中,它们是20个字符,而在2.3中,它们是76个字符