CGI 程式的功能是強大的, 但正是因為如此, 如果您作為CGI 開發人員或系統管理人員不注意編寫和設置CGI 程式的話,將使您的系統千瘡百孔。 本篇就CGI的安全性問題做一討論。
3 、 CGI 的安全性
CGI 程式的功能是強大的, 它不僅可以具有普通程式的功能, 而且可以將程式的結果發佈在WEB 上。 但正是因為CGI 程式的功能如此強大, 如果您作為CGI 開發人員或系統管理人員不注意編寫和設定CGI 程式的話, 將使您的系統千瘡百孔, 讓一些非法用戶有機可乘。
這裡所講到的安全性並不是CGI 規範所造成的, 而是由程式設計和系統設定不當所造成的。 CGI 規範使用戶可以利用伺服器的運算能力, 是伺服器上的運算不當導致了系統的安全漏洞。 下面我給一個在UNIX 系統上的一個CGI 安全漏洞, 這個漏洞是非常常見的。
# !/usr/local/bin/perl
# formmail.cgi
require "cgi.pl";
# Launch e-mail application "/bin/mail" with Subject: header from the "formname" field
open (MAIL, "|/bin/mail -s '".$input{"formname"}."' webweave");
# Add send "formcontents" field as the body of the message
PRint MAIL $input{"formcontents"};
close(MAIL);
exit(0);
在這個例子中, CGI 程式將表單的資訊提交給/bin/mail , 並發送到webveave 伺服器上去。 在大多數情況下這個CGI 程式可以正常完成任務, 但此CGI 程式未過濾使用者在WEB 表單中輸入的訊息, 因此留下了安全隱患。 當使用者或別有用心的人輸入了錯誤的資料可能導致系統錯誤或得到不應有的權限。
例如使用者在WEB 表單的"formname" 中填入下面的內容:
"ls /etc/passwd '[email protected] #'
在使用者的WEB 瀏覽器中就會顯示出/etc/passwd 的內容, 若此UNIX 系統的passwd 檔案沒有shadow , 使用者就可以利用此內容, 使用crack jack 或crack john 就可以試圖破解密碼!
前面已經提到, CGI 的安全是程式設計師和系統管理員都應負責的, 下面我就分別講一講二者應注意的事:
系統管理員的工作:
1 、 與程式設計師合作, 分享有關伺服器安全的信息, 同時互相檢查程式碼, 及時發現程式碼中的安全問題。
2 、 使用好的伺服器軟體, 經常去伺服器軟體的WEB 網站了解最新的資訊。
3 、 將伺服器的使用者限制在特定的網路主機上, 使用伺服器的安全管理功能、 設定路由存取控制等。
4 、 對CGI 功能進行限制, 部分進階服務僅限於信任的用戶, 將測試中的CGI 程式的使用限制在開發人員中, 只提供給用戶經過測試的CGI 程式。
5 、 在使用其他人的CGI 程式時, 仔細檢查程式碼。
6 、 將CGI 程式的使用限制在受保護的環境中, 伺服器設定成非特權使用者訪問, 並為CGI 程式專門設立一個運作帳戶或群組。
7 、 將執行CGI 程式的伺服器設定在防火牆外, 這一點一定要注意, CGI 程式的伺服器必須設定在防火牆外, 如果設定在防火牆內, 一旦非法使用者找到了CGI 程式伺服器的安全漏洞, 他就可以控制在防火牆內的所有主機!
8 、 降低CGI 程式的運作優先級, 防治使用者惡意執行大量的CGI 程式導致伺服器過載。
9 、 訂閱網路安全性的郵件, 參加網路安全性的新聞群組。
CGI 程式設計師的工作:
1 、 同系統管理員合作, 了解系統的安全訊息, 互相檢查代碼。
2 、 使用可靠的函式庫程序, 檢查函式庫程式的原始碼。
3 、 從REMOTE_HOST 取得客戶機名, 將一些進階功能限制在受信任的客戶機。
4 、 如果WEB 伺服器提供HTTP 口令確認, 使用HTTP 口令來限制存取。
5 、 過濾使用者的輸入, 移除非法的輸入資料。
6 、 限制輸入資料的大小, 防止惡意使用者輸入大量資料使伺服器過載。
7 、 避免將使用者資料傳遞到其他應用程序, 以免使用者呼叫命令解釋器或利用其他應用程式的安全漏洞。
8 、 發現了CGI 程式的漏洞時, 不要對任何人講, 更不要在程式中註解說明, 您應該作的就是立刻修補漏洞。
9 、 學作攻擊者, 找出CGI 程式的安全漏洞。