首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >设置复选框的id会导致CakePHP中的安全性错误

设置复选框的id会导致CakePHP中的安全性错误
EN

Stack Overflow用户
提问于 2013-04-16 20:57:18
回答 1查看 667关注 0票数 1

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

代码语言:javascript
复制
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实际上表示UUID pf、FilesIncluded),而不是data[FilesIncluded][]
  2. FilesIncluded不是表单模型的一部分,因此它将以$this->request->data['FilesIncluded']而不是$this->request->data['Model']['column']的形式出现在$this->request->data中。

我想弄明白的是为什么这会带来安全风险?当我将字段名从'FilesIncluded.' . $fileType_key更改为带有计数器的东西(如'FilesIncluded.' . $count . '.id' )时,它似乎可以工作,而不会引发任何安全错误。有什么想法,如何使这个工作的方式,我期待它吗?

更新:

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-16 21:54:15

(可能)原因

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

通过取消hiddenField,如果未选中复选框,则该复选框将不会出现在发布的数据中的中(未选中的复选框永远不会在HTML中发送)。如上所述,CakePHP根据期望的字段/输入以及它接收的实际字段(数据)计算校验和。通过禁用hiddenField,从发布的数据中计算出的校验和将取决于是否有复选框选中了或 not,这将使发布的数据无效。

解决办法

可能会有一些解决办法;

  • 不禁止“hiddenField”,这将确保复选框始终存在于已发布的数据中。如果未选中复选框,则复选框的值将为0 (零)。如果选中复选框,则其posted值将是复选框的指定值(如果未指定值,则为1 )。
  • 将您的自定义输入排除在校验和中。您可以通过$this->Form->unlockField('fieldname');从校验和中排除字段。在计算安全校验和时,CakePHP将忽略这些输入。

文档:FormHelper::unlockField()

备注

虽然这些解决办法可能有帮助,但我建议不要重新发明轮子。通过更改输入的名称,您不再遵循CakePHP约定。坚持惯例常常会节省你很多时间。

例如,可以使用单个Model::saveAssociated()调用来保存相关数据。如果您的模型-关系已正确设置,例如:

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

阅读这里的文档,保存相关模型数据(hasOne、hasMany、belongsTo)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16046930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档