Codeigniter - 在帖子的基础上禁用 XSS 过滤

Posted

技术标签:

【中文标题】Codeigniter - 在帖子的基础上禁用 XSS 过滤【英文标题】:Codeigniter - Disable XSS filtering on a post basis 【发布时间】:2011-04-16 20:27:15 【问题描述】:

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

我在配置中有$config['global_xss_filtering'] = TRUE;

我的问题是有没有办法为一个项目禁用 xss 过滤?

例如

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

谢谢大家。

PVS

【问题讨论】:

感谢大家为此花费了 2 个小时。我在通过 ckeditor 保存 base64 图像时遇到问题。XSS 过滤是错误的,但我的同事在配置文件中将其设置为 true 【参考方案1】:

如果您想更改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

【讨论】:

不错的技巧。我认为应该是 return parent::post($index, $xss_clean);,但是。 阅读有关扩展的更好链接是本页的“扩展核心类”部分codeigniter.com/user_guide/general/core_classes.html 可怕的 hack,救了我的命。我想知道我们是否应该解释 CI 开发人员在下一个版本中添加这个内置。或者他们可能因为安全问题而没有这样做。 @aslamdoctor,由于安全问题,我非常确定他们不会“修复”这个问题。 RoR 刚刚经历了一系列令人讨厌的宣传,因为对这样的事情松懈。 这个效果更好:class MY_Input extends CI_Input public function __construct() parent::__construct(); public function post($index = null, $xss_clean = TRUE) return parent::post($index, $xss_clean); 【参考方案2】:

如果您想保持全局 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); 
    

?>

这样,即使xss_clean 全局启用,您也可以使用$this-&gt;input-&gt;post('mydata', FALSE) 检索未经清理的原始帖子数据。

【讨论】:

【参考方案3】:

我定义了

global $mypost;
$mypost=$_POST;

在我的根 cms 的 index.php 中

然后我可以在任何地方使用全局变量

global $mypost;

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

每当我需要不带过滤器的帖子时。

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

【讨论】:

但这也是XSS过滤的。【参考方案4】:

就我而言,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);
    

【讨论】:

【参考方案5】:

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

我们使用它来转义发布数据以用于 sql 语句。虽然 CI 的 db 方法不错,但我们有一些大型 sql 语句更容易手动编码。

【讨论】:

【参考方案6】:

使用 CI 2.2 我认为 treeface 的解决方案将使 input->get()、input->cookie() 等不被 xss_cleaned。 (我们在 oauth 请求中使用 get 等)。全局配置更改阻止它们被构造函数转义,并且核心类在这些方法上仍然默认 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://***.com/questions/3788476/codeigniter-disable-xss-filtering-on-a-post-basis
    * this is based on CI 2.2
    * the above (***) 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);
    


希望这对某人有所帮助

【讨论】:

【参考方案7】:

你可以暂时关闭它

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

$c = $this->input->post('content'); 然后重新打开..

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

【讨论】:

OP,我很想看看这是否有效。根据我对 CI 的 XSS 过滤方案的理解,我认为这实际上不会达到预期的效果。我相信 CI 会在控制器启动时对整个 $_POST 变量进行 XSS 过滤,因此事后更改配置影响不大。还是……值得一试。 嗨,这似乎不适用于我的 CI 安装。感谢您的回复! 您可以在过滤完成之前在挂钩中执行此操作。有几个阶段的钩子来行动。 [链接]codeigniter.com/user_guide/general/hooks.html[/link]

以上是关于Codeigniter - 在帖子的基础上禁用 XSS 过滤的主要内容,如果未能解决你的问题,请参考以下文章

Wordpress 在特定页面/帖子上禁用插件

Codeigniter 4:无法解密加密的帖子数据

在 Android Chrome 上禁用同源策略

判断帖子是不是来自codeigniter中的ajax调用的方法?

CodeIgniter 中的贝宝

如何在 CodeIgniter 中禁用 PHP 错误报告?