XSS攻擊與防範小結

這篇博客的提綱如下:

一、故障梳理

二、故障解決方案

三、XSS小結

 

 

一、故障梳理

這要從最近出的一個故障說起。故障的過程大致如下:

數據流

 

A系統與B系統域名不同,A系統中的數據提交到A系統某個form表單,然後通過js函數提交到B系統後臺,然後顯示在B系統的IE瀏覽器上

這是整個數據流。

 

其中IE8開始,IE內置了XSS filter機制,當來源爲跨站數據源,且數據源中含有疑似XSS攻擊惡意數據(微軟IE內置的正則來判斷,例如,‘中文()’等)的時候,就會停止腳本的運行,直接跳轉到空白頁。

可以參考http://windows.microsoft.com/en-us/windows7/how-does-internet-explore-9-help-protect-me-from-cross-site-scripting-attacks   

 

本故障就是在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安全的書籍都講得非常不錯。這裏就不泛泛而談了

    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章