Forms 手动提交symfony表单会导致CSRF错误

Forms 手动提交symfony表单会导致CSRF错误,forms,symfony,Forms,Symfony,我希望能够手动提交带有我创建的数据的symfony表单,但似乎我在提交的数据中缺少CSRF令牌,因此验证失败 表单很简单——只有一个字段(比如参数的“name”)作为没有约束的文本字段 $data = []; if ($someCondition) { $data['name'] = 'steve'; } $form = $this->createForm('FooType', $data); if (!empty($data)) { $form->submit($d

我希望能够手动提交带有我创建的数据的symfony表单,但似乎我在提交的数据中缺少CSRF令牌,因此验证失败

表单很简单——只有一个字段(比如参数的“name”)作为没有约束的文本字段

$data = [];
if ($someCondition) {
    $data['name'] = 'steve';
}
$form = $this->createForm('FooType', $data);
if (!empty($data)) {
    $form->submit($data);
} else {
    $form->handleRequest($request);
}
if ($form->isSubmitted() && $form->isValid()) {
    // do something
}
如果我设置了
$data['name']
表单提交,但我得到
则CSRF令牌无效。请尝试重新提交表单。

很明显,我错过了这个标志。我知道我可以禁用CSRF保护,但我不想这样做,因为还有一个选项可以“正常”与表单交互


如何提交正确的令牌或重写此行为?

我看到您将此标记为
symfony2
问题。考虑到这一点,就我所知,您可以通过将有效的CSRF令牌注入到您的数据、思想、解决方案中,而不是
=2.6
版本

2.6
版本: 现在,
$tokenId
可以是很多东西,如表单的公共测试中所述:

$tokenId = $options['csrf_token_id'] ?: 
                ($form->getName() ?: 
                    get_class($form->getConfig()->getType()->getInnerType()));
但是如果您仔细研究,默认值将是
$form->getName()
,直到
2.8
。我认为
2.8
getName()
方法中删除了抽象,因此
2.8
和更高版本将使用笨拙的值:

get_class($form->getConfig()->getType()->getInnerType())
这一切都是正确的,除非您在表单类型中注入
csrf\u token\u id
选项

更新: 好吧,看来我的错误假设是关于令牌密钥的。虽然您确实获得了有效的令牌,但该令牌未被使用。在我的示例中,我使用了单独的FormType名称空间
AppBundle\Form\SomeFooType
,实际使用的令牌id是
somefoo

我已经制作了一个工作示例的粘贴箱(版本
2.8.8
,与预期的
3.1.2
相同):


希望这能有所帮助。

您好,谢谢您的回复。我使用的是Symfony 2.8(最终将升级到3.x),所以我使用了以下代码:
$data['''''u token']=$this->get('security.csrf.token\u manager')->getToken(get_class($form->getConfig()->getType()->getInnerType())->getValue()并按预期生成一个令牌字符串,但我仍然得到相同的错误,
CSRF令牌无效。请尝试重新提交表单。
如果我将数组设置为
$data[$form->getName()]['''u token']
则会出现相同的错误(如上所述),但也会出现另一个错误,
此表单不应包含额外字段。
再次感谢。嗯,让我推出一些快速foobar项目(我编写了上述内容,但没有实际尝试)我们应该能够想出一个解决办法……我找到了一种基于条件(例如上面的
if($someCondition)
)禁用CSRF保护的方法。我想这个解决方案也很有效。是的,你的最新答案对我很有效。标记为正确的。谢谢你的时间和耐心。顺便说一下-我做了
$data[''u token']=$this->get('security.csrf.token_manager')->getToken($form->getName())->getValue()
$tokenId = $options['csrf_token_id'] ?: 
                ($form->getName() ?: 
                    get_class($form->getConfig()->getType()->getInnerType()));
get_class($form->getConfig()->getType()->getInnerType())