文档章节

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

h
 hxlhxl0937
发布于 2016/10/04 15:35
字数 1657
阅读 209
收藏 0
点赞 0
评论 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
广州
[Security]XSS一直是个棘手的问题

虽然现在IE10和chrome可以自动过滤掉 <script>alert('XSS')</script> 但是 <!DOCTYPE html> <head> //<![CDATA[ //]]></script></head><body> </body></html> <!DOCTYPE html> <head> </hea......

tdoly1 ⋅ 2013/06/08 ⋅ 0

Web 漏洞分析与防御之 XSS(一)

原文地址:Web 漏洞分析与防御之 XSS(一) 博客地址:www.extlight.com 一、全称 跨站脚本攻击(Cross Site Scripting) 二、原理 通过在网站中的输入框写入 script 脚本或引入 script 文件...

moonlightL ⋅ 2017/10/10 ⋅ 0

防御 XSS 的七条原则

前言 本文将会着重介绍防御XSS攻击的一些原则,需要读者对于XSS有所了解,至少知道XSS漏洞的基本原理,如果您对此不是特别清楚,请参考这两篇文章:《Stored and Reflected XSS Attack》《D...

oschina ⋅ 2013/09/05 ⋅ 9

XSS漏洞与SQL注入漏洞介绍及解决方案

一、跨站脚本攻击(XSS) 跨站脚本攻击的原理 XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意脚本代码,而程序对于用户输入内容未过滤,当用户浏览该...

945996501 ⋅ 2017/03/29 ⋅ 0

Beetl解决XSS问题(AntiSamy)

很多时候,我们为了安全,会对存储的信息,进行转义,过滤等处理,这样带来的坏处是,破坏原始的数据,而且转义会占用多余的空间. 本人使用JFinal框架,开始考虑过全局设置过滤器,有...

小鲅鱼 ⋅ 2014/08/11 ⋅ 5

简约社区系统--Tornado-Minos

Minos社区,一个基于Tornado/Mongodb/Redis的简约社区系统。 特点 简单:去除传统社区中多数不常用到的功能,保留精华。(这里向 http://zone.wooyun.org 学习) 高效: mongodb:数据库设计...

nohtihp ⋅ 2015/05/10 ⋅ 0

web安全之XSS

一、浏览器安全 1、同源策略(SOP) 在浏览器中,

TsingCall ⋅ 2017/09/26 ⋅ 0

PHP安全编码

一、开始前的一些建议 1.不要相信任何用户输入或第三方数据来源,包括$GET、$POST($FILES)、$COOKIE、$SERVER的部分参数等。 2.HTML、PHP、MYSQL等使用统一的UTF-8编码。 3.数据库SQL构造时...

ZoaChou ⋅ 2015/09/18 ⋅ 2

[Web安全之实战] 跨站脚本攻击XSS

Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want. 文章Points: 1. 认识XSS 2. XSS攻击 3. XSS防御(重点) 一、认识XSS先 先说个故事吧,在上一...

泥沙砖瓦浆木匠 ⋅ 2015/01/31 ⋅ 48

注意安全!XSS 和 XSRF

[Tips] 本文是从 jianshu 平台重新修改编辑后移植来的,比上一版本做了些修订。 最近在看一些关于网络安全的问题,当然许多是跟前端相关的,包括且不局限于xss和xsrf 了,那么小编就结合最近...

>> how-xss-works ⋅ 05/15 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 41分钟前 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

实验楼—MySQL基础课程-挑战3实验报告

按照文档要求创建数据库 sudo sercice mysql startwget http://labfile.oss.aliyuncs.com/courses/9/createdb2.sqlvim /home/shiyanlou/createdb2.sql#查看下数据库代码 代码创建了grade......

zhangjin7 ⋅ 昨天 ⋅ 0

一起读书《深入浅出nodejs》-node模块机制

node 模块机制 前言 说到node,就不免得提到JavaScript。JavaScript自诞生以来,经历了工具类库、组件库、前端框架、前端应用的变迁。通过无数开发人员的努力,JavaScript不断被类聚和抽象,...

小草先森 ⋅ 昨天 ⋅ 0

Java桌球小游戏

其实算不上一个游戏,就是两张图片,不停的重画,改变ball图片的位置。一个左右直线碰撞的,一个有角度碰撞的。 左右直线碰撞 package com.bjsxt.test;import javax.swing.*;import j...

森林之下 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部