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

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

时间: 2024-12-25 17:27:27

用Jsoup对用户输入内容的HTML安全过滤的相关文章

练习:编写循环,让用户输入内容,判断输入的内容以alex开头的,则将该字符串加上_SB结尾

编写循环,让用户输入内容,判断输入的内容以alex开头的,则将该字符串加上_SB结尾 while True: user = input('请输入:') # 用户输入 if user.startswith('alex'): # 判断用户输入的内容以alex开头 print(user + 'SB') # 则在该字符串加上SB结尾 break 输出结果: 请输入:bbb 请输入:alex alexSB

Console.ReadLine(); 获取用户输入内容

Console.ReadLine(); 用于让用户从键盘上输入一句话,当程序执行到这句话时程序就会自动暂停等待用户输入,按回车继续执行,如果想得到用户输入内容,就须要定义一个字符串类型的变量来接收 代码运用如下: Console.WriteLine("请输入一句话"); string input=Console.ReadLine(); Console.WriteLine("你刚刚输入的内容是:{0}",input); Console.ReadKey();

Python(51)_统计用户输入内容,索引为奇数,并且对于的索引的是数字的个数

#-*-coding:utf-8-*- ''' 统计用户输入内容,索引为奇数,并且对于的索引的是数字的个数 ''' count = 0 content = input(">>>") for i in range(len(content)): if i%2 == 1 and content[i].isdigit(): content +=1 print(count) 原文地址:https://www.cnblogs.com/sunnybowen/p/10230964.h

strtr对用户输入的敏感词汇进行过滤

/** * 过滤用户输入的基本数据,防止script攻击 * * @access public * @return string */ function compile_str($str) { $arr = array('<' => '<', '>' => '>','"'=>'”',"'"=>'’'); return strtr($str, $arr); }

JavaScript 编写代码对用户输入内容的输入框进行排查,看有没有敏感字“草”字

代码如下: var input = prompt("请输入您要搜索的内容:"); //一个弹窗 var arr = input; //弹窗输入的内容保存在数组中 var index = input.indexOf("草"); //从头开始检测草下标的位置,0为起始点 document.write("你输入的一串字为:",arr); //输出用户在弹框中输入的所有 document.write("<br/>"); /

angular 实时显示用户输入内容

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <!--angularJS关注的不再是DOM模型,而是数据本身 --> <!-- 告诉angular去监管哪块区域,ng-app(指令)写在body上,body已经被angularJS监管,body中所有用angularJS语法写的东

用户输入电话号码,判断合理与否?要求,判断长度和判断输入内容是否合理 隐藏用户电话号码的中间4位

/** *用户输入电话号码,判断合理与否?要求,判断长度和判断输入内容是否合理 *隐藏用户电话号码的中间4位, *思路: *1.用正则判断  条件:长度11位判断有两种方法,正则{11}和length()==11 *2.输入内容用正则判断 *电话号的正则:      "(13)[0-9][\\d]{8}|(15)[0-9][\\d]{8}" */ public class StringDemo4 { public static void main(String[] args) { St

jquery+php实现用户输入搜索内容时自动提示

index.html <html><head>    <meta charset="utf-8"><style>#search{font-size:14px;}#search .k{padding:2px 1px; width:320px;}#search_auto{border:1px solid #817FB2; position:absolute; display:none;}#search_auto li{background:#

js打印保存用户输入的内容

在用js打印局部页面时,遇到用户新输入的内容没能打印出来,经过观察,发现我采用的js打印方法是读取页面源代码,而用户输入的内容如果不将其写入到页面源代码中去,是打印不出来的,下面是我的解决方法: //获取标签自身 jQuery.fn.outerHTML = function (s) { return (s) ? this.before(s).remove() : $("<Hill_man>").append(this.eq(0).clone()).html(); }; St