中文版 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 |