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

Pau*_*der 7 php forms csrf symfony

首先,我是Symfony 2的完全noobie.问题听起来很简单,如果我尝试将一些上下文放入为什么以及如何需要它,它将开始变得混乱.

从本质上说我已经创建了一个表格,其中我手动过程,验证和使用学说等我手动创建一个控制器动作内的形式插入(它动态地建立从检索到的值从另一个对象).我假设可能有更好的方法来做到这一点,但由于我是Symfony的新手和拖网的日子,我看不到任何我需要做的解决方案.

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

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

{{ form_widget(form._token) }}
Run Code Online (Sandbox Code Playgroud)

并且csrf令牌在那里.

由于我正在动态构建表单,因此我不确定如何为表单手动创建csrf令牌.有没有人有没有课程创建表单和添加csrf保护的经验?

亲切的问候Paul Pounder

Żab*_*jad 26

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

这将呈现CSRF令牌.如果您想要CSRF保护而不创建表单,请使用此功能

{{ csrf_token("intention") }}
Run Code Online (Sandbox Code Playgroud)

例如:

<a href="{{ path('remove_stuff', {token: csrf_token('intention')}) }}">Remove</a>
Run Code Online (Sandbox Code Playgroud)

资源

要从控制器验证此令牌,您可以执行以下操作:

if ($this->get('token') !== $this->get('security.csrf.token_manager')->getToken('intention')->getValue()) {
    throw new \Symfony\Component\Security\Core\Exception\InvalidCsrfTokenException('Invalid CSRF token');
}
Run Code Online (Sandbox Code Playgroud)

简化检查Symfony 2.6或更新版本上的令牌

if ($this->isCsrfTokenValid('intention', $submittedToken)) {
    // ... do something, like deleting an object
}  
Run Code Online (Sandbox Code Playgroud)


d3u*_*ter 11

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

{{ csrf_token("task_item_intention") }}
Run Code Online (Sandbox Code Playgroud)

并在表格类型中:

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

// ...
}
Run Code Online (Sandbox Code Playgroud)


dyl*_*ver 6

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

  • 这是正确的:)无论你是否动态构建表单都没关系.默认情况下,在所有表单上启用CSRF保护. (2认同)