为什么$ form ['_ csrf_token'] - > render();在symfony 1.4.8中渲染一个没有值的隐藏输入?

时间:2010-11-10 18:27:47

标签: php symfony1 symfony-1.4 symfony-forms

我使用symfony 1.4.8并且在尝试渲染隐藏的csrf表单字段时,没有将值添加到渲染字段。我之前没有问题就完成了这件事。请参阅以下示例,以查看代码和渲染输出。

代码:

<?php echo $form['_csrf_token']->render(); ?>

生成:

<input type="hidden" name="contact[_csrf_token]" id="contact__csrf_token" />

代码:

<?php echo $form['_csrf_token']->renderRow(); ?>

生成:

<tr>
  <th><label for="contact__csrf_token"> csrf token</label></th>
  <td><input type="hidden" name="contact[_csrf_token]" value="3cf960d4553e2649f86d0ccd12a26efe" id="contact__csrf_token" /></td>
</tr>

如您所见,第二种方法为csrf_token生成值,但它也会生成所有其他行信息。 render()方法应该只生成带有值的'widget'(在本例中为隐藏的输入字段)。由于某种原因,它不会增加值。

4 个答案:

答案 0 :(得分:1)

为什么需要显式渲染它?你为什么不使用$form->renderHiddenFields()

答案 1 :(得分:0)

改为使用$form->renderHiddenFields()

答案 2 :(得分:0)

你必须做一个硬刷新。你的会话中有些东西被卡住了。

硬刷新是Shift + F5

如果失败,请删除您域中的所有域Cookie,然后重试。

这只是一个会话问题,前提是你没有在其他地方搞过csrf。

答案 3 :(得分:0)

虽然在symfony中出现这种行为有很多不同的原因:

  • 在流程表单验证之前不要使用 bind
  • 会话时间结束,没有会话ID。
  • CSRF验证已停用或尚未在 settings.yml 文件中设置 csrf_secret

我提供了一个快速解决方案来直接打印CSRF令牌值:

<input type="hidden" name="signin[_csrf_token]" id="signin__csrf_token" value="<?php echo $form->getCSRFToken(); ?>" />

使用:

$form->getCSRFToken();

将呈现新生成的CSRF令牌。