文档章节

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

凯文加内特
 凯文加内特
发布于 2015/02/28 17:29
字数 546
阅读 605
收藏 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

共有 人打赏支持
凯文加内特
粉丝 334
博文 671
码字总数 94457
作品 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

没有更多内容

加载失败,请刷新页面

加载更多

SonarQube+Scanners代码质量管理

简介 sonaqube是一个开源代码质量管理平台,致力于持续分析和测量技术质量。 系统构成 SonarQube平台由4部分组成: SonarQube服务器 Web服务器的开发者,管理者,浏览质量快照和配置SonarQu...

阿dai
58分钟前
0
0
mysql-router 8 yum安装

1.配置安装源 #配置MySQL5.7的安装源 #https://repo.mysql.com/mysql57-community-release-el7.rpm #https://repo.mysql.com/mysql57-community-release-el7-11.noarch.rpm rpm -Uvh https:/......

MichaelShu
今天
0
0
     甲骨人-MySQL网络课-day03

===================================================================================== ======================= 第三章 mysql SQL语句 1、mysql接口自带命令 1.1、\h 或 help 或 ? 1.2、......

hnairdb
今天
0
0
Redis异构集群之间数据迁移方案

一、Redis集群迁移工具 最近在做Redis数据迁移,网上找了两款开源的Redis迁移工具。 第一种:redis-port Codis官方提供的一个工具,redis-port是一个Redis工具,通过解析rdb文件,实现Redis...

IT--小哥
今天
3
0
解压zip包(zip4j)

1:引入zip4j_1.3.2.jar 2:源码如下: package test;import java.io.File;import java.io.IOException;import java.util.ArrayList;import java.util.List;import net.lingal......

uug
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部