XssHtml – 基于白名单的富文本XSS过滤类

关于富文本XSS,我在之前的一篇文章里(http://www.freebuf.com/articles/web/30201.html)已经比较详细地说明了一些开源应用使用的XSS Fliter以及绕过方法。之前我也总结了一些fliter的缺点,利用白名单机制完成了一个XSS Fliter类,希望能更大程度地避免富文本XSS的产生。

总结一下现存的一些XSS Fliter的缺点,可以归纳成以下几条:

    1.黑名单过滤一些标签,但没有考虑全面。比如<svg>、<object>、<input>等
    2.黑名单过滤一些属性,但没有考虑全面,比如onfocus、onfocusin等
    3.对伪协议考虑不全面,比如<a href=javascript:alert(1)>,有时候只是简单过滤script这种关键词,但总能用
      字符编码绕过
    4.过滤关键词时过于单纯,比如直接将script过滤为空,导致使用scrscriptipt就能绕过。再比如直接将字符实体转换
      为原字符,导致使用嵌套的字符实体来绕过。
    5.对IE的特性了解不深,比如expression,中间可以加\,IE7下可以加/**/来绕过。

而一般提供给一般用户使用的富文本编辑器,都是一些很常见功能,比如图片(表情)、超链接、加粗、加斜、字号、字体、颜色、分隔符等,所以我们完全可以用白名单的思想去写一个富文本过滤器,将编辑器中最常用到的一些功能做相应的过滤,其他标签、属性统统丢弃,来达到过滤XSS的效果。

所以我的XssHtml类设计思路是这样:首先用strip_tags清理掉白名单外、不规范的标签,然后用DOMDocument类加载这个HTML进DOM中。遍历DOM,删除白名单外的属性,并强制判断并给非法的href链接前面加入http://。

最后再将过滤完的DOM导出成HTML返回。

这样做有几个好处:

    1.整个类设计简单,只要创建好对象,调用一个方法即可得到过滤结果。
    2.白名单处理,能考虑到所有情况
    3.用PHP自带的DOMDocument类处理html,能有效处理一些不规则的内容。
    4.面向对象类设计,以后想增加其他标签,写针对性的代码可以直接调用之前写好的方法处理。

不过也有一些缺陷,就是过滤XSS不支持IE6及以下浏览器。因为IE6下奇葩特性太多了,会严重影响过滤器的效果与性能,所以我就没有考虑一些IE6的特性。

总的来说这应该是很多不了解安全的程序员的福音了。

代码:http://www.freebuf.com/sectool/37106.html

具体使用方法可以参阅:http://phith0n.github.io/XssHtml/ 这里有详细说明。

我还在自己主机上搭建了一个使用该类的一个test,希望有同学能找到BUG,完善过滤类。地址是 http://xsshtml.leavesongs.com/

本文分享自微信公众号 - FreeBuf(freebuf)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2014-06-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏醉梦轩

解决INSTALL_FAILED_INSUFFICIENT_STORAGE错误

19230
来自专栏开源优测

AutoLine开源平台简明教程

当前已经默认集成了RobotFramework一下关键字,关键字的用法完全同RobotFramework

16730
来自专栏Jerry的SAP技术分享

小技巧:不用任何媒体处理软件进行视频压缩

如果需要压缩一个很大的视频,网上有很多介绍,但是都需要安装各种视频处理软件,比如格式工厂等等。本文介绍一个非常方便的小技巧,无需任何视频处理软件,只需要微软的P...

22820
来自专栏C语言及其他语言

CodeBlocks的入门使用教程

之前自推出VC6作为教学、训练的编译器以后,VC6的种种问题及与训练场判题系统标准的不符,导致不少新同学被坑不少,今天起我们将加大对其他编译器学习的支持,对于训...

80550
来自专栏地方网络工作室的专栏

Vue2+VueRouter2+Webpack+Axios 构建项目实战2017重制版(八)渲染一个列表出来先

Vue2+VueRouter2+Webpack+Axios 构建项目实战2017重制版(八)渲染一个列表出来先 前情回顾 在上一篇博文《Vue2+VueRout...

32360
来自专栏云飞学编程

Python爬虫学习,记一次抓包获取js,从js函数中取数据的过程

昨天有小伙伴找我,新浪新闻的国内新闻页,其他部分都是静态网页可以抓到,但是在左下方的最新新闻部分,不是静态网页,也没有json数据,让我帮忙抓一下。大概看了下,...

44310
来自专栏云瓣

通过一个demo了解Redux

TodoList小demo 效果展示 项目地址 (单向)数据流 数据流是我们的行为与响应的抽象;使用数据流能帮我们明确了行为对应的响应,这和react的状态可预...

355100
来自专栏zhisheng

Pyspider框架 —— Python爬虫实战之爬取 V2EX 网站帖子

这篇文章本是我暑假时写的,可是自己懒啊,最近自己又在捣鼓 python 了,然后蹭有机会然后就把这篇文章写下来了,后期应该还有爬取知乎爬虫文章,期待吧,写原创文...

48560
来自专栏.net core新时代

数据字典生成工具之旅(1):开篇有益

       最近在做公司需求的时候,发现一个很低效的点,在建表的时候需要使用公司自己开发的建模工具进行创建表,一个字段一个字段的复制粘贴让人受不了。于是萌发了...

48890
来自专栏数据小魔方

R语言网络数据抓取的又一个难题,终于攻破了!

单纯从数据抓取的逻辑来讲(不谈那些工程上的可用框架),个人觉得R语言中现有的请求库中,RCurl和httr完全可以对标Python中的urllib和reuqes...

48830

扫码关注云+社区

领取腾讯云代金券