禁用特定变量的全局过滤

时间:2011-06-20 07:16:59

标签: php codeigniter

我在配置文件中将global_xss_filtering设置为TRUE。是否可以禁用特定数据的xss过滤 - 假设我想禁用'title'后置变量的xss过滤。

有可能吗?

1 个答案:

答案 0 :(得分:1)

嗯,据我所知,你可以制作一些小黑客。 您转到输入类(system / core / input.php)并更改$ xss_clean参数的默认值。 本地它设置为FALSE,因此您可以通过将TRUE传递给$ this-> input-> post()或get()来选择更改它。

使用post()的示例(在input.php的第128行),但您还需要应用于get。

/**
    * Fetch an item from the POST array
    *
    * @access   public
    * @param    string
    * @param    bool
    * @return   string
    */
    function post($index = NULL, $xss_clean = TRUE)   // <-- Here I changed the default from FALSE to TRUE)
    {
        // Check if a field has been provided
        if ($index === NULL AND ! empty($_POST))
        {
            $post = array();

            // Loop through the full _POST array and return it
            foreach (array_keys($_POST) as $key)
            {
                $post[$key] = $this->_fetch_from_array($_POST, $key, $xss_clean);
            }
            return $post;
        }

        return $this->_fetch_from_array($_POST, $index, $xss_clean);
    }

现在,您关闭全局过滤(将其设置为FALSE)。现在,您的输入将被自动过滤,除非您将FALSE指定为调用的第二个参数,例如$this->input->post('title',FALSE).

你可以选择(而不是黑客攻击核心)想要扩展本机输入库,这样你就可以传递一个TRUE而不是FALSE,这就是:

class MY_Input extends CI_Input {

    function __construct()
    {
       parent::__construct();
    }

    //........

    function get($index = NULL, $xss_clean = TRUE)
    {
        return parent::get($index, $xss_clean);
    }

    //...........

    function post($index = NULL , $xss_clean = TRUE)
    {
        return parent::post($index, $xss_clean);
    }

}

它应该以相同的方式工作,并且每次更改时都不需要破解核心文件。
请阅读手册中的extending the core页面以获得更好的信息。