设置复选框的id会导致CakePHP中出现安全错误
我正在使用AppController中的设置复选框的id会导致CakePHP中出现安全错误,cakephp,cakephp-2.0,Cakephp,Cakephp 2.0,我正在使用AppController中的安全组件。我需要建立一个检查表单输入,允许列表中每个项目的自定义格式。为了实现这一点,我正在使用foreach处理$options集中的每个项目,并创建新元素,如下所示: foreach ($fileTypes as $fileType_key => $fileType_value) { echo $this->Form->input( 'FilesIncluded.' . $fileType_key,
安全组件。我需要建立一个检查表单输入,允许列表中每个项目的自定义格式。为了实现这一点,我正在使用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,
)
);
}
foreach($filetypeas$fileType\u key=>$fileType\u值){
echo$this->Form->input(
“包含文件”。$fileType\u键,
排列(
'键入'=>'复选框',
“值”=>$fileType\u键,
'label'=>false,
'div'=>false,
'在'=>''之前,
'在'=>''.$fileType_值'.''之后,
'hiddenField'=>false,
)
);
}
有几件事需要注意:
我正在将每个复选框设置为data[FilesIncluded][{UUID}]
(其中UUID实际上表示包含文件的UUID),而不是data[FilesIncluded][
包含的文件不是表单模型的一部分,因此它将以$this->request->data
的形式出现在$this->request->data['FilesIncluded']
中,而不是$this->request->data['model']['column']
我想弄明白的是,为什么这会带来身份验证安全风险?当我将字段名从“FilesIncluded”更改时$文件类型\u键
指向某个带有计数器的对象,如“包含文件”$伯爵。id“
,它似乎可以在不引发任何安全验证错误的情况下工作。有没有办法让这项工作达到我的预期效果
更新:
另一个问题是能够维护一组固定的文件类型。例如,我希望能够控制可以从复选框中选择的HABTM记录。例如,我将显示以下列表:
而且只有当用户选择了这些记录时,它们才会被存储为hasmount。然后,当需要编辑时,我希望不仅能够显示相同的记录集,而且能够将它们与用户保存的记录关联起来。(可能)原因
您可能会遇到安全错误,因为您正在禁用复选框的hiddenField
。安全组件在创建表单时根据表单字段的名称计算校验和,并将其与提交表单时收到的数据进行比较,从而检查提交的表单是否有效(即未被篡改)
通过抑制hiddenField,如果未选中该复选框,则该复选框将不会出现在发布的数据中(未选中的复选框永远不会以HTML格式发送)。如上所述,CakePHP根据预期的字段/输入和接收的实际字段(数据)计算校验和通过禁用hiddenField,根据发布的数据计算的校验和将取决于是否选中复选框,这将使发布的数据无效
权变措施
可能有一些变通办法
- 不要抑制“隐藏字段”这将确保已发布数据中始终存在复选框。如果未选中复选框,复选框的值将为
0
(零)。如果选中该复选框,则其过账值将是该复选框的指定值(如果未指定值,则为1
)
- 从校验和中排除自定义输入。您可以通过
$this->Form->unlockField('fieldname')从校验和中排除字段代码>。CakePHP在计算安全校验和时将忽略这些输入
文件:
笔记
虽然这些变通方法可能会有所帮助,但我建议不要重新发明轮子。通过更改输入的名称,您不再遵循CakePHP约定。遵守惯例通常可以节省很多时间
例如,保存相关数据可以通过单个Model::saveAssociated()
调用来执行。如果正确设置了模型关系,例如:
Document->hasMany->UserFiles
,然后CakePHP将自动插入/更新文档
和用户文件
数据
请阅读此处的文档谢谢您的更新!但是,如果没有保存任何记录,并且我想显示6个默认选项供他们选择,我如何使其正常工作?也就是说,文件类型是预定义的选项(PHP、PSD、HTML、图像、文档、CSS、JS)。我希望它们向用户显示为可以被选择,但只有当它们被选中时,它们才会保存在hasMany中?另一方面,当它们被选中时,编辑表单也能正确显示它们吗?(见更新后的帖子)我更愿意用正确的方式来做这件事,但是当字段是预定义的选项列表而不是用户可以自己添加的内容时,我很难确定如何做。是的,这就是HABTM的想法,例如user Filetype
Filetype包含一个Filetype记录列表。每个选定的文件类型都将在联接表中为该用户添加一条记录。如果表单字段的命名正确,只需使用Model::save()
即可保存所有表单字段。为此,请阅读此问题,并提供一些信息:。如果您的文件类型模型名为“Filetype”,则复选框必须命名为“Filetype.Filetype.x”,其中“x”是FormHelper中的数字索引(我不在计算机后面,因此无法完全检查)。感谢您解开我的大脑!我现在知道我需要做什么了。我对一组有限的数据有很多关联。我需要做的是建立一个HABTM关联,并将关联的数据绑定到它。谢谢