这篇博客的提纲如下:
一、故障梳理
二、故障解决方案
三、XSS小结
一、故障梳理
这要从最近出的一个故障说起。故障的过程大致如下:
A系统与B系统域名不同,A系统中的数据提交到A系统某个form表单,然后通过js函数提交到B系统后台,然后显示在B系统的IE浏览器上
这是整个数据流。
其中IE8开始,IE内置了XSS filter机制,当来源为跨站数据源,且数据源中含有疑似XSS攻击恶意数据(微软IE内置的正则来判断,例如,‘中文()’等)的时候,就会停止脚本的运行,直接跳转到空白页。
本故障就是在A系统提交的数据中含有疑似XSS攻击的字符,导致IE误判,(别的浏览器都没事,IE就是个惹祸的怪胎。远离IE得永生!)无法将数据正确在B系统展示出来。展示了空白页。
二、故障解决方案
解决方案暂时想到的有两种:
1、在B系统的Response的Header里面加入标签X-XSS-Protection=0,阻止IE XSS filter生效。但是这样做有损系统安全性
2、在A系统提交的数据里面做XSS字符的过滤,将疑似XSS的字符从半角转换为全角字符。后面会有相应的代码实现
3、将数据的A系统进行彻底的编码(Base64等),然后在B系统进行相应的解码
这里选择方案2进行实现:
代码如下:
public static String xssEncoder(String content){
StringBuilder bulider=new StringBuilder();
for(char c :content.toCharArray()){
switch (c) {
case '>':
bulider.append('>');// 全角大于号
break;
case '<':
bulider.append('<');// 全角小于号
break;
case '\'':
bulider.append('\\');
bulider.append('\'');
bulider.append('\\');
bulider.append('\'');
break;
case '\"':
bulider.append('\\');
bulider.append('\"');// 全角双引号
break;
case '&':
bulider.append('&');// 全角
break;
case '\\':
bulider.append('\');// 全角斜线
break;
case '#':
bulider.append('#');// 全角井号
break;
case ':':
bulider.append(':');// 全角冒号
break;
case '%':
bulider.append("\\\\%");
break;
case '(':
bulider.append("(");
break;
case ')':
bulider.append(")");
break;
case ',':
bulider.append(",");
break;
case '.':
bulider.append("。");
break;
default:
bulider.append(c);
break;
}
}
return bulider.toString();
}
顺便提一下针对全站进行XSS防御的两种常用手段
1、配置Nginx的过滤正则脚本,对疑似XSS的脚本特征进行拦截
2、在系统配置拦截器,针对XSS数据进行清洗过滤,如http://my.oschina.net/hermer/blog/152834
三、XSS 小结
这部分内容太多,做不好讲述。有很多web安全的书籍都讲得非常不错。这里就不泛泛而谈了