Forms 在Symfony 2多租户应用程序中测试表单篡改

Forms 在Symfony 2多租户应用程序中测试表单篡改,forms,symfony,security,symfony-forms,Forms,Symfony,Security,Symfony Forms,在我的项目中,用户可以创建一个客户,并为其分配零个或多个标记。当然,这些实体与用户有关系。这是通过一个表单完成的,该表单有一个标记字段,由当前登录的用户过滤: $user = $this->securityContext->getToken()->getUser(); $builder ->add('tags', 'meta_selector', array( 'label' => 'Tag', 'class

在我的项目中,
用户
可以创建一个
客户
,并为其分配零个或多个
标记
。当然,这些实体与
用户
有关系。这是通过一个表单完成的,该表单有一个
标记
字段,由当前登录的用户过滤:

$user = $this->securityContext->getToken()->getUser();

$builder
    ->add('tags', 'meta_selector', array(
        'label'         => 'Tag',
        'class'         => 'Acme\HelloBundle\Entity\Tag',
        'property'      => 'select_label',
        'query_builder' => function(EntityRepository $er) use($user) {
            $qb = $er->createQueryBuilder('t');

            return $qb
                ->where($qb->expr()->eq('t.user_id', ':user')
                ->orderBy('t.name')
                ->setParameter('user', $user);
        }
    ))
;
这很好用。查看生成的HTML标记时,标记显示为复选框:

<div class="controls">
    <label class="checkbox">
        <input type="checkbox" value="2" name="customer[tags][2]"
            id="customer_tags_2"> A Tag
    </label>
    <label class="checkbox">
        <input type="checkbox" value="3" name="customer[tags][3]" 
            id="customer_tags_3"> Another Tag
    </label>
</div>
。。似乎有某种控制阻止了这一切。结果是
200 OK
(如果成功,应为
302
),没有任何错误,并再次呈现表单。当然,实体不是持久化的

实际问题是:Symfony 2如何防止这种形式的“篡改”攻击?一种可能的解释是,it检查表单生成器返回的集合中是否存在提交的标记。但是需要一份参考资料


编辑:即使禁用CSRF保护,结果也是一样的。顺便说一句,我正在传递一个有效的令牌,CSRF旨在防止其他类型的攻击。

胡乱猜测:CSRF保护已启用,您不会呈现错误。

您的问题的答案可以很容易地解释。每个选项字段(实体类型是选项类型的专门化)都有一个选项列表。对于每个选择,字段都知道

  • 选择(例如
    标记
    实例)的模型表示(“选择”)
  • 选择的视图表示(“值”)(例如ID)
  • 视图中使用的标签(例如
    标记的属性
提交表单时,选项字段将在此列表中查找与提交的视图表达匹配的模型表达。如果找不到,则该字段将保持未分配状态


在您的例子中,可以在类及其子类中找到此逻辑的代码。提交后,将执行进行查找并优化速度的方法。

AFAIK CSRF与我所说的无关,这在我的情况下是没有用的,正如你所看到的:我正在发送有效的令牌和POST数据…所以当你在config.yml中禁用它时,结果是一样的?我已经在没有表单csrf保护的情况下进行了测试,它也会这样做。它将返回200 OK,表单中没有错误。这是Sf2防止此类攻击的内部机制吗?也许它会检查id=1的标记是否在生成器返回的集合中?
POST http://localhost/Symfony2/web/app_dev.php/app/customers/new HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: it-it,it;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://localhost/Symfony2/web/app_dev.php/app/customers/new
Cookie: PHPSESSID=3avu1a2a1eufthr5tdftuhrnn7; hl=it
Content-Type: application/x-www-form-urlencoded
Content-Length: 276

customer%5Bfirst%5D=fake&customer%5Blast%5D=fake&customer%5Bgender%5D=m&customer%5Bbirthday%5D=&customer%5Bemail%5D=&customer%5Bmobile%5D=&customer%5Baddress%5D=&customer%5Bcountry%5D=IT&customer%5Btags%5D%5B1%5D=1&customer%5B_token%5D=455783fa2f866677669c9034a90554b9f75d68b4