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->getRequest()->isMethod('POST')
。【参考方案2】:
使用 form_widget(form)
构建您的自定义表单没有问题。
您所要做的就是像这样添加_token
:
form_widget(form._token)
【讨论】:
【参考方案3】:这个错误让我疯狂了好几天!
感谢克里希纳!
如果在您的表单模板中您选择不使用默认表单行为 form_widget(form)
,您应该输入 form_rest(form)
希望这可以帮助其他人!
【讨论】:
以上是关于symfony2 CSRF 无效的主要内容,如果未能解决你的问题,请参考以下文章
CSRF 和 RESTful API (symfony2, php)
Symfony2 注销 CSRF 保护:csrf_provider 无法识别
带有 CSRF 的 Symfony2 表单通过 JQuery AJAX 传递