symfony 2 csrf选择性启​​用?

时间:2013-09-30 09:59:44

标签: forms symfony csrf

我正在编写一个对请求进行内部身份验证的后端应用程序,因此我不需要CSRF - 除了少量实际向用户公开的表单。

所以我在config.yml中禁用了CSRF,但我想为特定表单启用它。根据文档,这应该做的伎俩:

public function setDefaultOptions(OptionsResolverInterface $resolver) {
    $resolver->setDefaults(array(
        // FIXME: this doesn't work, I still don't get CSRF ?
        'csrf_protection' => true,
        'csrf_field_name' => '_token',
    ));
}

但事实并非如此,我仍然没有以这种形式获得CSRF令牌。我的枝条文件说:

<form action="{{ path('mypath') }}" method="post" {{ form_enctype(form) }}>
    {{ form_widget(form) }}
    <button name="submit">{{ 'register.submit'|trans }}</button>
</form>

这也应该有效。有什么问题?

1 个答案:

答案 0 :(得分:2)

问题是当您在config.yml中禁用CSRF时,您说您不希望在项目中加载CSRFExtension。你刚刚以“全球方式”禁用了它。所以你不能在那之后使用它。

您可以在代码中看到它是如何完成的: Symfony\Bundle\FrameworkBundle\DependencyInjection\FrameworkExtension::registerFormConfiguration($config, ContainerBuilder $container, XmlFileLoader $loader)

您可以看到,在您的情况下,此行返回false。

$this->isConfigEnabled($container, $config['csrf_protection']) // this returns false

因此未加载CSRFExtension。

如果你没有得到config.yml和扩展之间的关系,请在这里阅读它的工作原理:http://symfony.com/doc/current/cookbook/bundles/extension.html