防御XSS攻击:基于白名单的富文本XSS后端过滤(jsoup)
简介:
跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。
攻击原理:XSS攻击分为很多,其中一种是,攻击者往Web页面里插入恶意Script代码,当用户浏览该页面时,嵌入其中的Script代码会被执行,从而达到恶意攻击用户的目的。本文主要介绍的是富文本的script代码注入及解决办法。
因为富文本编辑器本身就是基于HTML的,所以要保存富文本格式,就一定要保存HTML代码,也就一定会向服务器传送HTML格式的字符串,而且用户也可能在富文本编辑器内编写一段HTML代码,那么这样的话又怎么区分呢?
防御方法:
防御XSS攻击可以从前端和后端入手。
前端防御:使用js,由客户端运行,将 '&' , '<' , '\' 之类的敏感字符转义为 & , < , >,用户所编写的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后端过滤就完成啦。。。
上一篇: javascript下with 的简化代码写法_javascript技巧
下一篇: URI处理函数