Codeigniter - 基于帖子禁用XSS过滤

时间:2010-09-24 15:17:40

标签: codeigniter xss

我正在尝试在网站背面设置CMS,但每当发布数据中包含<a href=...时,帖子数据就会被废弃。

我在配置

中有$config['global_xss_filtering'] = TRUE;

我的问题是有一种方法可以禁用一个项目的xss过滤吗?

e.g。

$this->input->post('content', true); - 打开它,但如何将其关闭?

谢谢大家。

PVS

7 个答案:

答案 0 :(得分:27)

如果你想改变post()方法的默认行为,你可以扩展核心输入库,或者如果你很懒,你可以改变输入库的第278行(左右)来读取:

/**
* Fetch an item from the POST array
*
* @access   public
* @param    string
* @param    bool
* @return   string
*/
function post($index = '', $xss_clean = TRUE)
{
    return $this->_fetch_from_array($_POST, $index, $xss_clean);
}

唯一的区别是我已将$ xss_clean变量更改为TRUE而不是FALSE。现在您可以关闭全局XSS过滤,它会自动过滤输入,除非您在调用Input库的post()方法时指定false作为第二个参数。只有一种方法是get()方法,你可以用同样的方式改变它。

然而,如果我是你,我只是扩展本地库,因为你很可能在更新CodeIgniter时忘记这个,然后你会突然想知道你为什么这么做让XSS受到攻击。这看起来像这样:

class MY_Input extends CI_Input {

    function My_Input()
    {
        parent::CI_Input();
    }

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

您可以在此处了解有关扩展库的更多信息:

http://codeigniter.com/user_guide/general/creating_libraries.html

答案 1 :(得分:6)

如果您希望仅在某些情况下启用全局xss_clean并覆盖,则可以扩展输入库以保留$_POST的克隆,以便在询问时提供原始数据:

<?php if (!defined('BASEPATH')) exit('No direct access allowed.');
class MY_Input extends CI_Input {

public function __construct() {
    $this->_POST_RAW = $_POST; //clone raw post data 
    parent::__construct(); 
}

public function post($index = null, $xss_clean = TRUE) { 
    if(!$xss_clean){ //if asked for raw post data -eg. post('key', false)-, return raw data. Use with caution.
        return $this->_POST_RAW[$index];
    }
    return parent::post($index, $xss_clean); 
    }
}
?>

这样,即使全局启用了$this->input->post('mydata', FALSE),您也可以使用xss_clean来检索未经过清理的原始发布数据。

答案 2 :(得分:1)

我定义了

global $mypost;
$mypost=$_POST;

在我的root cms

的index.php中

然后我可以在任何地方使用像

这样的全局变量
global $mypost;

$var=isset($mypost["field"])? $mypost["field"]:"";

每当我需要发布时不带过滤器。

为我工作希望它有所帮助。

答案 3 :(得分:1)

在我的情况下,treeface的解决方案不起作用,但我找到了另一种方法。我用MY_Input做了 _sanitize_globals()我添加了构建消防后期数据的位置。

// Clean $_POST Data
if (is_array($_POST) AND count($_POST) > 0) {
    foreach ($_POST as $key => $val) {
        if($this->_clean_input_keys($key) != 'my_none_sanitize_field')
        $_POST[$this->_clean_input_keys($key)] = $this->_clean_input_data($val);
    }
}

答案 4 :(得分:0)

是的,使用post方法替换的Input扩展非常有用,精明的读者也注意到它应该返回parent :: post($ index,$ xss_clean)。我遇到了错误,并没有想到那个明显的错误。修好了,我就跑了。

我们正在使用它来转义帖子数据,以便在sql语句中使用。虽然CI的db方法很好,但是我们有一些更容易手动编写的大型sql语句。

答案 5 :(得分:0)

使用CI 2.2我认为来自treeface的解决方案将保留input-&gt; get(),input-&gt; cookie()等不是xss_cleaned。 (我们使用get in oouth请求等)。全局配置更改会阻止它们被构造函数转义,并且核心类在这些方法上仍默认xss_clean为FALSE ...

我基本上已经在更多方法中实现了相同的解决方案。

class MY_Input extends CI_Input {

    /* fixes to allow xss_clean to be disabled on a per field basis
    * [ e.g. tinymce html content with style / class / event attributes ]
    * initial ref : http://stackoverflow.com/questions/3788476/codeigniter-disable-xss-filtering-on-a-post-basis
    * this is based on CI 2.2
    * the above (stackoverflow) solution only updates the post method - which means all the rest ( get, get_post, cookie, server, request_headers, get_request_header)
    * NB : we need GET to allow oauth type activities !
    *
    *   1 - change the global config to xss_clean = false [ otherwise the constructor will 'xss_clean' everything before we have a chance to say no ! ]
    *   2 - make all of methods that take the xss_clean parameter use TRUE as default value
    *   3 - we can now pass the second parameter in as FALSE if we do not want to xss_clean
    */

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

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

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

    function cookie($index = '', $xss_clean = TRUE)
    {
        return parent::cookie($index, $xss_clean);
    }

    function server($index = '', $xss_clean = TRUE)
    {
        return parent::server($index, $xss_clean);
    }

    function request_headers($xss_clean = TRUE)
    {
        return parent::request_headers($xss_clean);
    }

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

}

希望这对某人有所帮助

答案 6 :(得分:-4)

你可以暂时将其关闭

$ this-&gt; config-&gt; set_item('global_xss_filtering',false);

$ c = $ this-&gt; input-&gt; post('content'); 然后把它重新打开..

$ this-&gt; config-&gt; set_item('global_xss_filtering',true);