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>© 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]