据我之前的帖子所知,xss_clean
将在调用$this->form_validation->run()
后过滤$this->input->post('text_url')
。问题是它还会在回调函数中过滤$this->input->post('textarea_content')
吗?
谢谢
$this->form_validation->set_rules('text_url', 'Website link', 'trim|xss_clean|callback_minimum_fields[' . $this->input->post('textarea_content') . ']');
$this->form_validation->run();
//Filtered
$text_url = $this->input->post('text_url');
//Filtered as well?
$textarea_content = $this->input->post('textarea_content');
回调
public function minimum_fields($url, $content)
{
if ($url == '' && $content == '')
{
$this->form_validation->set_message('minimum_fields', 'Please provide info for at least one of these: "Website link" and "Content".');
return false;
}
return true;
}
//Filtered as well?
$textarea_content = $this->input->post('textarea_content');
不可以,您没有在表单验证中设置"准备"规则。事实上,您根本没有验证textarea_content
字段。
除此之外,您在设置规则时尚未运行表单验证,因此将任何 POST 数据传递到回调函数中都将是原始数据。
将这样的帖子数据传递到这里的回调中,其中规则只是字符串,是非常危险的,并且可能会破坏您的脚本。考虑:
$_POST['textarea_content'] = ']|var_dump|exit|some_nonsense[';
$this->form_validation->set_rules(
'text_url',
'Website link',
'callback_minimum_fields[' . $this->input->post('textarea_content') . ']'
);
// Produces this rule:
// callback_minimum_fields[]|var_dump|exit|some_nonsense[]
这些"规则"将被注入到表单验证规则中,因为在这种情况下,它只是一个字符串。最好让回调直接读取 postdata 或采用其他方法,但这非常不安全。即使你先xss_clean它,也没关系。
再一次,我敦促您花更多时间了解XSS是什么,然后决定在这种情况下担心是否有任何意义。XSS 只出现在输出上。
因此,当然显而易见的事情是选择一个字段,使其成为必填字段,然后将必需字段放入验证中。但是,如果您所说的是 - 这些字段中的一个或另一个是必需的 - 您不妨在字段验证后将其作为单独的检查。
从可用性的角度来看,这是有道理的 - 正常的验证是按字段进行的。 错误消息与字段相关联。 如果您有涉及多个字段的要求 - 则该消息应单独显示。
这是用于XSS清洁的简单CI提示,只需使用TRUE,例如:
// adding TRUE means we are filtered
$text_url = $this->input->post('text_url', TRUE);
$textarea_content = $this->input->post('textarea_content', TRUE);
// check if both fields came back blank
if( $text_url == '' && $textarea_content == '' )
{
// validation failed, show the form again, make your own message to pass to view
}
else
{
// its all good
}