Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
设置复选框的id会导致CakePHP中出现安全错误_Cakephp_Cakephp 2.0 - Fatal编程技术网

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

设置复选框的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,

我正在使用AppController中的
安全组件。我需要建立一个检查表单输入,允许列表中每个项目的自定义格式。为了实现这一点,我正在使用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关联,并将关联的数据绑定到它。谢谢