1

我的 perl 脚本遇到了一个问题,它只是没有通过。作为初学者,如果有人可以为我解释一下,我将不胜感激。正如林肯所说, param() 使用起来很简单,但实际上它很复杂。我阅读了 cgi 文档和其他示例,但无法弄清楚为什么这个不起作用,我从其他人那里复制以进行测试。
我相信我的 apache、perl 和 CGI​​.pm 安装正确,并且在其他示例中运行良好,但不是这个示例。
非常感谢!

====================================================

  1  #!/usr/bin/perl -wT

  3  use strict;
  4  use CGI qw(:standard);

  6  my $q = CGI->new;

  8  my $filename = $q->param("name");
    #print $filename, "\n";
  10  my $contenttype = $q->uploadInfo($filename)->{'Content-Type'};

  12  print header;
  13  print start_html;
  14  print "Type is $contenttype<P>";
  15  print end_html;

==================================================== == -------------错误信息-------------------------------- ------------

error] [client 127.0.0.1] Use of uninitialized value in hash element at (eval 3) line 3.
[error] [client 127.0.0.1] Can't use an undefined value as a HASH reference at /usr/lib/cgi-bin/Steve/Listing4-1-upload-file.cgi line 10.
[error] [client 127.0.0.1] malformed header from script. Bad header=tomato: Listing4-1-upload-file.cgi
4

2 回答 2

2

在脚本的第一行中,启用 perl 的 Taint 模式(-T开关)。这很好。但它会导致脚本之外的任何内容——包括你的 CGI 脚本的参数——被污染。受污染的内容不能用于对某些系统调用的调用 - 请参阅 man perlsec。在使用此内容之前,您必须清除数据。

这可能是导致问题的原因,因为变量$filename被污染了,所以不会保存上传的内容,因此$q->uploadInfo( $filename )不会返回 hashref。我建议至少有两个改变:

  1. 获得 $filename 后,使用正则表达式清除其内容
  2. 调用uploadInfo 验证操作成功后,再继续。

我希望这有帮助。

于 2012-01-08T12:57:58.013 回答
1

如果您不检查是否确实有文件发布到您的脚本,您将收到错误消息。如果您希望使用 html 来生成表单提交,这意味着您需要一个表单元素,例如

<input type="file" name="name" />

试试这个例子。额外if语句检查文件以防止引用无效上传。我们还提供了一个简单的 for 测试上传案例。

my $filename = $q->param("name");
my $contenttype = '';
$contenttype = $q->uploadInfo($filename)->{'Content-Type'} if $filename;

print header;
print start_html;
print '
<FORM ENCTYPE="multipart/form-data" ACTION="/Listing4-1-upload-file.cgi" METHOD="POST">
Please select a file to upload: <BR/> 
<INPUT TYPE="FILE" NAME="name" />
<INPUT TYPE="submit">
</FORM>';
print "<p>file: $filename </p>" if $filename;
print "<p>Content-Type: $contenttype </p>" if $contenttype;
print end_html;
于 2012-01-08T04:43:17.863 回答