中文版 Perl CGI 程式寫作常問問題集(六)

- 中國WEB開發者網絡 (http://www.webasp.net)
-- 技術教程 (http://www.webasp.net/article/)
--- 中文版 Perl CGI 程式寫作常問問題集(六) (http://www.webasp.net/article/8/7742.htm)
-- 作者:未知
-- 發佈日期: 2003-09-13
5.0 -安全


----------------------------------------------------------------------

Q5.1: 以 Perl 寫成的 CGI 程式是不是不如以 shell 或 C
寫的來得安全?

這個問題的答案是: CGI
程式先天上就不安全,不管它是用那個語言寫成的*。

【譯者□
WWW 及 CGI 操作安全 FAQ

(<http://www-genome.wi.mit.edu/WWW/faqs/www-security-faq.html>)
中問題第 31 對此有深入的探討。

----------------------------------------------------------------------

Q5.2:我該特別留意哪些安全事項?

絕對不要對 shell 暴露任何 form 資料。底下這幾項通通都是安全漏洞:

* open(COMMAND, "/usr/ucb/finger $form_user");

* system("/usr/ucb/finger $form_user");

* @data = `usr/ucb/finger $form_user`;


話雖如此,在上面的第二種寫法中,系統安全可藉著改變參數傳送的方式而得以
改善。也就是將參數由字串方式傳送(shell
會先解譯),改為序列方式傳
送。

system("/usr/ucb/finger", $form_user);

您同時應該閱讀:

* 由 Lincoln Stein 所著,一份很完整的 WWW 及 CGI 操作安全 FAQ

(<http://www-genome.wi.mit.edu/WWW/faqs/www-security-faq.html>

* Paul Phillips 所著,CGI 安全 FAQ
(<http://www.cerf.net/~paulp/cgi-security/safe-cgi.txt>


----------------------------------------------------------------------

Q5.3:為什麼大家都說
http://bigidiot.abuse-me.com/perl.exe?foo.pl
這樣很危險?會有多糟?

極度危險!想想看如果我這麼做會發生什麼事:


http://bigidiot.abuse-me.com/cgi-bin/perl.exe?-e+format:%20c'

現在您同意了吧?避免這個惡夢發生的方法:

* 將 perl.exe 執行檔由 ``cgi-bin'' 移到 server
根目錄以外的目錄裡
去。
* 在 ``cgi-bin'' 裡用批次檔 (batch) script 來叫出您的 CGI
script。

以下是一例。假設您的 CGI script 叫做 ``sample.pl'' 而您的批次檔叫
``simple.bat'':

@echo off
c:\dos_perl\perl.exe
c:\netscape\ns-home\docs\cgi-bin\simple.pl

現在,您可以做:

<A HREF="/cgi-bin/simple.bat">Click Here</A>


----------------------------------------------------------------------


Q5.4:要如何在程式中安全地使用逆向撇號(backticks,"`",位於鍵盤左上
角)?這麼做:
@ans = `grep'$user_field' some.file`;
是不是真的不安全?

是的!這非常危險!試想,如果 $user_field 含有這樣的內容會有什麼後
果:

; rm -fr / ;

要達到相同的效果,一個比較安全的做法是*:

if (open GREP, "-|") {
@ans = <GREP>
} else {
exec("/usr/local/bin/grep", $user_field, "some.file")
|| die "Error exec'ing command", "\n";
}
close GREP;

【譯者】如果讀者對以上 open GREP, "-|"部份的句法有疑問,可
以參閱 perlipc manpages 中 Safe Pipe Opens一節的說明。


----------------------------------------------------------------------

Q5.5: /$user_variable/ 這個句法是不是 Perl 5 中的一個安全漏洞?

不!這不是個安全漏洞。但是如果您用 eval 指令在執行期 (runtime)
去評估
這個敘述,那麼,它會變成一個安全死角。例如這種做法可能很危險:

foreach $regexp (@all_regexps) {
eval "foreach (\@data) { push(\@matches, \$_) if
m|$regexp|o; }";
}


----------------------------------------------------------------------



這個敘述,那麼,它會變成一個安全死角。例如這種做法可能很危險:

foreach $regexp (@all_regexps) {
eval "foreach (\@data) { push(\@matches, \$_) if
m|$regexp|o; }";
}


webasp.net