欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-19 09:12:16
...

简介:

 跨站脚本攻击(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后端过滤就完成啦。。。