CakePHP:在表单上安全地设置默认值

时间:2014-02-18 21:45:54

标签: php security cakephp

在CakePHP 2.4中,如何将表单的一部分安全地设置为默认值?

在我的用户注册视图中,我目前正在将此默认group_id设置为3,但是如果有人伪造表单,那么在视图中执行此操作似乎是一个巨大的安全漏洞。

<?php echo $this->Form->hidden('group_id', array('value'=>'3')); ?>

我当前的register方法:

public function register() {
    if ($this->request->is('post')) {
        $this->User->create();
        if ($this->User->save($this->request->data)) {
            $this->Session->setFlash(__('The user has been saved'), 'flash/success');
            $this->redirect(array('action' => 'index'));
        } else {
            $this->Session->setFlash(__('The user could not be saved. Please, try again.'), 'flash/error');
        }
    }

}

2 个答案:

答案 0 :(得分:3)

在保存数据之前,请勿在表单中设置值。如果需要在视图层中完成,则仅在隐藏字段中设置值,如果不总是在控制器中设置此类值,则更好的模型。记住:胖模特,瘦小的控制者。

您应始终使用项目中的安全组件,以避免形式篡改和其他攻击。

在此处阅读有关安全组件的信息http://book.cakephp.org/2.0/en/core-libraries/components/security-component.html#form-tampering-prevention

  

默认情况下,SecurityComponent会阻止用户篡改表单。   它通过使用FormHelper并跟踪哪些文件来完成此操作   在一种形式。它还跟踪隐藏输入元素的值。   所有这些数据被组合并变成哈希。当表格是   提交后,SecurityComponent将使用POST数据构建相同的内容   结构并比较哈希。

将此组件添加到添加模型中。

您也可以将值保存在beforeSave()中,您只需要检查记录是否为新记录,或者检查记录是否已存在。

public function beforeSave($options = array()) {
    if (empty($this->id) && empty($this->data[$this->alias][$this->primaryKey])) {
        $this->data[$this->alias]['group_id'] = 3;
    }
    return true;
}

通常id仅在记录存在时出现,如果你想使它更加稳固,你可以检查该id的exists()以及完全确定它不存在。

另一个最佳实践提示:

$this->data[$this->alias]['group_id'] = 3;

吸收。没人知道3是什么。如果组没有改变,最好有一个空的无表格模型或带常数的简单类:

$this->data[$this->alias]['group_id'] = UserGroup::USER;
$this->data[$this->alias]['group_id'] = UserGroup::ADMIN;
$this->data[$this->alias]['group_id'] = // You get the idea...

如果这些群体由于某种原因是动态的,我猜他们仍然有某种标识符:

$this->data[$this->alias]['group_id'] = $this->UserGroup->getDefaultGroupId();

答案 1 :(得分:0)

这应该在您的User模型中完成。有一个名为beforeSave的模型回调,您可以使用它来添加group_id值。 请勿在视图中执行此操作

//in User.php

public function beforeSave(){
   $this->data['User']['group_id'] = 3;
}

查看更多in the official documentation

<强>编辑:

要知道当前的操作,我们将根据以下问题的答案使用Router对象:$this->params returns null in cakephp model

因此,我们可以将以前的代码修改为:

//in User.php

public function beforeSave(){
   $params = Router::getParams();
   if ($params['action'] == 'register'){ 
       $this->data['User']['group_id'] = 3;
      }
}