【问题标题】:Files Not Uploading Via Perl Script文件不通过 Perl 脚本上传
【发布时间】:2016-06-03 15:12:14
【问题描述】:

之前,我发布了一个我使用了多年的 PERL 文件上传脚本,但它神秘地停止了工作。此后我尝试了另一个脚本(从网站借来 - https://www.sitepoint.com/uploading-files-cgi-perl/),但它也不起作用。我真的需要一个文件上传脚本在我们的网站上工作,所以任何帮助都非常感谢。

当我尝试使用 html 表单上传文件时,它似乎可以正常工作并显示确认屏幕。该文件存在于上传文件夹中,但它是空的。我将存储上传文件的文件夹的权限更改为 777,但这似乎没有帮助。因此,它能够打开文件夹中的文件,但不能写入。

HTML 代码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

    <title>File Upload</title>

    </head>

    <body>

    <form action="/cgi-bin/upload.cgi" method="post" enctype="multipart/form-data">
    <h2 style="margin-left:40px;">Nursing File Upload</h2>

    <p style="margin-left:40px;margin-top:40px;font-size:24px;">File to Upload: <input type="file" name="photo" /></p>

    <p style="margin-left:40px;font-size:24px;">Password: <input type="password" name="password" /></p>

    <p style="margin-left:40px;font-size:24px;"><input type="submit" name="Submit" value="Submit Form" /></p>

    </form>

    </body>

    </html>

PERL 代码

    #!/usr/bin/perl -wT

    use strict;
    use CGI;
    use CGI::Carp qw ( fatalsToBrowser );
    use File::Basename;

    $CGI::POST_MAX = 1024 * 5000;
    my $safe_filename_characters = "a-zA-Z0-9_.-";
    my $upload_dir = "/home/httpd/cgi-bin/ge";

    my $query = new CGI;
    my $filename = $query->param("photo");
    my $password = $query->param("password");

    if ($password ne "nursing1")
    {
    print $query->header ( );
    print "Password incorrect.  Please try again.";
    exit;
    }

    if ( !$filename )
    {
    print $query->header ( );
    print "There was a problem uploading your file.";
    exit;
    }

   my ( $name, $path, $extension ) = fileparse ( $filename, '..*' );
   $filename = $name . $extension;
   $filename =~ tr/ /_/;
   $filename =~ s/[^$safe_filename_characters]//g;

   if ( $filename =~ /^([$safe_filename_characters]+)$/ )
   {
   $filename = $1;
   }
   else
   {
   die "Filename contains invalid characters";
   }

   my $upload_filehandle = $query->upload("photo");

   open ( UPLOADFILE, ">$upload_dir/$filename" ) or die "$!";
   binmode UPLOADFILE;

   while ( <$upload_filehandle> )
   {
   print UPLOADFILE;
   }

   close UPLOADFILE;

   print $query->header ( );

   print "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"     \"DTD/xhtml1-strict.dtd\">";
   print "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">";
   print "<head>";
   print "<meta http-equiv=\"Content-Type\" content=\"text/html;     charset=utf-8\" />";
   print "<title>Thanks!</title>";
   print "<style type=\"text/css\">";
   print "img {border: none;}";
   print "</style>";
   print "</head>";
   print "<body>";
   print "<p>Thanks for uploading your file!</p>";
   print "</body>";
   print "</html>";

【问题讨论】:

  • 我想今天是周五。这是关于通过网络几乎连续加载文件的第三个问题。 :D
  • 几个调试问题。 (1) 您是否尝试过我对上一个问题的回答中的那一行,以查看服务器写入的 temporary 文件?这可能有助于检查该过程的该部分是否有效。这个新脚本也以同样的方式完成。 (2) 您能否添加另一个打印件以及print UPLOADFILE,以便打印到您肯定可以写入文件的位置,例如您的主目录?
  • 试试这个打印 UPLOADFILE $_;
  • @zdim - 我确实尝试了你的建议并且得到了相同的结果。我尝试将文件写入 html 目录。文件已创建但为空。
  • 似乎问题出在上传过程本身,正如我对您之前 Q 的回答中所述,在第一句和最后一句以及两者之间。将以下诊断信息打印到文件中。我将$ufh 用于$upload_filehandle。 (1) 检查文件句柄 -- print "$ufh\n" 应该打印 GLOB(...)print fileno($ufh), "\n" 应该打印(正!)整数。与print fileno UPLOADFILE 相比,应该有所不同。 print tell($ufh) 应该打印 0(文件的开头)。 (2) 在我的答案中链接到的 CGI 文档中使用uploadInfo 和其他查询方法,看看你得到了什么。告诉我。

标签: perl upload


【解决方案1】:

您的文件夹的权限应设置为 755。 不要上传到 cgi-bin,将文件夹移出那里。 上传的文件可以在close UPLOADFILE; 之后设置权限为 644 chmod 0644, $upload_dir.'/'.$filename;,但使用该上传脚本仍然存在一些安全问题。

【讨论】:

    猜你喜欢
    • 2012-05-31
    • 2013-09-04
    • 2014-01-30
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多