防御XSS攻击:基于白名单的富文本XSS后端过滤(jsoup)

时间:2022-08-27 13:17:24

简介:

 跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)缩写混淆,故将跨站脚本攻击缩写为XSS。 

 攻击原理:XSS攻击分为很多,其中一种是,攻击者往Web页面里插入恶意Script代码,当用户浏览该页面时,嵌入其中的Script代码会被执行,从而达到恶意攻击用户的目的。本文主要介绍的是富文本的script代码注入及解决办法。

 因为富文本编辑器本身就是基于HTML的,所以要保存富文本格式,就一定要保存HTML代码,也就一定会向服务器传送HTML格式的字符串,而且用户也可能在富文本编辑器内编写一段HTML代码,那么这样的话又怎么区分呢?


防御方法:

防御XSS攻击可以从前端后端入手。


前端防御使用js,由客户端运行,将 '&' , '<' , '\' 之类的敏感字符转义为 &amp , &lt , &gt,用户所编写的HTML代码就变成了字符,剩下的才是富文本格式。优点是可以直接在客户端运行,不需要占用服务器资源。但缺点是,如果攻击者使用伪造的HTTP请求,直接向服务器发送一段HTML代码,或者禁用js,则可以绕过前端处理及检查,直接向服务器提交包含script的HTML代码。这时就需要在服务器进行防御了。

前端防御插件:xss.js


后端防御在服务器检查敏感的HTML代码,有基于黑名单和基于白名单的两种过滤方式。因为HTML标签种类繁多,基于黑名单的过滤方法考虑的并不全面。而且对伪协议的考虑也不全面等等。。所以这里介绍的是一种基于白名单的过滤方法,使用jsoup处理接收到的HTML,只保留合法的标签及内容。


Jsoup使用步骤:

1.在pom中添加版本控制(或者下载jar包)Download

<dependency>
  <!-- jsoup HTML parser library @ https://jsoup.org/ -->
  <groupId>org.jsoup</groupId>
  <artifactId>jsoup</artifactId>
  <version>1.11.2</version>
</dependency>


2.新建白名单Whitelist——Whitelist类介绍

新建白名单公有6种方法,一个构造方法和5种静态方法。不同的方法所新建的Whitelist拥有不同的初始标签白名单。使用add,remove方法也可以增删白名单内容。需要注意的是preserveRelativeLinks(boolean preserve)这个方法。在选择true,可以使用相对路径后,调用Jsoup.clean()方法时,不能使用两参数的那个方法,必须传baseUrl这个参数,否则还是会删除相对路径。样例代码如下:

String html = "";//接收到的html代码
//防御XSS攻击,安全HTML验证
//可自定义jsoup的Whitelist
Whitelist whitelist = Whitelist.relaxed();

//其它白名单设置...

//获得安全HTML,消除xss隐患
String safeHtml = Jsoup.clean(html, whitelist);
System.out.println(safeHtml);

至此,基于白名单的富文本XSS后端过滤就完成啦。。。