1

我正在编写一个具有内部请求身份验证的后端应用程序,所以我不需要 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>

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

4

1 回答 1

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

于 2013-09-30T11:00:55.107 回答