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