我在控制器中执行此操作
$sources = array('' => 'Select Source') + Sources::lists('name', 'id');
其中Source
是模型。
然后在视图中,我这样做:
{{Form::select('source_id', $sources, '', $sources)}}
<span>{{$errors->first('source_id')}}</span>
结果HTML是:
<select ="select="" source"="" dubizzle="Dubizzle" name="source_id">
<option value="" selected="selected">Select Source</option>
<option value="1">Dubizzle</option>
</select>
如您所见,第一个选项Select Source
没有任何价值。因此,当我提交表格而不选择任何来源时,并验证输入如下:
$validation = Validator::make(Input::All(), XMLDocument::$rules);
if($validation->passes()){}else{
return Redirect::back()->withInput()->withErrors($validation);
}
我收到了source_id
是必需的错误消息。
完美无缺。
我使用Google Chrome F12开发工具检查HTML,并在Select Source
选项中添加了一个值。然后我提交表单,验证没有发现错误。这是因为source_id
有一个值。
黑客可以轻松操纵HTML,我的服务器和数据库将会崩溃,因为这个source_id
是一个外键,所有东西都连接到它。
如何从中拯救自己?
验证source_id
的规则是:
'source_id' => 'required|integer',
答案 0 :(得分:1)
而不是:
$sources = array('' => 'Select Source') + Sources::lists('name', 'id');
您可以使用:
$sources = array('Select Source') + Sources::lists('name', 'id');
所以第一项将是:
<option value="0">Select Source</option>
然后在您的规则中添加not_in:0
,例如:
'source_id' => 'required|integer|not_in:0'
它会起作用,因为您的数据库中没有元素/记录的id为0
。我总是这样做。
答案 1 :(得分:0)
您需要验证所选来源是否为有效来源。您可以使用exists
规则,或者如果不是,则只需创建自定义规则。我会说exists
规则应符合该法案。