目标

介绍如何阻止XSS攻击,保护系统的安全,保护数据安全。

FDP快速开发平台已具备防止XSS攻击的能力,提供了工具并合理使用了这些工具,开发人员基本不需要人工干预了 ,就可防止XSS攻击的目标。

通过学习本文,你可全面了FDP在防止XSS攻击的原理,可在极少的情况下进行“人工干预”。

XSS攻击介绍

XSS介绍

xss攻击是广泛存在的较难防范的攻击行为,只要有用户可输入的表单就有可能存在XSS攻击漏洞。

XSS全称:跨站脚本(Cross Site Scripting) ,为了不和层叠样式表(Cascading Style Sheets)的缩写CSS混合,所以改名为XSS;攻击者会向web页面(input表单、URL、留言版等位置)插入恶意JavaScript代码,导致管理员/用户访问时触发,从而达到攻击者的目的。

服务器对用户提交的数据没有采取“防范措施”,而是简单的直接原样存储了,这其中可能包含精心构造的危险JavaScript代码。数据总是要展示在Web页面的(在浏览器上展示)这是正常业务。

当系统把这样的数据(精心构造的包含危险JavaScript代码的数据),原样返回给客户端(浏览器)展示,数据中的JavaScript代码就会在浏览器中执行,从而实现对客户端的攻击目的。

XSS攻击的危害

1.窃取用户Cookie
2.后台增删改数据
3.XSS钓鱼攻击
4.利用XSS漏洞进行传播和修改网页代码
5.XSS蠕虫攻击
6.网站重定向
7.获取键盘记录
8.获取用户信息等

FDP在防止XSS攻击的解决方案

FDP快速开发平台已具备防止XSS攻击的能力,提供了工具并合理使用了这些工具,开发人员基本不需要人工干预了 ,就可防止XSS攻击的目标。


FDP在防止XSS攻击这个领域,已经做好的基础工作,在框架底层实现了“对危险字符的过滤或转义”,可达到防止XSS攻击的目标。

原理

处理原则:一切来自用户的输入数据都是邪恶的,都要对数据检查、过滤、转义,从而不再危险。

原理:对所有用户的输入和URL参数进行过滤、转义,检查用户输入的数据中是否包含一些特殊字符,如<、>、’、“、&等,发现存在特殊字符,将这些特殊字符过滤或者转义。

转义(黑名单):使用commons - lang3 - 3.1.jar这个包的org.apache.commons.lang3.StringEscapeUtils.escapeHtml4()方法,对用户提交的数据中的 特殊字符如<>" ' & 做转义。

转义(黑名单):在展示输出时,用jstl的fn:excapeXml("xxx")方法对数据的 特殊字符如<>" ' & 做转义。

过滤(白名单):主要用到jsoup对用户提交的数数据(一般是一段html代码)按白名单做过滤 (jsoup 是一款Java 的HTML解析器,可分析HTML内容)


要防XSS的三个地方



阶段 要防XSS的三个地方 重要性 谁来做 防范 工作 说明 工具
1 在用户输入阶段

提交表单时,对用户输入的所有数据做转义

重要,占比97% 由FDP开发平台来自动做,不需要人工干预

黑名单中有<、>、’、“、&等,它们会被转义

黑名单定义的escapeHtml4()方法中,是三方工具,不可修改。

XssFilter.java

XssHttpServletRequestWrapper.java

2 在用户 输入阶段

使用富文本编辑器,对用户输入的大段HTML代码做过滤

次要 ,占比2% 开发人员做防范工作 ,FDP负责提供工具

jsoup 是一款Java 的HTML解析器,可分析HTML内容。

主要用到jsoup对 HTML代码做过滤 按白名单做过滤 。

白名单定义在MyWhitelist类,是我方开发的可修改,内容是精心定义的。

XssClean.java

MyWhitelist.java

3 在展示输出阶段

输出数据时

不重要 ,占比1%

一般不需要做了。

开发人员做防范工作 ,FDP负责提供工具

经过上面两种在“ 用户 输入阶段 ”的安全检查这一步已不重要了。

但为了完整性,还是记录在这里,万一你需要呢。

如被漏洞扫描工具扫出了某某漏洞时,可临时使用本方法补救一下。

jstl的fn:excapeXml("xxx")方法

FDP提供的工具及使用方法

有以下几个工具类,配套使用达到防止XSS攻击的目标。FDP开发平台已经合理使用了这些工具,开发人员基本不需要使用,基础不需要人工干预了 。

第一类工具

第一类工具列表

用途
com/sicheng/common/xss/XssFilter.java
XssFilter是一个防止xss攻击的过滤器,用户提交所有的数据,都在经过这个过滤器。转交给XssHttpServletRequestWrapper.java处理
src/main/java/com/sicheng/common/xss/XssHttpServletRequestWrapper.java
实现对危险字符”的转义,黑名单中有<、>、’、“、&等,从而达到安全的目的。

提交表单时防XSS

在用户输入阶段, 提交表单时, 对用户输入的所有数据做转义, 黑名单中有<、>、’、“、&等,它们会被转义, 黑名单定义的 escapeHtml4()方法中,是三方工具,不可修改。

XssFilter是过滤器,在web.xml文件中添加一个过滤器配置  (默认都已加好了)

XssFilter 过滤器 把数据 转交给XssHttpServletRequestWrapper.java处理,转义危险字符。

关键是XssHttpServletRequestWrapper的实现方式,继承servlet的HttpServletRequestWrapper,并重写相应的几个Request“取值”的方法,在取值时对“危险字符”做转义,达到防止xss攻击的目标。

使用XssFilter过滤器,对所有表单提交上来的数据,都会自动处理转义危险字符,存储到数据库的中的数据是无危险字符的安全数据。

主要原理是用到commons-lang3-3.1.jar这个包的org.apache.commons.lang3.StringEscapeUtils.escapeHtml4()这个方法转义危险字符<、>、’、“、&等。

注:有些情况不想要转义后内容,你可以用StringEscapeUtils.unescapeHtml4()这个方法,恢复原样。

第二类工具

第二类工具列表

用途
com/sicheng/common/xss/XssClean.java
XssClean是一个工具,它可依据白名单,过滤掉html中的有xss攻击危险代码
com/sicheng/common/xss/MyWhitelist.java
MyWhitelist自定的白名单

对于富文本编辑器防止XSS

富文本编辑器,提交上来的内容允许包含大段的html代码,其中就会包含< >符号。不能再使用上一步的“转义危险字符”方案来处理了。

解决方案:使用Jsoup的白名单过滤html代码,消除不受信任的HTML 。关于Jsoup请看文档: Jsoup的白名单 \ 自定HTML白名单

工具类是:com.sicheng.common.xss.XssClean

工具使用方法是:String safe=XssClean.clean(unsafe);

操作步骤:

  1. StringEscapeUtils.unescapeHtml4(s);  转回来(还原,把已经被转义的HTML还原)
  2. String safe=XssClean.clean(unsafe);  按白名单来去除不受信任的HTML

为什么要先还原

富文本编辑器,提交上来的内容包含html代码,会先被XssFilter处理(转义)过了,XssFilter是全局的它转义了一切输入。(html已经被转义了,不在是html了)

包括富文本编辑器提交上来的大段html也被转义了,请使用StringEscapeUtils.unescapeHtml4(s)转回来,还原成为标准和html,再使用XssClean.clean()按白名单过滤危险字符。

使用示例

String html_unsafe=StringEscapeUtils.unescapeHtml4("xxxxxx");//转回来(还原)
String html_safe=XssClean.clean(unsafe);//按白名单进行危险字符过滤
article.getArticleData().setContent(html_safe);

注意1:

针对富文本编辑器的防xss,FDP只提示了工具。具体什么时机使用这个工具要由开发人员来决定。

注意2:

在前端我们选用了有名“百度富文本编辑器”,百度富文本编辑器中自带js版本的的过滤白名单,会转义危险字符。

MyWhitelist类的白名单规则与百度富文本编辑器中的白名单规则是一样的。保证了前后端的一致性。

第三类工具(临时补救)

第三类工具列表

用途
jstl的fn:excapeXml("xxx")方法

在输出时用jstl的fn:excapeXml("xxx")方法转义。

在页面显示数据的时候,只是简单地用fn:escapeXml()对有可能出现xss漏洞的地方做一下转义输出。


输出数据时防止XSS

经过前面两道防范,已很安全了。这一步99%时不需要你来做,只有当出现特殊情况,如被漏洞扫描工具扫出了某某漏洞时,可临时使用本方法。

在页面上要显示数据的时候,只是简单地用fn:escapeXml()对有可能出现xss漏洞的地方做一下转义输出。

在输出时用jstl的fn:excapeXml("xxx")方法。