0

我之前的帖子了解到,调用后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');

打回来

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

2 回答 2

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 仅发生在output上。

于 2012-12-07T15:48:41.200 回答
0

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

从可用性的角度来看,这是有道理的 - 每个字段都会进行正常验证。错误消息与该字段相关联。如果您的要求涉及多个字段 - 那么该消息应单独显示。

这里是 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
} 
于 2012-12-08T02:13:33.187 回答