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

Не устанавливайте значение в форме, но перед сохранением данных. Только устанавливать значения в скрытых полях, если это необходимо сделать на уровне представления, если не всегда устанавливать такие значения в контроллере, лучше моделировать. Помните: жирные модели, тощие контроллеры.

Вы всегда должны использовать компонент Security в своих проектах, чтобы избежать фальсификации формы и других атак.

Прочитайте о компоненте безопасности здесь. http://book.cakephp.org/2.0/ru/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; } 

Обычно идентификатор присутствует только в том случае, если запись существует, если вы хотите сделать ее более твердой, вы можете проверить существование () для этого идентификатора, а также полностью убедиться, что ее еще нет.

Еще одна рекомендация:

 $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(); 

Это должно быть сделано в вашей модели User . Существует обратный вызов модели, называемый beforeSave вы можете использовать для добавления значения group_id . Не делайте этого с точки зрения .

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

Подробнее см. В официальной документации .

Отредактировано:

Чтобы узнать текущее действие, мы будем использовать объект Router в соответствии с ответом следующего вопроса: $ this-> params возвращает null в модели cakephp

Таким образом, мы можем изменить предыдущий код:

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