java 富文本 xss_Jsoup 防止富文本 XSS 攻击
服务器处理富文本编辑器提交的内容时, 因排版的需求不能对 HTML 标签进行转义, 但为了防止 XSS 攻击, 又必须过滤掉其中的 JS 代码, 在 Java 中使用 Jsoup 正好可以满足此要求
实现原理
Jsoup 使用标签 ** 白名单 ** 的机制用来进行防止 XSS 攻击, 假设白名单中只允许 p 标签存在, 此时在一段 HTML 代码中,** 只能存在 p 标签 **, 其他标签将会被清除只保留被标签所包裹的内容, 具体详情可查看参考资料
项目依赖
jsoup-1.9.2
org.jsoup
jsoup
1.9.2
代码示例
创建进行测试的 HTML 代码
String testHtml = "
p 标签的内容
";
创建一个白名单对象
Whitelist whitelist = new Whitelist();
添加允许使用的标签, 此时只允许 p 标签存在
whitelist.addTags("p");
对测试代码进行过滤, 过滤规则就是创建的白名单
String result1 = Jsoup.clean(testHtml, whitelist);
System.out.println(result1);// 输出: div 标签的内容 < p>p 标签的内容
此时我们发现 div 标签已经被过滤掉了, 但是 p 标签中的属性也同时也被过滤掉了, 因为白名单只允许了 p 标签, 但是并未对属性加入白名单, 此时将 p 标签中的 class 属性加入白名单中, 再进行一次过滤
whitelist.addAttributes("p","class");
String result2 = Jsoup.clean(testHtml, whitelist);
System.out.println(result2);// 输出: div 标签的内容 < p class="div">p 标签的内容
此时可见 class 属性已被允许存在, 另外 whitelist.addAttributes(String tag, String... keys) 中的 keys 是一个可变数组, 由此可知我们可以同时添加多个属性, 如 whitelist.addAttributes("p","class","style","title"), whitelist.addTags(String... tags) 方法同理
此时假如我在白名单中添加了多个标签, 那么如何才能快速对所有标签添加共同属性
whitelist.addAttributes(":all","style","title");
:all 表明给白名单中的所有标签添加 style,title 属性, 此时我们将 div,h1 标签放入白名单, 再进行测试
whitelist.addTags("div","h1");
testHtml = "
h1 内容
p 内容
";
String result3 = Jsoup.clean(testHtml, whitelist);
System.out.println(result3);// 输出:
h1 内容
p 内容
结果分析
在 h1 标签中 onclick,class 属性被过滤掉了 因为他们不属于 h1 标签的白名单属性
在 div 标签中 class 属性被过滤掉了 理由同上
标签中的属性都被保留, 因为 class 属性只添加 p 标签的白名单中 style 属性添加在所有标签的白名单中
但是在实际使用中, 允许的标签往往很多, 这时 jsoup 默认给我们提供了 5 个白名单对象
白名单对象
标签
说明
none
无
只保留标签内文本内容
simpleText
b,em,i,strong,u
简单的文本标签
basic
a,b,blockquote,br,cite,code,dd,
dl,dt,em,i,li,ol,p,pre,q,small,span,
strike,strong,sub,sup,u,ul
基本使用的标签
basicWithImages
basic 的基础上添加了 img 标签
及 img 标签的 src,align,alt,height,width,title 属性
基本使用的加上 img 标签
relaxed
a,b,blockquote,br,caption,cite,
code,col,colgroup,dd,div,dl,dt,
em,h1,h2,h3,h4,h5,h6,i,img,li,
ol,p,pre,q,small,span,strike,strong,
sub,sup,table,tbody,td,tfoot,th,thead,tr,u,ul
在 basicWithImages 的基础上又增加了一部分部分标签
** 如果没有图片上传的需求, 使用 basic, 否则使用 basicWithImages**
其他事项
在刚才测试的时候, 会发现 Jsoup.clean() 方法返回的代码已经被进行格式化, 在标签及标签内容之间添加了 \n 回车符, 如果不需要的话, 可以使用 Jsoup.clean(testHtml, "", whitelist, new Document.OutputSettings().prettyPrint(false)); 进行过滤
** 以下为我在实际项目中所使用的工具类 **
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.safety.Whitelist;
/**
* 描述: 过滤 HTML 标签中 XSS 代码
*/
public class JsoupUtil {
/**
* 使用自带的 basicWithImages 白名单
* 允许的便签有 a,b,blockquote,br,cite,code,dd,dl,dt,em,i,li,ol,p,pre,q,small,span,strike,strong,sub,sup,u,ul,img
* 以及 a 标签的 href,img 标签的 src,align,alt,height,width,title 属性
*/
private static final Whitelist whitelist = Whitelist.basicWithImages();
/** 配置过滤化参数, 不对代码进行格式化 */
private static final Document.OutputSettings outputSettings = new Document.OutputSettings().prettyPrint(false);
static {
// 富文本编辑时一些样式是使用 style 来进行实现的
// 比如红色字体 style="color:red;"
// 所以需要给所有标签添加 style 属性
whitelist.addAttributes(":all", "style");
}
public static String clean(String content) {
return Jsoup.clean(content, "", whitelist, outputSettings);
}
}
java 富文本 xss_Jsoup 防止富文本 XSS 攻击相关推荐
- 富文本编辑器、日期选择器、软件天堂、防止XSS攻击、字体icon、转pdf
[超好用的日期选择器] Layui:http://www.layui.com/laydate/ 备注:日期选择器,用过很多很多,自己也写过一些:相信这个简单而又不简单的选择器,能够给你多些美好的时光 ...
- Java 后端接收前端的富文本参数,传到后台后标签样式数据丢失
问题描述: 前端传参的时候,某个参数中是富文本格式,格式如下: { "id": "698002e34cb64156ade62a073699f5d9", &q ...
- java实现word导入导出富文本(含图片)-附完整测试用例
主要有以下几点: 1.解决富文本导入导出依赖兼容问题 2.处理富文本和非富文本内容 3.解决webp格式通过java下载不了问题,如果要用到富文本导出,将来势必是会碰到的bug,这里提前给提出来并解决 ...
- 从html富文本中提取纯文本
其实从html富文本中提取纯文本很简单,富文本基本上是使用html标签给文本加上丰富多彩的样式. 所以只需要将富文本字符串中的"<.....>"标签剔除,即可得到纯文本 ...
- PMEdit一个富文本框可以编辑文本、图片并可以显示GIF动画
一.在开始之前首先吐槽一下,本人是一个独立开发者,在中国独立开发者就代表一个比较苦逼的行业,特别是对底层东西进行开发者,尤其本人研究方向是编译器.解析器基本上没有公司要,所以出来做个独立开发者.作为独 ...
- PMEdit一个富文本框可以编辑文本、并可以显示GIF动画
PMEdit一个富文本框可以编辑文本.并可以显示GIF动画 发布时间:2013-04-14 发布来源: 护士必必要有同情心和一双愿意工作的手. 一.在开端之前起首吐槽一下,本人是一个自力开辟者,在中国 ...
- PHP开发小技巧①⑥—提取富文本字符串中的文本内容
综述 富文本在我们平常的项目中应用已经很广泛了,并逐渐发展成了一个行业.最近在项目中遇到需要提取富文本字符串中的文本内容,本篇博文就是记述如何重富文本字符串中提取出文本内容,欢迎大家相互学习. 富文本 ...
- unity学习笔记-text文本识别html富文本(待改进)
unity学习笔记 text文本识别html富文本(待改进) 需求 逻辑 实现 xlua的安装 配置到unity 使用 改进优化(待改进) text文本识别html富文本(待改进) 需求 项目里需要将 ...
- android h5富文本编辑器,H5富文本编辑器的详细介绍
使用H5的全局属性contenteditable可以让DOM元素及其子元素变的可编辑 样式代码 html, body { overflow: hidden; width: 100%; height: ...
- h5 富文本输入框_H5富文本编辑器的详细介绍
使用H5的全局属性contenteditable可以让DOM元素及其子元素变的可编辑 样式代码 html, body { overflow: hidden; width: 100%; height: ...
最新文章
- CVPR 2020: 移动端机器学习的研究实现
- 【 FPGA 】7 Series FPGA中对MUX的设计指导
- 用USB安装esxi
- 34.16.159(zz)
- SAP HANA Hint简介
- JPA / Hibernate实体状态转换的初学者指南
- 17 MM配置-BP业务伙伴-定义业务伙伴角色
- node平台的安装与搭建
- java单例模式 参数_java中的几种单例模式
- python捕捉线程错误_python 主线程捕获子线程异常
- 雅虎十四条性能优化原则
- Ansys命令流(按字母排列)
- Android Facebook登录、分享;ins分享
- 除权除息,前复权,后复权,不复权
- JavaScript面试题②(JS面试题②)
- 游戏客户端性能(内存)【前篇】
- 一款支持屏幕录制、镜像投屏的软件:Record It Pro中文版
- 如何快捷的修改html,问如何通过F12键来快捷的修改网页
- 改版后的51la统计,与旧版有何区别呢?
- H5的重要知识技术点