文档章节

用Jsoup对用户输入内容的HTML安全过滤

凯文加内特
 凯文加内特
发布于 2015/02/28 17:29
字数 546
阅读 582
收藏 13
点赞 1
评论 2

在网站使用input或textarea提供给用户可输入内容的功能,比如发帖子,发文章,发评论等等。这时候需要后端程序对输入内容作安全过滤,比如<script>等可造成安全隐患的标签。

java中有个开源包叫Jsoup,本身用来解析html,xml文档的,特点是可以使用类似jquery的选择权语法。

最近在解决内容安全过滤的时候,通过google发现Jsoup通过自定义Whitelist(安全标签白名单)提供了这样的功能,非常好用。

简单演示如下:

//HTML cleanString unsafe = "<table><tr><td>1</td></tr></table>" +		"<img src='' alt='' />" +		"<p><a href='http://example.com/' onclick='stealCookies()'>Link</a>" +		"<object></object>" +		"<script>alert(1);</script>" +		"</p>";
String safe = Jsoup.clean(unsafe, Whitelist.relaxed());
System.out.println("safe: " + safe);

官方API地址: http://jsoup.org/apidocs/org/jsoup/safety/Whitelist.html

发现来源:

http://www.oschina.net/question/12_10232 , 据此自己写了个自定义的帮助类:

package com.cssor.safety; 
import org.jsoup.Jsoup;
import org.jsoup.helper.StringUtil;
import org.jsoup.safety.Whitelist; 
public class ContentSafeFilter {	
private final static Whitelist user_content_filter = Whitelist.relaxed();	
static {		
//增加可信标签到白名单		
user_content_filter.addTags("embed","object","param","span","div");		//增加可信属性	
user_content_filter.addAttributes(":all", "style", "class", "id", "name");		
user_content_filter.addAttributes("object", "width", "height","classid","codebase");		
user_content_filter.addAttributes("param", "name", "value");		
user_content_filter.addAttributes("embed", "src","quality","width","height","allowFullScreen","allowScriptAccess","flashvars","name","type","pluginspage");	} 	
/**	 * 对用户输入内容进行过滤	 * @param html	 * @return	 */	
public static String filter(String html) {		
if(StringUtil.isBlank(html)) return "";		
return Jsoup.clean(html, user_content_filter);		
//return filterScriptAndStyle(html);	} 
	
/**	 * 比较宽松的过滤,但是会过滤掉object,script, span,div等标签,适用于富文本编辑器内容或其他html内容	 * @param html	 * @return	 */	
public static String relaxed(String html) {		
return Jsoup.clean(html, Whitelist.relaxed());	
} 	
/**	 * 去掉所有标签,返回纯文字.适用于textarea,input	 * @param html	 * @return	 */	
public static String pureText(String html) {		
return Jsoup.clean(html, Whitelist.none());	
} 	
/**	 * @param args	 */	
public static void main(String[] args) {		
String unsafe = "<table><tr><td>1</td></tr></table>" +	"<img src='' alt='' />" +				"<p><a href='http://example.com/' onclick='stealCookies()'>Link</a>" +				"<object></object>" +				"<script>alert(1);</script>" +				"</p>";		
String safe = ContentSafeFilter.filter(unsafe);		
System.out.println("safe: " + safe);	
} 
}

Jsoup不支持相对路径图片的过滤,比如<img src=”/1.png” alt=”” />会被去掉src属性,想了个简单的方法避免:

/** * 自定义对用户输入内容进行过滤的标签 * @param html * @return */public static String filter(String html) {    if(StringUtil.isBlank(html)) return "";    String baseUri = "http://baseuri";    return Jsoup.clean(html, baseUri, user_content_filter).replaceAll("src=\"http://baseuri", "src=\"");}

http://cssor.com/jsoup-whitelist-clean-html-for-user-content.html


本文转载自:http://cssor.com/jsoup-whitelist-clean-html-for-user-content.html

共有 人打赏支持
凯文加内特
粉丝 326
博文 665
码字总数 87615
作品 0
青岛
后端工程师
加载中

评论(2)

凯文加内特
凯文加内特

引用来自“selfly”的评论

谁说Jsoup不支持相对路径图片的过滤的,明明提供了API
喷的好
首席的哥队长
首席的哥队长
谁说Jsoup不支持相对路径图片的过滤的,明明提供了API
消除不受信任的HTML (来防止XSS攻击)

问题 在做网站的时候,经常会提供用户评论的功能。有些不怀好意的用户,会搞一些脚本到评论内容中,而这些脚本可能会破坏整个页面的行为,更严重的是获取一些机要信息,此时需要清理该HTML,...

凯文加内特 ⋅ 2015/02/28 ⋅ 0

开源中国8-2期软件推荐 jsoup — Java的HTML解析器

jsoup 是一款 Java 的HTML 解析器,可直接解析某个URL地址、HTML文本内容。本站就是采用 jsoup 来做 HTML 处理。 示例代码: File input = new File("/tmp/input.html"); Document doc = Jso...

鉴客 ⋅ 2010/08/09 ⋅ 0

KindEditor 4.1.1 发布

根据国家信息安全漏洞共享平台(即中国国家漏洞库,CNVD)要求,4.1.1版本开始默认开启白名单过滤,只能使用htmlTags里定义的HTML标签和属性,其它标签和属性会被编辑器过滤。如果要允许输入...

红薯 ⋅ 2012/06/12 ⋅ 2

jsoup 使用详解

官网地址 http://jsoup.org/ 如何解析一个HTML文档: String html = "<html><head><title>First parse</title></head>"+ "<body><p>Parsed HTML into a doc.</p></body></html>";Document d......

icheer ⋅ 2013/05/27 ⋅ 1

OSChina原创:使用 jsoup 对 HTML 文档进行解析和操作

jsoup 简介 Java 程序在解析 HTML 文档时,相信大家都接触过 htmlparser 这个开源项目,我曾经在 IBM DW 上发表过两篇关于 htmlparser 的文章,分别是:从HTML中攫取你所需的信息 和扩展 HT...

红薯 ⋅ 2010/12/17 ⋅ 38

使用 jsoup 对 HTML 文档进行解析和操作

刘 柄成, 站长, 开源中国社区 简介: jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作...

SeanCai ⋅ 2011/03/02 ⋅ 0

Android开发_Jsoup抓取网页信息

想要抓取别的网页的信息,比较好的方法就是jsoup抓取,保存html为 documents 解析有用信息就可以! http://www.open-open.com/jsoup/ 一般情况下jsoup多用于JAVA方面的开发,可以利用jQuery,...

zhangty0223 ⋅ 2013/07/17 ⋅ 0

使用Jsoup解析html网页

一、 JSOUP简介 在以往用java来处理解析HTML文档或者片段时,我们通常会采用htmlparser(http://htmlparser.sourceforge.net/)这个开源类库。现在我们有了JSOUP,以后的处理HTML的内容只需要...

神剑戎 ⋅ 2013/05/01 ⋅ 1

Jsoup代码解读之一-概述

今天看到一个用python写的抽取正文的东东,美滋滋的用Java实现了一番,放到了webmagic里,然后发现Jsoup里已经有了…觉得自己各种不靠谱啊!算了,静下心来学学好东西吧! Jsoup是Java世界用...

黄亿华 ⋅ 2013/08/25 ⋅ 1

jsoup - java jquery

http://www.open-open.com/jsoup/ 手册 jsoup 是一个 解析和遍历一个HTML文档 1. 解析一个HTML字符串 Jsoup.parse(String html) Jsoup.parse(String html, String baseUri) 参数 baseUri 是用......

Canaan_ ⋅ 2016/08/12 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JDK1.6和JDK1.7中,Collections.sort的区别,

背景 最近,项目正在集成测试阶段,项目在服务器上运行了一段时间,点击表格的列进行排序的时候,有的列排序正常,有的列在排序的时候,在后台会抛出如下异常,查询到不到数据,而且在另外一...

tsmyk0715 ⋅ 34分钟前 ⋅ 0

spring RESTful

spring RESTful官方文档:http://spring.io/guides/gs/rest-service/ 1. 可以这么去理解RESTful:其实就是web对外提供的一种基于URL、URI的资源供给服务。不是一个原理性知识点。是一个方法论...

BobwithB ⋅ 36分钟前 ⋅ 0

C++ 中命名空间的 5 个常见用法

相信小伙伴们对C++已经非常熟悉,但是对命名空间经常使用到的地方还不是很明白,这篇文章就针对命名空间这一块做了一个叙述。 命名空间在1995年被引入到 c++ 标准中,通常是这样定义的: 命名...

柳猫 ⋅ 39分钟前 ⋅ 0

@Conditional派生注解

@Conditional派生注解(Spring注解版原生的@Conditional作用) 作用:必须是@Conditional指定的条件成立,才给容器中添加组件,配置配里面的所有内容才生效; @Conditional扩展注解 作用(判...

小致dad ⋅ 39分钟前 ⋅ 0

适配器模式

适配器模式 对象适配器 通过私有属性来实现的类适配器 通过继承来实现的接口适配器 通过继承一个默认实现的类实现的

Cobbage ⋅ 43分钟前 ⋅ 0

Java 限流策略

概要 在大数据量高并发访问时,经常会出现服务或接口面对暴涨的请求而不可用的情况,甚至引发连锁反映导致整个系统崩溃。此时你需要使用的技术手段之一就是限流,当请求达到一定的并发数或速...

轨迹_ ⋅ 47分钟前 ⋅ 0

GridView和子View之间的间隙

默认的情况下GridView和子View之间会有一个间隙,原因是GridView为了在子View被选中时在子View周围显示一个框。去掉的办法如下: android:listSelector="#0000" 或 setSelector(new ColorDra...

国仔饼 ⋅ 50分钟前 ⋅ 0

idea插件开发

1 刷新页面要使用多线程 2 调试要使用restart bug 不要去关闭调试的idea 否则再次启动会卡住

林伟琨 ⋅ 50分钟前 ⋅ 0

Java 内存模型

物理机并发处理方案 绝大多数计算任务,并不是单纯依赖 cpu 的计算完成,不可避免需要与内存交互,获取数据。内存要拿到数据,需要和硬盘发生 I/O 操作。计算机存储设备与 cpu 之间的处理速度...

长安一梦 ⋅ 57分钟前 ⋅ 0

思路分析 如何通过反射 给 bean entity 对象 的List 集合属性赋值?

其实 这块 大家 去 看 springmvc 源码 肯定可以找到实现办法。 因为 spirngmvc 的方法 是可以 为 对象 参数里面的 list 属性赋值的。 我也没有看 具体的 mvc 源码实现,我这里只是 写一个 简...

之渊 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部