Php 索纳塔CSRF令牌无效,尽管形式正确

Php 索纳塔CSRF令牌无效,尽管形式正确,php,symfony,csrf,sonata-admin,Php,Symfony,Csrf,Sonata Admin,在使用Symfony/Sonata时,我们面临着CSRF令牌无效错误 以前,同样的代码工作得很好。我们保证通过表单正确发布令牌。奇怪的是,该错误仅针对选定的实体出现 在这里浏览所有其他Q/A并不能解决问题 如果客户端和服务器之间的常规通信正常,还有什么会使CSRF令牌无效?解决方案: 在php.ini中增加max\u input\u vars,至少超过默认值1000: max_input_vars=2000 原因: 我们在nginx日志中找到了导致CSRF令牌失败的原因。事实上,令牌失效只是一

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

以前,同样的代码工作得很好。我们保证通过表单正确发布令牌。奇怪的是,该错误仅针对选定的实体出现

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

如果客户端和服务器之间的常规通信正常,还有什么会使CSRF令牌无效?

解决方案: 在php.ini中增加
max\u input\u vars
,至少超过默认值1000:

max_input_vars=2000
原因: 我们在nginx日志中找到了导致CSRF令牌失败的原因。事实上,令牌失效只是一个普遍问题的症状

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

  • 实体请求的大小非常大。这就是为什么会出现第一个错误:“这意味着上传文件的大小大于为上传保留的内存缓冲区。”(请参阅)。实际上,Sonata正在实体对象中创建许多子对象
  • *357395客户端请求主体缓冲到临时文件/var/cache/nginx/client_temp/0000000 742,client:192.168.10.152, 服务器:xxx请求:“POST” /admin/entity/1234/edit?uniqid=s588b2b142c3d2 HTTP/1.1“,主机:“xxxx”, 推荐人:“

  • 这是决定性的信息。
    max\u-input\u-vars
    定义了一个$\u-POST请求将接受多少输入变量。如果(默认)限制超过1000,PHP将截断“来自请求的更多输入变量[…”。因此,CSRF令牌被PHP从$\u-POST-var截断。
  • 错误管理:2017/01/27 12:19:19[错误]51723#51723:*357395 FastCGI 在stderr中发送:“PHP消息:PHP警告:未知:输入变量 超过1000。要增加限制,请更改php.ini中的max_input_vars。 在从上游读取响应标头时,在第0行“未知”中, 客户端:192.168.10.152,服务器:xxx,请求:“POST” /admin/entity/1234/edit?uniqid=s588b2b142c3d2 HTTP/1.1“,上游: "fastcgi://127.0.0.1:9000,主持人:“xxx”,推荐人: “xxx/admin/entity/1234/edit”

  • 这就是发生第三个错误的原因。“发送到客户端时由对等方重置连接”,因为$u POST请求中的令牌显然不存在(不再存在),因为它被完全切断或在两者之间被切断。对等方找不到有效的令牌,因此拒绝请求
  • 2017/01/27 12:19:19[信息]51723#51723:*357395 recv()失败(104: 发送到客户端时,由对等方重置连接,客户端: 192.168.10.152,服务器:xxx,请求:“POST/admin/entity/1234/edit?uniqid=s588b2b142c3d2 HTTP/1.1”,上游: "fastcgi://127.0.0.1:9000,主持人:“xxx”,推荐人: “xxx/admin/entity/1234/edit?uniqid=s588b2b142c3d2”