目标
介绍如何阻止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);
操作步骤:
- StringEscapeUtils.unescapeHtml4(s); 转回来(还原,把已经被转义的HTML还原)
- 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")方法。