開放式CGI程式的使用
1.開放式CGI程式的環境 一般言CGI程式區的權限是管制的,CGI 程式只能由系統管理者 來存取。若一般用戶想使用CGI程式,應如何? 2.若將 CGI 程式的設計權限開放給一般用戶,一般的作法有以下三種: (1).將 CGI 程式區某個目錄的存取權限打開。 例如以指令 chmod 1777 /www/cgi-user 將 /www/cgi-user 的存取權限設為 rwxrwxrwt ,以便讓用戶們在 此目錄內自行存放 CGI 程式。 (2).為每一位 WWW 站上的用戶開放一塊 CGI 程式區。例如在CERN httpd 程式的設定檔中加入 Exec /user1/cgi-bin/* /home/user1/WWW/cgi-bin/* 使得用戶 user1 在 /home/user1/WWW/cgi-bin 下所存放自己的CGI 程式均可被 httpd 執行。 (3).為 CGI 程式定義一個新的 MIME type,使得所有 CGI 程式不論存 放在何處均可被執行。 例如在 NCSA httpd 程式的設定檔中加入: AddType application/x-httpd-cgi .cgi 那所有以 cgi 為副檔名的檔案不論存放在何處均可被 httpd 執行。 以上三種方式都會產生一個相同的安全問題:由於 CGI 程式一直是被 httpd所執行, 因此即使是一般用戶的CGI程式在被執行時,執行者的角 色 是 httpd的擁有者,而非 CGI程式或FORM的擁有者。 3.解決之道: 想辦法執行自己CGI程式時的身分轉為 CGI程式或FORM的擁有者. (1) [UN]CGIWRAP :執行者的角色是 CGI程式的擁有者。 將你的 CGI 程式 放置於此 $HOME/WWW/cgi-bin 目錄下 用法: http://www-server/cgi-bin/cgiwrap/user_id/cgi_pgm http://www-server/cgi-bin/cgiwrap/~user_id/cgi_pgm http://www-server/cgi-bin/cgiwrap?user=user_id&script=cgi_pgm 其中 cgiwrap : 將cgi程式執行權限轉為使用者編號user_id. user_id : 你的使用者編號. cgi_pgm : 你的cgi程式. 你的cgi程式cgi_pgm可用下列形式使用: /user_id/cgi_pgm?name1=value1 /cgi-bin/cgiwrap?user=user_id&script=cgi_pgm&name1=valu1 (2) SCGI :執行者的角色是 FORM的擁有者。 用法: <FORM METHOD=POST或GET ACTION=/cgi-bin/scgi?URL_of_user_cgi> 其中 URL_of_user_cgi 可為下列的型式: a. /my_place/my_cgi b. /~user/my_place/my_cgi (3)CGIWARP與SCGI的使用比較 SCGI程式是 "setuid 為 環境變數 HTTP_REFERER的 uid" , 也就是 將EUID轉為 FORM 的 UID.由此可知:SCGI所驅動的CGI程式的擁有者 與執行時的UID EUID(FORM的擁有者)是可以不同的,究CGI程式的共享 而言, 其安全性會比 cgiwrap 好, 但是在HTML文件中連結的CGI執行, 此類不經過 FORM 而需要執行CGI程式的場合, 因SCGI找不到環境變數 HTTP_REFERER而導致無法執行. CGIWRAP 不管在HTML文件中的連或經FORM 的場合, 皆能適用. 但 CGI程式ㄧ定要放至於 $HOME/WWW/cgi-bin (內定)目錄下. 參考資料:
Using CGIwrap
http://www.umr.edu/~cgiwrap/

開放式 CGI 程式的安全考慮
http://thccx11.cc.nthu.edu.tw/wjchou/docs/uncgiwrap.html

FORM 與 ANCHOR 的小把戲
http://www.nthu.edu.tw/kckai/index.html


NTHU-CCC WJCHOU 85/10/21