这是我的表格:
<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文档不会对它说任何事情。
答案 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