用户
 找回密码
 入住 CI 中国社区
搜索
查看: 4649|回复: 9
收起左侧

[安全] 2.1.0版本 Security的_remove_evil_attributes方法有bug?

[复制链接]
发表于 2012-3-31 13:36:32 | 显示全部楼层 |阅读模式
本帖最后由 paperen 于 2012-3-31 14:08 编辑

启用全局的XSS过滤(config中的global_xss_filtering)后,使用kindeditor编辑文本提交后发现提交过来的html代码被破坏了

比如我在编辑器源码中的内容为
HTML复制代码
 
<p style="margin-top:0.4em;margin-bottom:0.5em;line-height:19px;font-family:sans-serif;font-size:13px;white-space:normal;background-color:#FFFFFF;">
这一类型的状态码,代表请求已成功被服务器接收、理解、并接受。
</p>
 
 
复制代码


在后端接收数据后输出为
HTML复制代码
 
<p
这一类型的状态码,代表请求已成功被服务器接收、理解、并接受。
</p>
 
 
复制代码


我最终确定到Security的_remove_evil_attributes方法中,而其中使用到的那个正则如下:
PHP复制代码
 
$str = preg_replace("/<(\/?[^><]+?)([^A-Za-z\-])(".implode('|', $attribs).")([\s><])([><]*)/i", '<$1$2$4$5', $str, -1, $count);
 
复制代码


正则看不明白,而我在 <$1$2$4$5 后面补上>就可以了,不知道这算不算一个bug,而2.0.2中则不会有这个情况,当然_remove_evil_attributes这个方法也不一样

不知道这样补上>是否正确,但如果有人也遇到这个情况况且可以先这样修复

补充:加上>在某些场合还是不顶用,最终我还是用回旧版的_remove_evil_attributes方法,在core中继承一下Security类并重写_remove_evil_attributes
发表于 2012-3-31 14:58:56 | 显示全部楼层
这个很明显不能算BUG,这只是过滤太严格而已。
你可以修改代码,让他符合你的过滤严格程度即可。
 楼主| 发表于 2012-3-31 15:59:30 | 显示全部楼层
Hex 发表于 2012-3-31 14:58
这个很明显不能算BUG,这只是过滤太严格而已。
你可以修改代码,让他符合你的过滤严格程度即可。 ...
HTML复制代码
 
<p
这一类型的状态码,代表请求已成功被服务器接收、理解、并接受。
</p>
 
复制代码

<p>标签没有>了,格式被破坏了
发表于 2012-3-31 16:01:01 | 显示全部楼层
paperen 发表于 2012-3-31 15:59
标签没有>了,格式被破坏了

。。。还有这个情况啊。。我没遇到过。。。。呵呵
 楼主| 发表于 2012-3-31 19:31:20 | 显示全部楼层
Hex 发表于 2012-3-31 16:01
。。。还有这个情况啊。。我没遇到过。。。。呵呵

哈哈,你试试在2.1.0的CI 里面随便在一个控制器中
PHP复制代码
 
$str = '<p style="margin-top:0.4em;margin-bottom:0.5em;line-height:19px;font-family:sans-serif;font-size:13px;white-space:normal;background-color:#FFFFFF;">Broken p</p>';
echo $this->security->xss_clean( $str );
exit;
 
复制代码

然后访问看结果就知道了,hex前辈能告诉我CI这条正则有什么错误不
发表于 2012-3-31 21:14:02 | 显示全部楼层
paperen 发表于 2012-3-31 19:31
哈哈,你试试在2.1.0的CI 里面随便在一个控制器中

然后访问看结果就知道了,hex前辈能告诉我CI这条正则 ...

目前我还没有用正则工具测试这条正则,不过从你给的情况看,是正则有问题。
具体我还得测试下,呵呵
发表于 2012-4-7 13:08:00 | 显示全部楼层
这个问题挺烦的,那CI中如何使用编辑器了呢?
 楼主| 发表于 2012-5-6 16:04:00 | 显示全部楼层
Icen 发表于 2012-4-7 13:08
这个问题挺烦的,那CI中如何使用编辑器了呢?

sorry,有一段时间没上,你可以暂时使用2.0.2中的_remove_evil_attributes代替2.1.0版本的那个
发表于 2012-6-6 09:51:46 | 显示全部楼层
本帖最后由 yzou 于 2012-6-6 09:53 编辑

是security里面第一个正则有问题,我前一阵也遇到了
我是这么改的:


do {
   $count = 0;
   $attribs = array();
   
   // find occurrences of illegal attribute strings without quotes
   preg_match_all("/(".implode('|', $evil_attributes).")\s*=\s*[^\042\047]([^\s><]*)/is",  $str, $matches, PREG_SET_ORDER);


这样就没有问题了
 楼主| 发表于 2012-8-2 16:36:39 | 显示全部楼层
yzou 发表于 2012-6-6 09:51
是security里面第一个正则有问题,我前一阵也遇到了
我是这么改的:

哈哈,2.1.2版本果然修复了这个问题,你可以对比一下security那个文件

本版积分规则