CGI安全問題專題
CGI安全問題專題
在 計算機 領域——尤其在Internet上——盡管大部分Web 服務 器所編的程序都盡可能保護自己的內容不受侵害,但只要CGI腳本中有一點安全方面的失誤--口令文件、私有數據、以及任何東西,就能使 入侵 者能訪問 計算機 。遵循一些簡單的規則并保持警惕能使自己的CGI腳本免受侵害,從而可以保護自己的權益。 1. 腳本和程序 在開始決定采用何種語言編寫CGI腳本時應考慮幾個因素,其中之一應是安全性。Shell 腳本,Perl程序和C可執行程序是CGI腳本最常采用的形式,從安全性角度來說每種都備有優缺。盡管沒有哪一種是最好的--基于其他方面的考慮,如速度和可重用性--每種都有實用的領域。 Shell腳本一般用于小的、快速的甚至可以用完就不要的CGI程序,因此,編寫它們時常常不考慮安全性。這種疏忽可以導致一些缺陷,使得僅對系統具有一般 知識 的人也能進入系統任意走動。 盡管Shell CGI 程序最容易寫,甚至只需拼湊一下即可,但控制它們卻很困難,因為它們一般是通過執行外部的其他程序來完成工作的。這就導致一些可能的隱患,CGI 程序會繼承任何它使用的程序的安全問題。 例如,常用UNIX實用程序 awk對于它能處理的數據的數量有一些相當嚴格限制。如果在CGI腳本中使用awk,那么該程序也就有了同樣的限制。Perl比Shell腳本更進一步。Perl用于CGI 編程 有很多優點,并且相當安全。但Perl能給CGI 作者提供足夠的靈活性從而導致對安全性的錯誤感覺。例如,Perl是解釋型的。這意味著它實際在調用時是先編譯,然后每次執行一步。這就很容易使得不正確的用戶數據被包括進來作為 代碼 的一部分,從而錯誤地進行解釋,形成程序中止原因。 最后談談C。C迅速成為標準應用開發語言,幾乎所有的UNIX和windows NT系統都是用它開發的。從安全性的角度來看C 似乎是很不錯,但由于它的流行性,它的好幾種安全性問題已廣為人知,而這些問題也能很容易地被人利用。 例如,C 對串處理非常差。它不做任何自動的定位或清理而讓 編程 者自己處理所有事情。在處理串時,大部分C 程序員都是簡單地建立一個預定義的空間并希望它足夠大以便處理用戶輸入的任何內容。 當然,Shell腳本、Perl和C 不是僅有的編寫CGI腳本語言。實際上,任何可以按預定義的方式與Web 服務 器進行交互的 計算機 語言都可以用于編寫CGI程序。在UNIX和Windows NT 服務 器上,數據是通過環境變量和標準輸入(stdin) 傳給腳本的,所以任何能從這兩種數據源讀取并寫入標準輸出(sidout)的語言都能用于創建CGI:awk、FORTRAN、C++、Basic和COBOL,等。windows的程序員可以使用流行的Visual Basic,這意味著有經驗的VB程序員不必去學一門新語言。Macintosh使用AppleEvents、和AppleScript與CGI程序進行通信,所以任何可以讀寫這兩者的語言都可使用。 不過,Shell腳本(不管使用那種Shell)、Perl和C仍是最流行為的編寫CGI腳本的語言。這并不是說必須使用它們了只是說大部程序的庫——即大部分經過測試的安全的庫——都是用這三種語言編寫的。如果自己來選擇CGI 編程 語言,最好是借鑒前人的經驗。 2. 誰也不信 幾乎所有的CGI 安全問題都來自與用戶的交互。接收來自外部數據源的輸入之后一個簡單的、可預見的CGI程序突然向多方向伸展,每個方面都可能有最小的縫隙使得“黑客”可以溜進來。正是與用戶的這種交互——通過表單或文件路徑——才給予了CGI 腳本這種能力,但同時也使得它們成了運行在Web 服務 器上的最潛在的危險部分。 編寫安全的CGI 腳本很大程度上是創造性和妄想的結合。編寫者必須有足夠的創造性才能想到用戶使用的,不管是無意地還是別的所有的可能隱含導致問題的發送數據的方式。而且必須有點妄想,因為有可能不知道什么時候、什么地方、他們將會一一加以試驗。 2.1 兩種導致問題的方式 當用戶登錄進入Web 站點并開始進行交互訪問時,他們能以兩種方式惹麻煩。一種是不遵守規則,歪曲或違反頁面中建立的每個限制或約束;另一種方式是按要求去做。 大部分CGI 腳本是作為HTML表單的后臺運行的,負責處理由用戶輸入的信息并提供某種定制的輸出。因為在這種情況下,大部分CGI 腳本編寫時都等待某種特殊格式的數據。它們期望用戶的輸入能匹配收集并發送信息的表單。不過事情并不總是這樣。用戶可以有許多種辦法繞過這些預定義的格式而給腳本發送一些看起來是隨機的數據。CGI 程序必須對此有所準備。 其次,用戶可以給CGI 腳本發送所期望的數據類型,按預期的形式在表單中填入每個字段。這種類型的提交可以是想像中的來自某個與站點交互的無意的用戶,也可能來自某個惡意的“黑客”,憑借他有關操作系統和Web 服務 器 軟件 的 知識 并利用常見的 編程 錯誤。這些 入侵 ,表面上一切都正常,卻是最危險的、最難檢測出來。Web 站點安全性依賴干這種 入侵 的防止。 2.2 不要相信表單數據 在CGI 編程 中最常見的安全失誤就是相信從表單傳到腳本的數據,用戶是未知的一大堆人,他們總能找到一些 編程 人員從來沒想到過的發送數據的方法--而且是程序員認為幾乎不可能的方法。 腳本必須對這些加以考慮。例如,下面這些情形都是可能的: 1)從一組單單選按鈕中選擇的結果可能不是表單中提供的選項之一。 2)來自某個文本字段的數據長度可能大于MAXLENGTH字段允許的長度。 3)字段本身的名字可能與表單中指定的不相符。 2.3 不合理數據的來源 因—些無意的或是有意的原因,導致自己的腳本接收到不知道如何去處理的數據,有可能導致非預期的——同時很危險的——行為。 下面的 代碼 實現了一種表單并向某個搜索yahoo! 數據庫 的CGI腳本送垃圾。該腳本設計得很好并且很安全,因為它忽略了不認識的輸入。 $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); } 總而言之,腳本應該不對接收的表單數據進行假設,應盡可能預計意料之外的情形并正確地處理不正確的或錯誤的輸入數據。在使用數據之前應按盡可能多的方式測試它拒絕不合理的輸入并打印一條錯誤消息如果某項出錯或漏了應自動選擇一個缺省值甚至可以試圖對輸入進行編碼以成為程序的合理的輸入。選擇哪種方式依賴于自己想花費多少時間和精力,不過記住永遠也不要盲目接收傳給CGI腳來的所有信息。 2.5不要相信路徑數據 用戶能修改的另一類型數據是PATH _ INTO的 服務 器環境變量。該變量由CGI URL中緊跟在腳本文件名之后的任何路徑信息填充的。例如,如果foobar.sh是一個CGl shell腳本,那么當foobar.sh運行時,URL http://www.server.com/cgi-bin/foobar.sh/extra/path/info 將導致/extra/path/info被放進PATH _ INFO環境變量中。 如果使用這個PATH _ INFO環境變量,就必須小心地完全驗證它的內容。就像表單數據能以許多種方式被修改一樣,PATH _ INFO也可以修改。盲目地根據PATH _ INFO的中指定的路徑文件進行操作的CGI腳本可能會讓惡意的用戶對 服務 器造成傷害。 例如,如果某個CGI腳來設計用于簡單地打印出PATH _ INFO中引用的文件,那么編輯該CGI URL的用戶就可以讀取機器上的幾乎所有文件,如下所示: #!/bin/sh #Send the header echo Conext-type:text/html echo #Wrap the file in some HTML #!/bin/sh echo\\n cat $PATH _ INFO echo
非常好我支持^.^
(0) 0%
不好我反對
(0) 0%
相關閱讀:
( 發表人:admin )