查看完整版本: XSS攻擊的修正步驟~

hoyachai 2008-2-2 09:55 AM

XSS攻擊的修正步驟~

原文來自於CERT:
http://www.cert.org/tech_tips/malicious_code_mitigation.html
因為工作上的關系,發覺一些大網站也有XSS漏點的存在,翻譯一這篇修正文給需要的人^^

===================================================
   對於XSS修正上,我們建議您可以參考下面步驟來修正。
1.        明確指定網頁的編碼
如:
<meta http-equiv="Content-Type" content="text/html; charset=big5" />
    原因在於當我們明確地指定編碼後,我們將各容易掌握輸入的字元。
2.        特殊字元的辨識
後面的兩個步驟在編碼與過濾,在此之前先了解什麼叫”特殊”字元。以下所列為較常見的字元,Web應該都需定義出其過濾的字元組。
(1)內文中的字元:
o        "<" 這是標籤起始字元
o        "&" 這是文字的起始字元
o        ">" 這是標籤的結束字元
(2)屬性值字元:
o        雙引號”,因為屬性值時常置於雙引號之中
o        單引號’,因為屬性值也時常置於單引號之中
o        沒有引號的屬性質代表的就是空白,如空白鍵或TAB鍵
o        "&" 連結屬性質的字元
(3)在URL中的字元:
o        空白鍵為Tab鍵代表URL的結束
o        "&"在URL中代表字元輸入的起始或CGI分隔參數
o        "%" 是一定要過濾的字元,不管它如何編碼,因為經過server解譯之後會變成不一樣的意義,比如"%68%65%6C%6C%6F" 經過server解譯後會變成 "hello"
(4)Script body中的字元:
o        如果可以直接輸入文字入script內的話,那分號、括號,都一定要濾除
(5)Server端字元:
o        Server端會將輸入字元驚嘆號(!)轉換或雙引號(“),而輸出則需其它的過濾方式
3.        動態產生字元的編碼
比如在網頁上常見到的字元copyright來說:
<p>&#169  2000 Some Co., Inc.
這裡的169代表的就是copyright,而前面的&#字元組合則准許後面用代碼來表現。
對不信任的資料先進行編碼的好處絕對大於去過濾它!但對資料進行編碼需秏用資源,所以程式設計師需評估方便與安全之間的平衡。
4.        過濾動態產生字元
在過濾之前先提一個簡單的觀念,盡量讓資料的輸入用選擇性方式,比如年紀的輸入利用下拉式選單限於0~80,這可以避開許多的攻擊。
過濾的程序可以寫在文字的輸入、或文字的輸出,亦或同時在兩個程序之間都使用此程序。我們較不建議單純將程序寫在輸入這一部份。
因為當資料透過Server解譯後可能是不同的字元,或其輸入資料的管道不單單只是從HTTP而已,所以將程序寫於輸出部份是較有效率的。

5.檢測cookies
有一種方法可以將惡意程式碼包含在Cookie之中,讓該使用者使用cookie時同時執行該惡意程式,所以程式開發人員可以利用上述方式,檢測cookie之中是否有需過濾的字元。
  過濾字串的參考:
(一)        JavaScript Example
function RemoveBad(InStr){
    InStr = InStr.replace(/\</g,"");
    InStr = InStr.replace(/\>/g,"");
    InStr = InStr.replace(/\"/g,"");
    InStr = InStr.replace(/\'/g,"");
    InStr = InStr.replace(/\%/g,"");
    InStr = InStr.replace(/\;/g,"");
    InStr = InStr.replace(/\(/g,"");
    InStr = InStr.replace(/\)/g,"");
    InStr = InStr.replace(/\&/g,"");
    InStr = InStr.replace(/\+/g,"");
    return InStr;
}
頁: [1]
查看完整版本: XSS攻擊的修正步驟~