即使传递_csrf_token,也会检测到Symfony CSRF攻击

时间:2011-08-10 19:20:48

标签: php forms symfony1 csrf

这是我的表格:

<form novalidate action="<?php echo url_for('article/submit') ?>" method="POST">
  <?php echo $form['title']->renderRow() ?>
  <?php echo $form['content']->renderRow() ?>
  <?php echo $form->renderHiddenFields() ?>
  <input type="submit" value="Save"/>
</form>

在查看生成的HTML源代码时,_csrf_token IS实际上正在呈现。这是我的行动:

public function executeSubmit(sfWebRequest $request)
{
  $this->forward404Unless($request->isMethod('post'));
  $request->checkCSRFProtection();

  die('submitting post...');
}

错误:

_csrf_token [CSRF attack detected.]

即使在我的行动中,如果我做var_dump($_POST); die;,我也会得到:

Array
(
  [title] => string(8) "My title"
  [content] => string(10) "My Content"
  [_csrf_token] => string(32) "<my token here>"
)

因此,csrf令牌肯定正在被渲染并正确传递。我做错了什么?

此外,checkCSRFProtection()是否有任何文档?除了承认它存在之外,API文档不会对它说任何事情。

1 个答案:

答案 0 :(得分:4)

要检查的一些事项:

来源:来自http://oldforum.symfony-project.org/index.php/t/17867/

请确保您已在自己的设置中定义了“秘密”:

csrf_secret: ThisIsMySecret  # Unique secret to enable CSRF protection or false to disable`

此外,根据我从该表单发布的内容,CSRF保护检查会自动在$this->form->isValid()中完成,因此如果您已经在检查表单是否已填写,则无需拨打$request->checkCSRFProtection()有效。如果没有,请添加$this->form->isValid()

$request->checkCSRFProtection()似乎也不适用于表格;它的目的(如果我是正确的)是验证用户点击链接时提供的请求。启用CSRF保护后,link_to()会自动将CSRF保护添加到其生成的链接中。因此,基本上,表单的CSRF保护与不是源自表单的请求的保护不同。

有关详细信息,请参阅此故障单:http://trac.symfony-project.org/ticket/7315

可能感兴趣的另一张票:http://trac.symfony-project.org/ticket/5698