Symfony 2在使用没有类的表单时添加CSRF Token


Symfony 2 Add CSRF Token when using a form without a class

首先我是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令牌的隐藏输入。对于没有模型支持的表单,我不认为这有什么不同。