cgi-param()函数不起作用



我的perl脚本遇到了一个问题,就是它没有通过。作为一个初学者,如果有人能为我解释一下,我会很感激。正如Lincoln所提到的,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

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

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

  1. 在获得$filename后,使用正则表达式对其内容进行取消标记
  2. 调用uploadInfo后,请验证操作是否成功,然后再继续

我希望这能有所帮助。

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

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

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

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;

最新更新