這篇博客的提綱如下:
一、故障梳理
二、故障解決方案
三、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安全的書籍都講得非常不錯。這裏就不泛泛而談了