8

首先,我完全是 Symfony 2 的菜鸟。这个问题听起来很简单,如果我尝试将一些上下文说明我为什么需要它以及如何需要它,它就会开始变得混乱。

本质上,我创建了一个表单,我使用 Doctrine 等手动处理、验证和插入该表单。我在控制器操作中手动创建表单(它是从另一个对象的检索值动态构建的)。我假设可能有更好的方法来做到这一点,但由于我是 Symfony 的新手,并且在网上拖网的日子里,我看不到任何我需要做的解决方案。

因此,我不是简单地针对类/实体等构建表单,因此我需要手动添加 CSRF 令牌或某种保护。

在正常情况下,您将创建 FormType 并将默认选项配置为具有 csrf_protection。然后是一个简单的案例:

{{ form_widget(form._token) }}

csrf 令牌就在那里。

当我动态构建表单时,我不确定如何为我的表单手动创建一个 csrf 令牌。有没有人有过创建没有类的表单并添加 csrf 保护的经验?

亲切的问候保罗庞德

4

3 回答 3

26

我认为您正在寻找的是以下内容:

这将呈现一个 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
}  
于 2013-07-30T15:40:52.037 回答
12

表单类型和令牌之间的连接:

{{ 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',
    ));
}

// ...
}
于 2014-03-15T13:24:14.390 回答
6

在(我的)正常情况下,您创建一个表单并且专门配置 CSRF - 它会自动发生,并且您使用form_rest(form)form_end(form)使用 CSRF 令牌呈现隐藏的输入。我不认为这对于没有模型支持的表单有任何不同。

于 2013-04-21T21:35:50.577 回答