每种形式都需要CSRF保护吗?

时间:2014-12-27 17:09:02

标签: forms symfony fosuserbundle csrf-protection

我知道这是一个基本问题:我是否需要在我的应用程序中的每个表单上或仅在登录页面中提供CSRF保护?

我在Symfony2.6.1中使用FOSUserBundle实现了一个网站。我注意到登录表单受CSRF保护,但所有其他表单都没有(或者至少是我从这里得到的):

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $this->buildUserForm($builder, $options);

    $builder->add('current_password', 'password', array(
        'label' => 'form.current_password',
        'translation_domain' => 'FOSUserBundle',
        'mapped' => false,
        'constraints' => new UserPassword(),
    ));
}

请注意,此功能位于受保护区域内,因为它允许您更改个人资料。

除了FOSUserbundle,问题更广泛。

提前谢谢!

2 个答案:

答案 0 :(得分:2)

在用户完全通过身份验证后,您确实需要对所有可以修改或访问敏感数据的表单进行CSRF保护。

Symfony默认在所有表单上提供此保护。

您可以将其停用:

/**
 * {@inheritdoc}
 */
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'csrf_protection'   => false,
    ));
}

答案 1 :(得分:0)

来自Symfony's form documentation

  

好消息是,默认情况下,Symfony会自动为您嵌入并验证CSRF令牌。这意味着您可以在不做任何事情的情况下利用CSRF保护。

在您的表单中保留CSRF保护总是一个好主意,谢天谢地,Symfony会为您处理它,而无需为其添加额外的代码。