虽然形式正确,但Sonata CSRF令牌无效

时间:2017-01-30 12:52:31

标签: php symfony csrf sonata-admin

在使用Symfony / Sonata时,我们面临 CSRF令牌无效错误

之前,相同的代码完美无缺。我们确保表单正确发布令牌。奇怪的是,错误仅出现在所选实体上。

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

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

1 个答案:

答案 0 :(得分:1)

<强>解决方案: 增加 php.ini 中的max_input_vars,至少超过默认的1000:

max_input_vars=2000

<强>原因: 我们在nginx日志中发现了导致CSRF令牌失败的原因。实际上,令牌失效只是一般问题的症状。

以下三个错误日志条目允许解决方案:

  1. 实体请求的大小非常大。这就是发生第一个错误的原因:&#34;这意味着上传文件的大小大于为上传保留的内存缓冲区。“(参见https://serverfault.com/a/511790)。事实上,Sonata正在实体对象中创建许多子对象。
  2.   

    * 357395将客户端请求主体缓冲到临时文件/ var / cache / nginx / client_temp / 0000000742,客户端:192.168.10.152,   server:xxx request:&#34; POST   / admin / entity / 1234 / edit?uniqid = s588b2b142c3d2 HTTP / 1.1&#34;,host:&#34; xxxx&#34;,   推荐人:&#34; http://xxx/admin/entity/1234/edit&#34;

    1. 这是决定性的信息。 max_input_vars定义了$ _POST请求将接受多少输入变量。如果超过1000的(默认)限制,PHP将从请求&#34;中截断&#34;进一步输入变量[...]。因此,通过PHP从$ _POST var中截断了CSRF令牌。
    2.   

      error_admin:2017/01/27 12:19:19 [错误] 51723#51723:* 357395 FastCGI   发送到stderr:&#34; PHP消息:PHP警告:未知:输入变量   超过1000.在php.ini中增加限制更改max_input_vars。   在第0行&#34;从上游读取响应头,   客户端:192.168.10.152,服务器:xxx,请求:&#34; POST   / admin / entity / 1234 / edit?uniqid = s588b2b142c3d2 HTTP / 1.1&#34;,上游:   &#34; fastcgi://127.0.0.1:9000&#34;,主持人:&#34; xxx&#34;,推荐人:   &#34; XXX /管理/实体/ 1234 /编辑&#34;

      1. 这就是第三个错误发生的原因。 &#34;在发送到客户端时由对等方重置连接&#34;,因为$ _POST请求中的令牌显然不再存在(因为它被完全切断或介于两者之间)。对等方找不到有效令牌,因此拒绝该请求。
      2.   

        2017/01/27 12:19:19 [info] 51723#51723:* 357395 recv()失败(104:   发送到客户端,客户端时由对等方重置连接:   192.168.10.152,服务器:xxx,请求:&#34; POST / admin / entity / 1234 / edit?uniqid = s588b2b142c3d2 HTTP / 1.1&#34;,上游:   &#34; fastcgi://127.0.0.1:9000&#34;,主持人:&#34; xxx&#34;,推荐人:   &#34; XXX /管理/实体/ 1234 /编辑uniqid = s588b2b142c3d2&#34;