2012-06-12 36 views
2

我有一个简单的形式与几个选择输入。其中之一是性别选择。cakePHP - 防止窗体选择列表篡改

的输入,像这样产生的:

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

我如何可以确保只有给定的选择可以提交,从而使3或东西不能提交?

我使用的是安全组件,它似乎可以防止字段名称被篡改,但不会损害数据的篡改。

对于较大的选择列表(如状态选择),做一个简单的比较将不实用。此外,我试图避免做额外的查询来验证ID。

+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

使这个领域在DB的ENUM场允许值1和2

你可以防止有人将提交第三值,只需通过操纵DOM或萤火POST请求。如果它不是数据库值,并且不通过模型表单验证规则运行,则必须在控制器中手动执行。因为根据你的描述只有这种验证是必要的。

+0

我想这对于性别领域是可行的,但我不认为这对于国家领域来说是可行的。为此,我正在使用关联的表格。 – Paramount

+0

然后添加一个外键(你应该已经有了这些,Cake是围绕它们构建的)。数据库违规将触发cakeError。 – Jay

+0

@powtac感谢您的编辑。我并不是建议用户不能操纵DOM。我更想知道Cake是否缓存了后来可以比较的选择值。我很惊讶安全组件不会自动为您考虑它到达有效字段名称的程度。 – Paramount