2012-06-12 1 views
2

У меня простая форма с несколькими входами выбора. Один из них - выбор пола.cakePHP - предотвращение формы выбор списка фальсификация

вход генерируется следующим образом:

echo $this->Form->input('gender_id', array(
    'options' => array(
     1 => 'Male', 
     2 => 'Female' 
    ) 
)); 

Как я могу гарантировать, что только данные выбирает можно представить, так что 3 или что-то не может быть подано?

Я использую компонент безопасности и, похоже, защищает от фальсификации имени поля, но не изменяет значение.

Проведение простого сравнения нецелесообразно для более крупных списков выбора, таких как выбор состояния. Также я пытаюсь избежать дополнительных запросов для проверки идентификаторов.

+1

Существует недавнее обсуждение на эту тему здесь: http://cakephp.lighthouseapp.com/projects/42648/tickets/2938 -securitycomponent-htmlhelper-check-select-values ​​ – nIcO

+0

Спасибо за ссылку. Похоже, что он не реализован и не будет добавлен в будущем. – Paramount

ответ

1

Требовать значения, чтобы быть в указанном списке для проверки вашей модели:

public $validate = array(
    'gender_id' => array(
     'allowed' => array(
     'rule' => array('inList', array(1, 2)), 
     'message' => 'Please select male or female.' 
    ) 
    ) 
); 
0

Сделать это поле в БД в ENUM поле с допустимым значением 1 и 2.

Вы можете не предотвратить, что кто-то представит третье значение, просто манипулируя DOM или запрос POST с FireBug. Если это не значение БД и не выполняется в соответствии с правилами проверки формы модели, вам нужно сделать это вручную в своем контроллере. Поскольку существует только такая проверка, согласно вашему описанию.

+0

Я полагаю, что это возможно для гендерного поля, но я не верю, что это так же полезно для поля состояния. Для этого я использую связанную таблицу. – Paramount

+0

Затем добавьте внешний ключ (вы действительно должны иметь их уже, Cake построен вокруг них). Нарушение БД вызовет cakeError. – Jay

+0

@powtac Благодарим за редактирование. Я не предполагаю, что пользователь не сможет манипулировать DOM. Я больше задавался вопросом, сохранил ли Cake выбранные значения, которые затем можно было бы сравнить с ними. Я совершенно удивлен тем, что компонент безопасности автоматически не делает этого для вас, учитывая степень, в которой он проходит, до действительных имен полей. – Paramount