服务器处理富文本编辑器提交的内容时, 因排版的需求不能对 HTML 标签进行转义, 但为了防止 XSS 攻击, 又必须过滤掉其中的 JS 代码, 在 Java 中使用 Jsoup 正好可以满足此要求

实现原理

Jsoup 使用标签 ** 白名单 ** 的机制用来进行防止 XSS 攻击, 假设白名单中只允许 p 标签存在, 此时在一段 HTML 代码中,** 只能存在 p 标签 **, 其他标签将会被清除只保留被标签所包裹的内容, 具体详情可查看参考资料

项目依赖

jsoup-1.9.2

org.jsoup

jsoup

1.9.2

代码示例

创建进行测试的 HTML 代码

String testHtml = "

div 标签的内容

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 内容

div 内容

p 内容

";

String result3 = Jsoup.clean(testHtml, whitelist);

System.out.println(result3);// 输出:

h1 内容

div 内容

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 攻击相关推荐

  1. 富文本编辑器、日期选择器、软件天堂、防止XSS攻击、字体icon、转pdf

    [超好用的日期选择器] Layui:http://www.layui.com/laydate/ 备注:日期选择器,用过很多很多,自己也写过一些:相信这个简单而又不简单的选择器,能够给你多些美好的时光 ...

  2. Java 后端接收前端的富文本参数,传到后台后标签样式数据丢失

    问题描述: 前端传参的时候,某个参数中是富文本格式,格式如下: {   "id": "698002e34cb64156ade62a073699f5d9", &q ...

  3. java实现word导入导出富文本(含图片)-附完整测试用例

    主要有以下几点: 1.解决富文本导入导出依赖兼容问题 2.处理富文本和非富文本内容 3.解决webp格式通过java下载不了问题,如果要用到富文本导出,将来势必是会碰到的bug,这里提前给提出来并解决 ...

  4. 从html富文本中提取纯文本

    其实从html富文本中提取纯文本很简单,富文本基本上是使用html标签给文本加上丰富多彩的样式. 所以只需要将富文本字符串中的"<.....>"标签剔除,即可得到纯文本 ...

  5. PMEdit一个富文本框可以编辑文本、图片并可以显示GIF动画

    一.在开始之前首先吐槽一下,本人是一个独立开发者,在中国独立开发者就代表一个比较苦逼的行业,特别是对底层东西进行开发者,尤其本人研究方向是编译器.解析器基本上没有公司要,所以出来做个独立开发者.作为独 ...

  6. PMEdit一个富文本框可以编辑文本、并可以显示GIF动画

    PMEdit一个富文本框可以编辑文本.并可以显示GIF动画 发布时间:2013-04-14 发布来源: 护士必必要有同情心和一双愿意工作的手. 一.在开端之前起首吐槽一下,本人是一个自力开辟者,在中国 ...

  7. PHP开发小技巧①⑥—提取富文本字符串中的文本内容

    综述 富文本在我们平常的项目中应用已经很广泛了,并逐渐发展成了一个行业.最近在项目中遇到需要提取富文本字符串中的文本内容,本篇博文就是记述如何重富文本字符串中提取出文本内容,欢迎大家相互学习. 富文本 ...

  8. unity学习笔记-text文本识别html富文本(待改进)

    unity学习笔记 text文本识别html富文本(待改进) 需求 逻辑 实现 xlua的安装 配置到unity 使用 改进优化(待改进) text文本识别html富文本(待改进) 需求 项目里需要将 ...

  9. android h5富文本编辑器,H5富文本编辑器的详细介绍

    使用H5的全局属性contenteditable可以让DOM元素及其子元素变的可编辑 样式代码 html, body { overflow: hidden; width: 100%; height: ...

  10. h5 富文本输入框_H5富文本编辑器的详细介绍

    使用H5的全局属性contenteditable可以让DOM元素及其子元素变的可编辑 样式代码 html, body { overflow: hidden; width: 100%; height: ...

最新文章

  1. CVPR 2020: 移动端机器学习的研究实现
  2. 【 FPGA 】7 Series FPGA中对MUX的设计指导
  3. 用USB安装esxi
  4. 34.16.159(zz)
  5. SAP HANA Hint简介
  6. JPA / Hibernate实体状态转换的初学者指南
  7. 17 MM配置-BP业务伙伴-定义业务伙伴角色
  8. node平台的安装与搭建
  9. java单例模式 参数_java中的几种单例模式
  10. python捕捉线程错误_python 主线程捕获子线程异常
  11. 雅虎十四条性能优化原则
  12. Ansys命令流(按字母排列)
  13. Android Facebook登录、分享;ins分享
  14. 除权除息,前复权,后复权,不复权
  15. JavaScript面试题②(JS面试题②)
  16. 游戏客户端性能(内存)【前篇】
  17. 一款支持屏幕录制、镜像投屏的软件:Record It Pro中文版
  18. 如何快捷的修改html,问如何通过F12键来快捷的修改网页
  19. 改版后的51la统计,与旧版有何区别呢?
  20. H5的重要知识技术点

热门文章

  1. 设置DIV块元素在浏览器页面中垂直居中
  2. (大数据工程师学习路径)第三步 Git Community Book----基本用法(下)
  3. 设计模式 - 状态模式、职责连模式
  4. Codeforces Round 1 - 10总结 【@Abandon】
  5. Linux常用基础命令3
  6. 游戏筑基开发之初识指针
  7. Linux shell脚本详解及实战(三)——shell脚本循环
  8. 【技术帖】Apache Kylin 高级设置:层级维度(Hierarchy Dimension)原理
  9. 一站式学习Wireshark(三):应用Wireshark IO图形工具分析数据流
  10. Git常用的简单命令