我知道这是一个基本问题:我是否需要在我的应用程序中的每个表单上或仅在登录页面中提供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,问题更广泛。
提前谢谢!
答案 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会为您处理它,而无需为其添加额外的代码。