设置复选框的ID会导致CakePHP中出现安全性错误

时间:2013-04-16 20:57:19

标签: cakephp cakephp-2.0

我在AppController中使用Security组件。我需要构建一个检查表单输入,允许自定义格式化列表中的每个项目。为了实现这一点,我使用foreach处理$options集合中的每个项目并创建新元素,如下所示:

foreach ($fileTypes as $fileType_key => $fileType_value) {
   echo $this->Form->input(
      'FilesIncluded.' . $fileType_key, 
         array(
            'type' => 'checkbox', 
            'value' => $fileType_key,
            'label' => false, 
            'div' => false,
            'before' => '<span class="checkbox clearfix"><span class="check">',
            'after' => '</span><label for="add-product-check-sub-cat">' . $fileType_value . '</label></span>',
            'hiddenField' => false,
         )
      );
}

有几点需要注意:

  1. 我将每个复选框设置为data[FilesIncluded][{UUID}](其中UUID实际上代表了FilesIncluded的UUID),而不是data[FilesIncluded][]
  2. FilesIncluded不是表单模型的一部分,因此它将$this->request->data显示为$this->request->data['FilesIncluded'],而不是$this->request->data['Model']['column']
  3. 我想弄清楚为什么会引发身份验证安全风险?当我将字段名称从'FilesIncluded.' . $fileType_key更改为其中包含计数器的内容时​​,如'FilesIncluded.' . $count . '.id',它似乎无需抛出任何安全验证错误。任何想法如何使我的工作方式与我期待的方式相同?

    更新

    另一个问题是能够维护一组固定的FileTypes。例如,我希望能够控制可以从复选框中选择的HABTM记录。例如,我将显示以下列表: http://cl.ly/image/0b1Q3C0d0w1Y

    只有当用户选择记录时,才会将它们存储为hasMany。然后,当需要编辑时,我希望不仅能够显示相同的记录集,而且还要将它们与用户保存的记录相关联。

1 个答案:

答案 0 :(得分:2)

(可能)原因

您可能收到了安全性错误,因为您要禁用hiddenField复选框。安全组件在创建表单并进行比较时,根据表单字段的名称计算校验和,检查提交的表单是否有效(即篡改)这是在提交表单时收到的数据。

通过取消隐藏字段,如果未选中,则复选框将在发布的数据中不存在(未检查复选框永远不会以HTML格式发送)。如上所述,CakePHP根据期望的字段/输入和接收的实际字段(数据)计算校验和。 通过禁用hiddenField,根据发布的数据计算的校验和将取决于检查 的复选框,这将使发布的数据无效

变通方法

可能有一些解决方法;

  • 请勿取消隐藏'hiddenField'这将确保复选框始终出现在已发布的数据中。如果复选框未选中,则复选框的将为0(零)。如果复选框 ,则其发布的值将是复选框的指定值(如果未指定值,则为1

  • 从校验和中排除自定义输入。您可以通过$this->Form->unlockField('fieldname');从校验和中排除字段。在计算安全校验和时,CakePHP将忽略这些输入。

文档:FormHelper::unlockField()

备注

虽然这些变通办法可能有所帮助,但我建议重新发明轮子。通过更改输入的名称,您将不再遵循CakePHP约定。遵守惯例通常会为您节省大量时间。

例如,可以通过一次Model::saveAssociated()调用来保存相关的数据。如果正确设置了模型关系,例如:

Document->hasMany->UserFiles,然后CakePHP将自动插入/更新DocumentUserFiles数据。

请阅读Saving Related Model Data (hasOne, hasMany, belongsTo)

中的文档