在perl中打印上传文件的内容

时间:2016-10-28 18:15:45

标签: perl file-upload

我在perl中创建了一个小脚本,显示用户发送的文件内容。

但是我注意到一些奇怪的事情:如果文件名为0,则不会打印任何内容,就像我没有发送任何文件并刷新页面一样。

  1. 这怎么可能发生?
  2. 是否有人在文件名命令中删除以使我的服务器执行它? (用管道的东西)
  3. 以下是代码:

    #!/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>";
        }
    }
    

2 个答案:

答案 0 :(得分:3)

  1. 因为字符串0(如空字符串和undef值)在布尔上下文中评估为false,如

    if($ cgi-&gt; upload(&#39; file&#39;)){...}

  2. 在文件名和文本处理中,这是一个边缘情况,通常比它值得思考的麻烦少,但是当你需要担心它时,解决方法是评估输入是否为空字符串

    if ($cgi->upload('file') ne '') { ... }
    if (length($cgi->upload('file'))) { ... }
    
    1. 早期版本的CGI模块使用sysopen打开临时文件,现代版本使用File::Temp。无论哪种方式都足以确保Perl尝试打开一个真实的文件,并且不会使用可以被管道或反引号欺骗的shell来执行任意命令。

答案 1 :(得分:-1)

我可能会使用autoEscape()。

另一种选择是简单地测试文件名为“0”并要求用户更改它。

此外,您可以使用临时文件名。

有关详细信息,请参阅官方CGI文档。 CGI Documentation