<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 模擬技術(shù) > 設計應用 > CGI安全問(wèn)題專(zhuān)題

CGI安全問(wèn)題專(zhuān)題

作者: 時(shí)間:2012-05-17 來(lái)源:網(wǎng)絡(luò ) 收藏
按鈕未被選擇,另一個(gè)就一定被選擇了。下面的Perl 代碼 就犯了這樣的錯誤: if ($form _ Data{radio _ choice} eq button _ one){ # Button One has been clicked } else { # Button Two has been clicked } 這段 代碼 假定因為表單僅提供了兩個(gè)選項,而第一項未被選中,那么第二項就肯定被選中了。這不一定是真的。盡管前面的例子沒(méi)有什么害處,但在某些情況下這樣的假設可能很危險。 腳本應該能預期這種情形而相應地進(jìn)行處理。例如,如果出現一些非預期的或不可能的情形,可以打印一個(gè)錯誤,如下所述: If ($form _ Data{radio _ choice} eq button _ one) { #Button One seleted } elsif ($form _ Data{radio _ choice} eq button _ two) { #Button Two Selected } else { #Error } 通過(guò)加入第二個(gè)if語(yǔ)句——顯式檢查radio _ choice實(shí)際上是button _ two——這樣腳本更安全了;它不再做假設了。 當然,錯誤不一定是期望腳本在這些情形下生成的。有些腳本過(guò)于小心,驗證每個(gè)字段,即使是最輕微的非預期數據都生成錯誤信息,這樣往往很掃用戶(hù)的興。讓 腳本識別非預期數據然后扔掉它,并且自動(dòng)選擇一個(gè)缺省值也可以。 另一方面,腳本還可幫助用戶(hù)糾正錯誤而不是簡(jiǎn)單地發(fā)一條錯誤消息或設置一個(gè)缺省值。如果表單要求用戶(hù)輸入機密文字,腳本應能在進(jìn)行比較之前自動(dòng)跳過(guò)輸入中的空白字符。下面即是一個(gè)完成此功能的Perl程序片段。 $user _ input =~ s/\\s//; #Remove white space by replacing it with an empty string if ($user _ input eq $secret _ Word) { #Match! } 最后,可以更進(jìn)一,讓腳本能處理盡可能多的不同的輸入表單。盡管不可能預期到可能發(fā)送給CGI程序的所有內容,但對某個(gè)特定方面一般經(jīng)常有幾種常用的方式,因而可以逐個(gè)檢查。 例如,僅僅因為所寫(xiě)的表單使用POST方法向CGI腳本提交數據,并不意味著(zhù)數據必須按那種方法進(jìn)來(lái)。應該檢查REQUEET _ METHOD環(huán)境變量來(lái)確定是使用了GET還是POST方法并相應地讀取數據,而不是假定數據都是來(lái)自預期的標準輸入(stdin)。一個(gè)真正編寫(xiě)成功的CGI腳本能接收無(wú)論使用什么方法提交的數據并在處理過(guò)程中很安全。以下程序清單即是用Perl編寫(xiě)的一個(gè)例子。 程序清單 CGI _ READ.PL 一個(gè)充滿(mǎn)活力的讀取格式輸入的程序 #Takes the maximum length allowed as a parameter #Returns 1 and the raw form data,or 0 and the error text sub cgi _ Read { local($input _ Max)=1024 unless $input _ Max=$ _ [0]; local($input _ Method)=$ENV{\REOUEST _ METHOO\); #Check for each possible REQUEST _ METHODS if ($input _ Method eq GET) { #GET local($input _ Size)=length($ENV{\QUERY _ STRING\}); #Check the size of the input if($input _ Size>$input _ Max) { return(0,input too big); } #Read the input from QUERY _ STRING return(1,$ENV{\QUERY _ TRING\}); } elsif ($input _ Method eq POST) { #POST local($input _ Size)=$ENV{\CONTENT _ LENGTH\}; local($input _ Data); #Check the size of the input if ($input _ Size>$input _ Max) { return(0,Input too big); } #Read the input from stdin unless (read(STDIN,$input _ Data,$input _ Size)) { return(0,Could not read STDIN); } return(1,$Input _ Data); } #Unrecognized METHOD return (0,METHOD not GET POST); } 總而言之,腳本應該不對接收的表單數據進(jìn)行假設,應盡可能預計意料之外的情形并正確地處理不正確的或錯誤的輸入數據。在使用數據之前應按盡可能多的方式測試它拒絕不合理的輸入并打印一條錯誤消息如果某項出錯或漏了應自動(dòng)選擇一個(gè)缺省值甚至可以試圖對輸入進(jìn)行編碼以成為程序的合理的輸入。選擇哪種方式依賴(lài)于自己想花費多少時(shí)間和精力,不過(guò)記住永遠也不要盲目接收傳給CGI腳來(lái)的所有信息。 2.5不要相信路徑數據 用戶(hù)能修改的另一類(lèi)型數據是PATH _ INTO的 服務(wù) 器環(huán)境變量。該變量由CGI URL中緊跟在腳本文件名之后的任何路徑信息填充的。例如,如果foobar.sh是一個(gè)CGl shell腳本,那么當foobar.sh運行時(shí),URL http://www.server.com/cgi-bin/foobar.sh/extra/path/info 將導致/extra/path/info被放進(jìn)PATH _ INFO環(huán)境變量中。 如果使用這個(gè)PATH _ INFO環(huán)境變量,就必須小心地完全驗證它的內容。就像表單數據能以許多種方式被修改一樣,PATH _ INFO也可以修改。盲目地根據PATH _ INFO的中指定的路徑文件進(jìn)行操作的CGI腳本可能會(huì )讓惡意的用戶(hù)對 服務(wù) 器造成傷害。 例如,如果某個(gè)CGI腳來(lái)設計用于簡(jiǎn)單地打印出PATH _ INFO中引用的文件,那么編輯該CGI URL的用戶(hù)就可以讀取機器上的幾乎所有文件,如下所示: #!/bin/sh #Send the header echo Conext-type:text/html echo #Wrap the file in some HTML #!/bin/sh echoHTML>HEADER>TITLE>File/TITLE>HEADER>BODY> echoHere is the file you requested:PRE>\n cat $PATH _ INFO echo /PRE>/BODY>HIML> 盡管在用戶(hù)只單擊預定義的鏈接(即 http://www.server.com/cgi-bin/foobar.sh/public/faq.txt )時(shí),該腳本正常工作,但是一個(gè)更有創(chuàng )造性的(或惡意的)用戶(hù)可能會(huì )利用它接收 服務(wù) 器上的任何文件。如果他想進(jìn)入 http://www.server.com/cgi-bin/foobar.sh/etc/passwd ,前面的腳本會(huì )很高興地返回機器的口令文件——這可是不希望發(fā)生的事。 另一種安全得多的方式是在可能時(shí)使用PATH _ TRANSLATED環(huán)境變量。不是所有的 服務(wù) 器都支持該變量,所以腳本不能依賴(lài)于它。不過(guò)如果有的話(huà),它能提供完全修飾的路徑名,而不是像PATH _ INFO提供的相對URL。 不過(guò)在某種情形下,如果在CGI腳本中使用PATH _ TRANSLATED的話(huà),則可以訪(fǎng)問(wèn)通過(guò)瀏覽器不能訪(fǎng)問(wèn)到的文件。應該知道這點(diǎn)及它的應用。 在大部分UNIX 服務(wù) 器上,htaccess文件可以位于文檔樹(shù)的每個(gè)子目錄,負責控制誰(shuí)能夠訪(fǎng)問(wèn)該目錄中的特殊文件。例如它可以用于限制一組Web頁(yè)面只給公司雇員看。 雖然 服務(wù) 器知道如何解釋.htaccess,從而知道如何限制誰(shuí)能還是不能看這些頁(yè)面,CGI腳本卻不知道。使用PATH _ TRANSLATED訪(fǎng)問(wèn)文件樹(shù)中任意文件的程序有可能碰巧覆蓋了 服務(wù) 器提供的保護。 無(wú)論使用PATH _ INFO還是PATH _ TRANSLATED,另一個(gè)重要的步驟是驗證路徑以確保它或者是一個(gè)真正的相對路徑或者是腳本認可的幾個(gè)準確的、預知的路徑之一。對于預定的路徑,腳本將簡(jiǎn)單地將提供的數據與認可可以使用的文件的內部清單進(jìn)行比較,這就是說(shuō)在增加文件或修改路徑時(shí)必須重新編譯腳本,但安全性卻有了保障。只允計用戶(hù)選擇幾個(gè)預定義的文件而不允許用戶(hù)指定實(shí)際的路徑和文件名。 下面是處理訪(fǎng)問(wèn)者提供的路徑時(shí)應遵循的一些規則。 1)相對路徑不以斜線(xiàn)開(kāi)頭。斜線(xiàn)意味著(zhù)相對于根或絕對路徑。如果有的話(huà),CGI腳本也是很少需要訪(fǎng)問(wèn)Web根之外的數據。這樣它們使用的路徑就是相對于Web根目錄,而不是絕對路徑。應拒絕任何以斜線(xiàn)開(kāi)始的內容。 2)在路徑中單個(gè)點(diǎn)(.)和兩個(gè)點(diǎn)(..)的序列也有特殊含義。單點(diǎn)意味著(zhù)對對于當前目錄,而雙點(diǎn)意味著(zhù)相對于當前目錄的父目錄。聰明的黑客可以建立象../../../etc/passwd這樣的串逆向三層,然后向下進(jìn)入/etc/passwd文件。應拒絕任何包含雙點(diǎn)序列的內容。 3)基于NT 服務(wù) 器使用驅動(dòng)器字母的概念來(lái)引用磁盤(pán)卷。包含對驅動(dòng)器的引用的路徑都以一個(gè)字母加上一個(gè)冒號開(kāi)頭。應拒絕任何以冒號為第二個(gè)字符的內容。 4)基于NT的 服務(wù) 器還支持Univesal Naming Conventions(UNC)引用。一個(gè)UNC文件規格指定機器名和一個(gè)共享點(diǎn),其余部分與指定機器上的指定的共享點(diǎn)有關(guān)。UNC文件規格總是以?xún)蓚€(gè)反斜線(xiàn)開(kāi)頭。應拒絕任何UNC路徑。
上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: CGI 安全問(wèn)題

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>