AntiSamy使用详解

简介

OWASP AntiSamy 项目可以有好几种定义。从技术角度看,它是一个可确保用户输入的
HTML/CSS 符合应用规范的 API。也可以这么说,它是个确保用户无法在 HTML 中提交恶意
代码的 API,而这些恶意代码通常被输入到个人资料、评论等会被服务端存储的数据中。
在 Web 应用程序中,“恶意代码”通常是指 Javascript。同时层叠样式表(CSS)在调用
Javascript 引擎的时候也会被认为是恶意代码。当然在很多情况下,一些“正常”的 HTML
和 CSS 也会被用于恶意的目的,所以我们也会对此予以处理。

标准策略文件介绍

一般情况下,你可以在预定义的策略文件中找到一个与你站点需求大致匹配的
AntiSamy 策略文件。这些策略各自代表了一个典型的应用场景,来允许用户提交
HTML(可能还有 CSS)内容。让我们具体的看一下这些策略文件:

antisamy-slashdot.xml

Slashdot (http://www.slashdot.org/)是一个提供技术新闻的网站,它允许用户用有限
的 HTML 格式的内容匿名回帖。 Slashdot 不仅仅是目前同类中最酷的网站之一,而
且同时也曾是最容易被成功攻击的网站之一。更不幸的是,导致大部分用户遭受攻
击的原由是臭名昭着的 goatse.cx 图片(请你不要刻意去看)。 Slashdot 的安全策略非
常严格:用户只能提交下列的 html 标签: <b>, <u>, <i>, <a>, <blockquote>,并且
还不支持 CSS.

因此我们创建了这样的策略文件来实现类似的功能。它允许所有文本格式的标签来
直接修饰字体、颜色或者强调作用。

antisamy-ebay.xml

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

antisamy-myspace.xml

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

antisamy-anythinggoes.xml

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

java项目使用

maven引入

1
2
3
4
5
<dependency>
<groupId>org.owasp.antisamy</groupId>
<artifactId>antisamy</artifactId>
<version>1.5.7</version>
</dependency>

java实例

源码下载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package com.fallsea.antisamy;

import org.owasp.validator.html.AntiSamy;
import org.owasp.validator.html.CleanResults;
import org.owasp.validator.html.Policy;
import org.owasp.validator.html.PolicyException;
import org.owasp.validator.html.ScanException;

/**
* @Description:
* @Copyright: 2017 www.fallsea.com Inc. All rights reserved.
* @author: fallsea
* @version 1.0
* @date: 2017年12月20日 上午9:45:53
*/
public class AntisamyTest {

public static void main(String[] args) {

String html = "测试<img onerror=\"alert('呵呵 执行了')\" src=\"\" /> <script>alert(1);</script>";
try {
//配置安全策略文件
Policy policy = Policy.getInstance(AntisamyTest.class.getClassLoader().getResource("antisamy-myspace.xml"));

AntiSamy as = new AntiSamy();

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

//获取安全的 HTML 输出
System.out.println(cr.getCleanHTML());

//执行时间(秒)
System.err.println("执行时间:"+cr.getScanTime());

} catch (PolicyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ScanException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

运行结果

参考资料

http://www.owasp.org.cn/owasp-project/download/owasp-antisamy-java