php - 在 Symfony 中防范 "Overposting Forms"

标签 php forms symfony model-binding

过度发布表单是操纵数据/攻击网站的常见方式。 该可能的安全问题的原因是表单/模型绑定(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
    ));
}

Bonus

关于php - 在 Symfony 中防范 "Overposting Forms",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31584699/

相关文章:

javascript - PHP 脚本检索 JSON 文件 - 如何将其传递给 JavaScript?

javascript - 使用 Symfony/PHP7 的 Handlebars / mustache

php - 在不影响当前页面的情况下使用 HTML post

php - 使用 Doctrine 按 FIELD() 排序,这可能吗?

forms - 在 Symfony2 表单中插入 Google Recaptcha

php - 简单的日期函数在 php 中不起作用

php - 使用 PHP Hook 替换 Woocommerce 画廊图像 src

postgresql - 如何永久删除 Doctrine 迁移?

jquery 表单事件监听器

php - Symfony 自定义验证不起作用