symfony2 CSRF 无效

Posted

技术标签:

【中文标题】symfony2 CSRF 无效【英文标题】:symfony2 CSRF invalid 【发布时间】:2012-05-13 15:35:10 【问题描述】:

好的,所以今天我用我们的“实时”数据库中的新信息更新了我的数据库……从那时起,我的一个表单就出现了问题。如果您需要任何代码,请告诉我,我将对其进行编辑并发布所需的代码...

我有一个报告表单,其中包含一个日期范围字段和一个代理部门的下拉列表。当我第一次访问该页面时,我在表单的开头看到了这个:

The CSRF token is invalid. Please try to resubmit the form

因此,我转到具有相同类型信息的其他表单之一,并检查了 _token,结果如下:

<input type="hidden" id="ecs_crmbundle_TimeClockReportType__token" name="ecs_crmbundle_TimeClockReportType[_token]" value="87e358fbc4d6d3e83601216b907a02170f7bcd92" />
<input type="hidden" id="ecs_crmbundle_SimpleSalesReportType__token" name="ecs_crmbundle_SimpleSalesReportType[_token]" value="87e358fbc4d6d3e83601216b907a02170f7bcd92" />

第一个是显示错误的那个,而 SimpleSalesReport 没有...知道为什么会这样或者我该如何解决?

谢谢..

【问题讨论】:

【参考方案1】:

您是否偶然在产生 CSRF 错误的操作中使用了 $form->bindRequest()?我有这个问题。您不应该绑定新表单的请求。如果您将表单发布到相同的操作,请将 bindRequest 包装在一个条件中,该条件检查方法是否为 POST:

if ($this->getRequest()->getMethod() == 'POST') 
  $form->bindRequest($this->getRequest());
  if ($form->isValid()) 
    ...
  

【讨论】:

这人真是个天才!这正是我正在做的......但你来拯救了这一天! 另外,记得在底部添加 form_rest(form) 作为表单的最后一个字段。 Symfony 会使用该语句为您插入 CSRF 令牌。 symfony.com/doc/current/book/… @krishna 这正是我所缺少的;我草率的复制/粘贴! 你太棒了!也感谢您解决了我的问题。 也可以使用$this-&gt;getRequest()-&gt;isMethod('POST')【参考方案2】:

使用 form_widget(form) 构建您的自定义表单没有问题。 您所要做的就是像这样添加_token form_widget(form._token)

【讨论】:

【参考方案3】:

这个错误让我疯狂了好几天! 感谢克里希纳! 如果在您的表单模板中您选择不使用默认表单行为 form_widget(form) ,您应该输入 form_rest(form) 希望这可以帮助其他人!

【讨论】:

以上是关于symfony2 CSRF 无效的主要内容,如果未能解决你的问题,请参考以下文章

Symfony:身份验证请求失败:无效的 CSRF 令牌

CSRF 和 RESTful API (symfony2, php)

Symfony2 注销 CSRF 保护:csrf_provider 无法识别

带有 CSRF 的 Symfony2 表单通过 JQuery AJAX 传递

Symfony2 - 重载注册表单导致 CSRF 错误(添加 github repo)

Symfony2无效形式没有错误