2017-01-30 54 views
0

虽然用的Symfony /索纳塔的工作,我们所面临CSRF令牌无效错误索纳塔CSRF令牌无效虽然形式正确

之前,同样的代码工作完美。我们放心,令牌是由形式正确公布。奇怪的是,这个错误只出现在选定的实体上。

这里浏览所有其他的Q/A不能解决问题。

还有什么可以让CSRF令牌无效,如果客户端和服务器之间的一般通信效果很好?

回答

1

解决方案: 增加max_input_varsphp.ini中,至少超过默认1000:

max_input_vars=2000 

原因: 我们在nginx的发现记录什么导致了CSRF令牌失败。事实上,令牌失效只是一个普遍问题的症状。

以下三个错误日志条目让该解决方案:

  1. 实体的请求的大小是非常大的。这就是为什么第一个错误happend:“这意味着,上传文件的大小比为上传保留在内存中的缓冲区大。”(见https://serverfault.com/a/511790)事实上,索纳塔是在创造了很多子对象。 。实体对象

* 357395的客户机请求体被缓冲到一个临时文件/ var /缓存/ nginx的/ client_temp/0000000742,客户端:192.168.10.152, 服务器:XXX请求:“POST /管理/实体/ 1234 /编辑uniqid = s588b2b142c3d2 HTTP/1.1" ,主机: “XXXX”, 引荐: “http://xxx/admin/entity/1234/edit

  • 这是决定性的信息。 max_input_vars定义,除其他外,有多少投入乏将在$ _ POST请求接受。如果(缺省)限制超过1000,PHP将截断“来自请求的其他输入变量”。所以,CSRF标记被PHP截断了$ _POST var。
  • error_admin:2017年1月27日12点19分19秒[错误] 51723#51723:* 357395的FastCGI 在标准错误发送:“PHP消息:PHP的警告:未知: 超过1000个输入变量为了增加限制变化max_input_vars在php.ini 在未知线0" ,而读取来自上游, 客户端响应标头:192.168.10.152,服务器:XXX,请求:“POST /管理/实体/ 1234 /编辑?uniqid = s588b2b142c3d2 HTTP/1.1“,上行: ”fastcgi://127.0.0.1:9000“,主机:”xxx“,引用者: ”xxx/admin/entity/1234 /编辑“

  • 这就是为什么第三误差发生。“发送到客户端时由对等方重置连接”,因为$ _POST请求中的标记显然不存在(不再存在),因为它完全或在两者之间被切断。对等体找不到有效的令牌并因此拒绝该请求。在发送到客户端,客户端:(由对等 重置连接104): 192.168:
  • 2017年1月27日十二时19分19秒[信息] 51723#51723 * 357395的recv()失败。 10.152,server:xxx,请求:“POST/admin/entity/1234/edit?uniqid = s588b2b142c3d2 HTTP/1.1”,上游: “fastcgi://127.0.0.1:9000”,主机:“xxx”,referrer: “xxx/admin/entity/1234/edit?uniqid = s588b2b142c3d2”