文档章节

xss防御之使用antisamy过滤富文本数据

h
 hxlhxl0937
发布于 2016/10/04 15:35
字数 1657
阅读 1.2K
收藏 0

「深度学习福利」大神带你进阶工程师,立即查看>>>

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树,生成过滤后的文本

h
粉丝 4
博文 6
码字总数 5802
作品 0
广州
私信 提问
加载中
请先登录后再评论。
浅入浅出Android(003):使用TextView类构造文本控件

基础: TextView是无法供编辑的。 当我们新建一个项目MyTextView时候,默认的布局(/res/layout/activity_main.xml)中已经有了一个TextView: <TextView 运行效果如下: 修改其文本内容...

樂天
2014/03/22
693
1
CDH5: 使用parcels配置lzo

一、Parcel 部署步骤 1 下载: 首先需要下载 Parcel。下载完成后,Parcel 将驻留在 Cloudera Manager 主机的本地目录中。 2 分配: Parcel 下载后,将分配到群集中的所有主机上并解压缩。 3 激...

cloud-coder
2014/07/01
6.8K
1
Nutch学习笔记4-Nutch 1.7 的 索引篇 ElasticSearch

上一篇讲解了爬取和分析的流程,很重要的收获就是: 解析过程中,会根据页面的ContentType获得一系列的注册解析器, 依次调用每个解析器,当其中一个解析成功后就返回,否则继续执行下一个解...

强子哥哥
2014/06/26
712
0
桌面即时贴软件--GloboNote

GloboNote 是一个桌面记事软件,可帮你创建待办事宜、提醒和其他笔记信息。无限制即时贴的数量,可分组整理,支持搜索,可定制文本的显示格式(字体、颜色和大小),可将某个即时贴始终显示在...

匿名
2013/01/21
6.8K
1
代码生成器--Codgen

Codgen是一个基于数据库元数据模型,使用freemarker模板引擎来构建输出的代码生成器。freemarker的数据模型结构通常来说都是一个Map树状结构模型,codgen也不例外,它的数据模型这棵树的根节...

黄天政
2013/01/29
1.4W
2

没有更多内容

加载失败,请刷新页面

加载更多

获取JavaScript数组中的所有唯一值(删除重复项) - Get all unique values in a JavaScript array (remove duplicates)

问题: I have an array of numbers that I need to make sure are unique. 我需要确定一个唯一的数字数组。 I found the code snippet below on the internet and it works great until th......

javail
18分钟前
11
0
如何检查字符串是否为空? - How to check if the string is empty?

问题: Does Python have something like an empty string variable where you can do: Python是否有类似空字符串变量的内容可以在其中执行: if myString == string.empty: Regardless, wh......

富含淀粉
今天
7
0
您如何存储未跟踪的文件? - How do you stash an untracked file?

问题: I have changes to a file, plus a new file, and would like to use git stash to put them away while I switch to another task. 我对一个文件进行了更改,再加上一个新文件,并希......

技术盛宴
今天
39
0
GeoPandas入门 | 01-地理数据介绍

01-地理数据介绍 1.1 Python地理空间矢量数据简介 %matplotlib inlineimport pandas as pdimport geopandas 导入地理数据 地理空间数据通常可以从特定的GIS文件格式或数据存储中获得,如...

酱肉包-
今天
25
0
OSChina 周三乱弹 —— 我是不是也有王室血统

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @小小编辑推荐,《我们》- 陈奕迅 《我们》- 陈奕迅 手机党少年们想听歌,请使劲儿戳(这里) @举个栗子OSC :快抬头看天!!! 雨后还有彩虹...

小小编辑
今天
59
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部