在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');
}
}
}
答案 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;
}
}