明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

CGI教學(xué):CGI安全問(wèn)題(二)

[摘要]2. 誰(shuí)也不信 幾乎所有的CGI 安全問(wèn)題都來(lái)自與用戶的交互。接收來(lái)自外部數(shù)據(jù)源的輸入之后一個(gè)簡(jiǎn)單的、可預(yù)見(jiàn)的CGI程序突然向多方向伸展,每個(gè)方面都可能有最小的縫隙使得“黑客”可以溜進(jìn)來(lái)。正是與用戶的這種交互——通過(guò)表單或文件路徑——才給予了CGI 腳本這種能力,但同時(shí)也使得它們成了運(yùn)行在Web服...
2. 誰(shuí)也不信

幾乎所有的CGI 安全問(wèn)題都來(lái)自與用戶的交互。接收來(lái)自外部數(shù)據(jù)源的輸入之后一個(gè)簡(jiǎn)單的、可預(yù)見(jiàn)的CGI程序突然向多方向伸展,每個(gè)方面都可能有最小的縫隙使得“黑客”可以溜進(jìn)來(lái)。正是與用戶的這種交互——通過(guò)表單或文件路徑——才給予了CGI 腳本這種能力,但同時(shí)也使得它們成了運(yùn)行在Web服務(wù)器上的最潛在的危險(xiǎn)部分。

編寫安全的CGI 腳本很大程度上是創(chuàng)造性和妄想的結(jié)合。編寫者必須有足夠的創(chuàng)造性才能想到用戶使用的,不管是無(wú)意地還是別的所有的可能隱含導(dǎo)致問(wèn)題的發(fā)送數(shù)據(jù)的方式。而且必須有點(diǎn)妄想,因?yàn)橛锌赡懿恢朗裁磿r(shí)候、什么地方、他們將會(huì)一一加以試驗(yàn)。

2.1 兩種導(dǎo)致問(wèn)題的方式

當(dāng)用戶登錄進(jìn)入Web 站點(diǎn)并開(kāi)始進(jìn)行交互訪問(wèn)時(shí),他們能以兩種方式惹麻煩。一種是不遵守規(guī)則,歪曲或違反頁(yè)面中建立的每個(gè)限制或約束;另一種方式是按要求去做。

大部分CGI 腳本是作為HTML表單的后臺(tái)運(yùn)行的,負(fù)責(zé)處理由用戶輸入的信息并提供某種定制的輸出。因?yàn)樵谶@種情況下,大部分CGI 腳本編寫時(shí)都等待某種特殊格式的數(shù)據(jù)。它們期望用戶的輸入能匹配收集并發(fā)送信息的表單。不過(guò)事情并不總是這樣。用戶可以有許多種辦法繞過(guò)這些預(yù)定義的格式而給腳本發(fā)送一些看起來(lái)是隨機(jī)的數(shù)據(jù)。CGI 程序必須對(duì)此有所準(zhǔn)備。

其次,用戶可以給CGI 腳本發(fā)送所期望的數(shù)據(jù)類型,按預(yù)期的形式在表單中填入每個(gè)字段。這種類型的提交可以是想像中的來(lái)自某個(gè)與站點(diǎn)交互的無(wú)意的用戶,也可能來(lái)自某個(gè)惡意的“黑客”,憑借他有關(guān)操作系統(tǒng)和Web 服務(wù)器軟件的知識(shí)并利用常見(jiàn)的編程錯(cuò)誤。這些入侵,表面上一切都正常,卻是最危險(xiǎn)的、最難檢測(cè)出來(lái)。Web 站點(diǎn)安全性依賴干這種入侵的防止。

2.2 不要相信表單數(shù)據(jù)

在CGI 編程中最常見(jiàn)的安全失誤就是相信從表單傳到腳本的數(shù)據(jù),用戶是未知的一大堆人,他們總能找到一些編程人員從來(lái)沒(méi)想到過(guò)的發(fā)送數(shù)據(jù)的方法--而且是程序員認(rèn)為幾乎不可能的方法。

腳本必須對(duì)這些加以考慮。例如,下面這些情形都是可能的:

1)從一組單單選按鈕中選擇的結(jié)果可能不是表單中提供的選項(xiàng)之一。

2)來(lái)自某個(gè)文本字段的數(shù)據(jù)長(zhǎng)度可能大于MAXLENGTH字段允許的長(zhǎng)度。

3)字段本身的名字可能與表單中指定的不相符。

2.3 不合理數(shù)據(jù)的來(lái)源


因—些無(wú)意的或是有意的原因,導(dǎo)致自己的腳本接收到不知道如何去處理的數(shù)據(jù),有可能導(dǎo)致非預(yù)期的——同時(shí)很危險(xiǎn)的——行為。

下面的代碼實(shí)現(xiàn)了一種表單并向某個(gè)搜索yahoo!數(shù)據(jù)庫(kù)的CGI腳本送垃圾。該腳本設(shè)計(jì)得很好并且很安全,因?yàn)樗雎粤瞬徽J(rèn)識(shí)的輸入。

<FORM METHOD="POST" ACTION="http://search.yahoo.com/bin/search">
Enter your name,first then last:
<INPUT TYPE="TEXT" NAME="first">
<INPUT TYPE="TEXT" NAME="last">
</FORM

也許用戶碰巧(或者意識(shí)地)將URL編輯為這個(gè)CGI腳本。當(dāng)瀏覽器向CGI程序提交數(shù)據(jù)時(shí),要簡(jiǎn)單地將輸入表單中的數(shù)據(jù)連到CGI的URL上(用于GET METHODS),就像用戶可以很容易地將Web頁(yè)面地址輸入到他的瀏覽器一樣,用戶也可以自己修改發(fā)送給這個(gè)腳本的數(shù)據(jù)。

例如,當(dāng)單擊表單上的Submit按鈕時(shí),Netscape將一個(gè)長(zhǎng)串字符放入Location字段,該串由CGI的URL后接一串?dāng)?shù)據(jù)組成,大部分看起來(lái)像表單中定義的NAMES和VALUES。如果愿意的話,可以自由地編輯Location字段的內(nèi)容并按自己的意愿修改數(shù)據(jù):增加表單中沒(méi)有的字段,擴(kuò)展由MAXLENGTH選項(xiàng)限制的文本數(shù)據(jù),或者幾乎任何對(duì)象。以下顯示了某CGI腳本預(yù)期從表單中提交的URL。

http://www.altavista.digit.com/cgi-bin?pg=q&what=web&imt=&q=%22An+Entirely+Other%22

用戶可以修改同一URL,CGI腳本仍被調(diào)用,但現(xiàn)在接收的是非預(yù)期的數(shù)據(jù)。為了保證安全,該腳本應(yīng)該在編寫時(shí)就設(shè)計(jì)為能將這種輸入識(shí)別為不被要求的數(shù)據(jù)并加以拒絕。

最后,某個(gè)有野心的"黑客"也許會(huì)寫一個(gè)程序連到Web上的服務(wù)器并假裝是一個(gè)Web瀏覽器。該程序可能做一些任何一個(gè)真正的web瀏覽器從未做過(guò)的事,例如給CGI腳本發(fā)送成百兆字節(jié)的數(shù)據(jù)。如果CGI腳本不限制從POST METHOD讀取數(shù)據(jù),那怎么辦?它有可能會(huì)崩潰,也許允許那個(gè)崩潰了系統(tǒng)的人訪問(wèn)系統(tǒng)。