xss防御之使用antisamy过滤富文本数据
xss防御之使用antisamy过滤富文本数据
hxlhxl0937 发表于1年前
xss防御之使用antisamy过滤富文本数据
  • 发表于 1年前
  • 阅读 166
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

xss防御中有一类特殊处理,就是html富文本的处理。有两个比较特殊的地方,一个是过滤规则复杂,需要允许部分html标签和属性,但是要禁用某些html标签和属性。第二个是富文本展示的地方一般都是在html中输出。所以采用输入过滤的方式,同时为了解决解决过滤规则过于复杂的问题,引入第三方框架antisamy进行富文本的处理。

#antisamy 安装与使用

antisamy的owasp下的开源项目,主要是用于防御富文本的xss攻击。使用时:

##下载jar包

通过maven下载,最新的版本是1.5.3:

<dependency>
    <groupId>org.owasp.antisamy</groupId>
    <artifactId>antisamy</artifactId>
    <version>1.5.3</version>
</dependency>

##代码使用

 //html源码
String htmlContent="dddd<div onclick='alert(ddd)'>hello</div><vedio src=\"\">";
File file=new File(this.class.getResource(POLICY_FILE_LOCATION).getFile());
//设定解析策略
Policy policy=Policy.getInstance(file);
//扫描文件并生成扫描结果
AntiSamy as = new AntiSamy();
CleanResults cr = as.scan(htmlContent, policy);
 //输出过滤后的扫描结果
System.out.println(cr.getCleanHTML());
//输出扫描中的异常信息
System.out.println(cr.getErrorMessages());

以上代码就是antisamy的主要使用逻辑,加载配置文件,扫描,最后获取结果和错误信息。 ##配置说明

首先下载几个配置实例文件, 到页面 https://code.google.com/archive/p/owaspantisamy/downloads ,下载以下几个文件(需要翻墙)

antisamy-slashdot-1.4.4.xml

> Slashdot ( http://www.slashdot.org/ ) 是一个提供技术新闻的网站,它允许用户用有限 的 HTML 格式的内容匿名回帖。 Slashdot 不仅仅是目前同类中最酷的网站之一,而 且同时也曾是最容易被成功攻击的网站之一。更不幸的是,导致大部分用户遭受攻 击的原由是臭名昭着的 goatse.cx 图片 ( 请你不要刻意去看 ) 。 Slashdot 的安全策略非 常严格:用户只能提交下列的 html 标签: <b>, <u>, <i>, > <a>,<blockquote> ,并且 还不支持 CSS. > > 因此我们创建了这样的策略文件来实现类似的功能。它允许所有文本格式的标签来 直接修饰字体、颜色或者强调作用。

antisamy-ebay-1.4.4.xml

> 众所周知, eBay ( http://www.ebay.com/ ) 是当下最流行的在线拍卖网站之一。它是一 个面向公众的站点,因此它允许任何人发布一系列富 HTML 的内容。 我们对 eBay 成为一些复杂 XSS 攻击的目标,并对攻击者充满吸引力丝毫不感到奇怪。由于 eBay 允许 输入的内容列表包含了比 Slashdot 更多的富文本内容,所以它的受攻击面也要大得多。下 面的标签看起来是 eBay 允许的( eBay 没有公开标签的验证规则) :

antisamy-myspace-1.4.4.xml

> MySpace ( http://www.myspace.com/ ) 是最流行的一个社交网站之一。用户允许提交 几乎所有的他们想用的 HTML 和 CSS ,只要不包含 JavaScript 。 MySpace 现在用一 个黑名单来验证用户输入的 HTML ,这就是为什么它曾受到 Samy 蠕虫攻击 ( http://namb.la/) 的原因。 Samy 蠕虫攻击利用了一个本应该列入黑名单的单词 (eval) 来进行组合碎片攻击的,其实这也是 AntiSamy 立项的原因。

**antisamy-anythinggoes-1.4.4.xml **

> 也很难说出一个用这个策略文件的用例。如果你想允许所有有效的 HTML 和 CSS 元素输入(但能拒绝 JavaScript 或跟 CSS 相关的网络钓鱼攻击),你可以使用 这个策略文件。其实即使 MySpace 也没有这么疯狂。然而,它确实提供了一个很 好的参考,因为它包含了对于每个元素的基本规则,所以你在裁剪其它策略文件的 时候可以把它作为一个知识库。

Developer Guide.pdf

这个文件就是antisamy整个使用说明,包含配置文件的详细说明,但是官网完全没有提及该文件的存在,也没有提交以上配置文件的下载位置,不得不说这个项目的官网很不友好。

整个配置文件,可以配置允许哪些标签,允许哪些标签属性,可以校验标签属性值,不允许的标签和属性全部被删除。可以说,该配置文件是标签和属性的白名单。

因为上面的pdf文件的对项目的配置文件的细节已经说明得非常详细,这里不在赘述了。

使用该项目时,根据实际需要挑选一个标准配置文件然后修一下配置就行了。

#源码阅读与原理分析。

antisamy的过滤过程就是将html文本解析为一个dom树,然后变量dom树,根据配置的规则处每个节点。

代码分析:

Policy policy=Policy.getInstance(file);

解析xml配置文件到内存中,读取各种配置属性

CleanResults cr = as.scan(htmlContent, policy);

解析的核心代码,主要步骤:

1 判断是否大于最大字符限制

2 去除html文本的低价打印字符防止解析失败,字符是 [\u0000-\u001F\uD800-\uDFFF\uFFFE-\uFFFF&&[^\u0009\u000A\u000D]]

3 将html文本解析成dom树,使用了第三方框架xerces

4 遍历dom树进行以下处理:

4.1 判断深度是否达到250,是返回异常

4.2 判断节点是否为comment,特殊处理后返回。

 4.2.1  判断是否显示comment,否则删除comment节点

 4.2.2  如果需要显示节点,则过滤节点的数据

4.3 判断节点是否为空元素,根据设置判断是否需要删除节点。

4.4 判断节点是否为CDATA,过滤节点数据

 4.4.1 输出异常,同时创建text节点代替CDATA节点。

4.5 判断是否为ProcessingInstruction,是删除该节点

4.6 获取当前节点的tagRule,根据tagRule规则进行不同处理

 4.6.1 判断是否使用默认的tagRule

 4.6.2 要么encode节点(节点内容进行编码)

 4.6.3 要么filter节点(删除节点,保留节点子节点)

 4.6.4 要么validate节点

     对style节点进行特殊处理

     对其他节点的属性一个一个验证,如果发现校验失败,根据配置,进行以下处理:

    4.6.4.1 removeTag :删除当前元素

    4.6.4.2 filterTag : 过滤当前元素

    4.6.4.3 encodeTag : 编码元素

    4.6.4.4 remoteAttr: 默认配置,删除属性

 4.6.5 要么truncate节点(删除节点属性,以及删除子节点中非text类型的节点)

 4.6.6 要么删除节点(包括子节点都进行删除)

5 根据过滤后的dom树,生成过滤后的文本

共有 人打赏支持
粉丝 5
博文 6
码字总数 5802
×
hxlhxl0937
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: