首先我是Symfony 2的新手。这个问题听起来很简单,如果我试着把一些背景放在为什么和如何我需要它会开始变得困惑。
实际上,我已经创建了一个表单,我手动处理,验证和插入使用Doctrine等。我在一个控制器动作中手动创建表单(它是从另一个对象检索到的值动态构建的)。我想也许有更好的方法来做到这一点,但由于我是Symfony的新手,并且在网上搜索了几天,我找不到任何解决方案来解决我需要做的事情。
因此,我不是简单地针对类/实体等构建表单,因此我将手动需要添加CSRF令牌或某种保护。
在正常情况下,您将创建FormType并将默认选项配置为具有csrf_protection。然后一个简单的例子:
{{ form_widget(form._token) }}
和CSRF令牌在那里
当我动态构建表单时,我不确定如何为我的表单手动创建csrf令牌。有没有人有过不使用类创建表单并添加csrf保护的经验?
亲切的问候保罗一磅重的
我想你要找的是以下内容:
这将呈现CSRF令牌。如果您想要CSRF保护而不创建表单,请使用此函数
{{ csrf_token("intention") }}
例如:<a href="{{ path('remove_stuff', {token: csrf_token('intention')}) }}">Remove</a>
来源要从控制器验证这个令牌,可以这样做:
if ($this->get('token') !== $this->get('security.csrf.token_manager')->getToken('intention')->getValue()) {
throw new 'Symfony'Component'Security'Core'Exception'InvalidCsrfTokenException('Invalid CSRF token');
}
简化在Symfony 2.6或更新版本上检查令牌
if ($this->isCsrfTokenValid('intention', $submittedToken)) {
// ... do something, like deleting an object
}
Form Type与token的连接:
{{ csrf_token("task_item_intention") }}
和
class TaskType extends AbstractType
{
// ...
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Acme'TaskBundle'Entity'Task',
'csrf_protection' => true,
'csrf_field_name' => '_token',
// a unique key to help generate the secret token
'intention' => 'task_item_intention',
));
}
// ...
}
在(我的)正常情况下,您创建一个表单并且不特别配置CSRF -它会自动发生,并且您使用form_rest(form)
或form_end(form)
来呈现带有CSRF令牌的隐藏输入。对于没有模型支持的表单,我不认为这有什么不同。