在各種Internet攻擊行為中,通過Web方式侵入系統造成信息泄漏、數據丟失的事件非常普遍。例如,攻擊者在頁面表單中輸入惡意內容,繞過輸入檢查,攻擊系統。為此,Web開發者應采取有效的措施從信息采集的入口處堵截惡意內容的進入。本文將對這方面的問題進行分析,并提供幾種應對方法。
問題分析
Web頁面包含文本和HTML標記,它們由服務器建立,被客戶端解釋。HTML標記一般被服務器特殊對待。例如,“<”一般指示一個HTML標記的開始,“<P>”可以影響頁面的顯示格式,<Script>可以將腳本代碼引入瀏覽器而執行。
對于靜態頁面,服務器可以完全控制它在客戶端如何解釋。但是對于動態頁面,服務器就不可能完全控制它在客戶端的解釋行為了。這樣就產生了問題:如果動態頁面中包含了不可信的內容,那么無論是服務器端還是客戶端,就不能保證是否會發生安全問題。
現在,幾乎所有的商用Web服務器就會建立動態頁面。最典型的一個例子就是我們經常要使用的搜索引擎,它接受用戶的查詢內容后,搜索數據庫,然后將動態內容寫入一個頁面模板,最后顯示給用戶包含搜索結果的頁面。這種情況下,檢查動態內容是否包含了特殊字符就非常重要,例如“<”。如果包含了特殊字符,用戶端的瀏覽器就可能將之誤解為HTML標記或者引入執行程序,而不是當做文本信息顯示出來。危險也就產生于此!如果不對動態頁面進行特殊字符的檢查,那么攻擊者就有可能在交互頁面的輸入表單中寫入些特殊字符串,從而導致輸出頁面執行非法行為。這種例子很多,比如我們編寫一個留言簿,卻不對輸入內容進行特殊字符的校驗,那么攻擊者就有可能填寫特殊字符,最終導致留言簿頁面的非正常工作,例如填寫一段惡意代碼:死循環JavaScript腳本、重復打開窗口的JavaScript腳本。
應對措施分析
通常,不被信任的內容主要來自以下幾個方面:URL參數,表單輸入元素,Cookies和數據庫查詢。要減輕這些方面可能導致的攻擊,建議采取如下的步驟:
1、為每個由服務器產生的Web頁面明確地設置字符集編碼
2、鑒別特殊的字符
3、對動態輸出內容編碼
4、過濾動態輸出內容中的特殊字符
5、檢查cookies 值
以下詳細分析這5個步驟。
第一步:明確地設置字符集編碼
字符集編碼就是頁面的字符編碼體系,在瀏覽器中可以通過“查看/編碼”來轉換:
很多Web頁面都省略了字符集編碼設置,也就是說在頁面源代碼頭部HTTP一節中沒有定義charset參數。早期的HTML版本中,如果沒有定義charset參數,字符集編碼就默認為ISO-8859-1。但實際上,許多瀏覽器都有各自的默認字符集編碼。因此,HTML版本4規定,如果沒有指定charset參數,任何可能的字符集編碼都可以使用,這就依賴于用戶的瀏覽器種類了。
如果Web服務器不能指定使用哪個字符集編碼,那么它就不能區分出特殊字符。沒有指定字符集編碼的Web頁面之所以可以在大多數時間中工作良好,這是因為在大多數的字符集編碼類別中,同一字符對應一個小于128的字節值。對于大于128的特殊字符,例如“<”,將采用16位字符編碼方案處理。一些瀏覽器能夠識別并執行這種編碼方案,但同時,攻擊者也可能據此使用惡意腳本,使防范難度加大,因為服務器可能完全不能了解哪個字節代表哪個特殊字符。例如,字符集UTF-7為“<”和“>”提供了可選編碼,幾種流行的瀏覽器一般將它們看做標記的起始和結束字符。為了不造成服務器和客戶端的字符編碼的不一致,Web服務器應該明確設置字符集,以確認插入的數據是否為特殊字符編碼的后續字節。比如,下面的代碼強行設置了頁面使用ISO-8859-1字符集編碼:
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<TITLE>HTML SAMPLE</TITLE>
</HEAD>
<BODY>
<P>This is a sample HTML page
</BODY>
</HTML>
該文章轉載自1024k:http://www.1024k.cn/web/2007/200701/15409.html