过度发布表单是操纵数据/攻击网站的常见方式。 该可能的安全问题的原因是表单/模型绑定(bind)器,它自动将表单绑定(bind)到对象。在 ASP.NET 中,我知道如何防范此类攻击。
我们有一个用户模型,包含以下字段:ID、名字、姓氏、密码。我希望用户能够更改他的名字和姓氏。 正如我们所知,这种情况发生在带有表单/模型绑定(bind)器的 Symfony(和 ASP.NET MVC)中,它获取表单的“名称”并将这些值映射到相应的对象字段。
ASP.NET 中的解决方案,在每个“后 Controller ”上使用 [Bind] 表达式:
public async Task<ActionResult> Create([Bind(Include="FirstName,Lastname")] Employee employee)
如何在 Symfony 应用程序中防止此类攻击?如何告诉模型/表单绑定(bind)器,哪些发布数据应该只被接受/预期?
@编辑: 这个问题旨在了解在将 FormType 用于多个用例时如何解决此类问题,例如用于创建和编辑员工。我知道,一般来说,Symfony 表单组件已经检查是否有任何其他字段。
最佳答案
class FooType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
if ($options['type'] === 'edit') {
$builder->add('editMe');
//More edit me fields
}
$builder->add('createMe');
//more create me fields
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setRequired(array(
'type'
));
$resolver->setDefaults(array(
'type' => 'create'
));
}
//For consistency
public function getName()
{
return 'foo';
}
}
不需要额外的事件,因为这会造成杀伤力过大。
Controller :
public function createFooAction(Request $request)
{
$form = $this->createForm(new FooType(), new Foo());
$form->handleRequest($request);
if ($form->isValid() && $form->submitted()) {
//flush form
}
return $this->render("AppBundle:Foo:create.html.twig", array(
'form' => $form
));
}
public function editFooAction(Request $request, $id)
{
$foo = ... //find($id)
$form = $this->createForm(new FooType(), $foo, array(
'type' => 'edit'
));
$form->handleRequest($request);
if ($form->isValid() && $form->submitted()) {
//flush form
}
return $this->render("AppBundle:Foo:edit.html.twig", array(
'form' => $form
));
}
关于php - 在 Symfony 中防范 "Overposting Forms",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31584699/