我在perl中创建了一个小脚本,显示用户发送的文件内容。
但是我注意到一些奇怪的事情:如果文件名为0
,则不会打印任何内容,就像我没有发送任何文件并刷新页面一样。
以下是代码:
#!/usr/bin/perl
use CGI;
my $cgi = CGI->new;
print "Content-type: text/html\n\n";
if ($cgi->upload('file')) {
print '<h1>file uploaded:</h1>';
my $file = $cgi->param('file');
while (<$file>) {
print "a";
print "<p>".$cgi->escapeHTML($_)."</p>";
}
}
答案 0 :(得分:3)
因为字符串0
(如空字符串和undef
值)在布尔上下文中评估为false,如
if($ cgi-&gt; upload(&#39; file&#39;)){...}
在文件名和文本处理中,这是一个边缘情况,通常比它值得思考的麻烦少,但是当你需要担心它时,解决方法是评估输入是否为空字符串
if ($cgi->upload('file') ne '') { ... }
if (length($cgi->upload('file'))) { ... }
sysopen
打开临时文件,现代版本使用File::Temp
。无论哪种方式都足以确保Perl尝试打开一个真实的文件,并且不会使用可以被管道或反引号欺骗的shell来执行任意命令。答案 1 :(得分:-1)