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