xss过滤回调函数

时间:2012-12-07 15:40:58

标签: php codeigniter

根据my previous post的了解,xss_clean会在调用$this->input->post('text_url')后过滤$this->form_validation->run()。问题是它还会在回调函数中过滤$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');

CALLBACK

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

2 个答案:

答案 0 :(得分:2)

//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仅出现在输出

答案 1 :(得分:0)

当然,显而易见的事情是选择一个字段,使其成为必需,然后在验证中放置所需。但是,如果您要说的是 - 需要这些字段中的一个或另一个 - 您可以在字段验证后将其作为单独的检查。

从可用性的角度来看这是有道理的 - 正常验证发生在PER FIELD中。错误消息绑定到该字段。如果您的要求涉及多个字段 - 则该消息应单独显示。

这里是XSS clean的简单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
}