cgi param()函数不起作用

时间:2012-01-08 03:01:59

标签: perl cgi param

我遇到了我的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

2 个答案:

答案 0 :(得分:2)

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

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

  1. 获取$ filename使用正则表达式
  2. 取消其内容
  3. 调用uploadInfo后,请在继续之前验证操作是否成功。
  4. 我希望这会有所帮助。

答案 1 :(得分:1)

如果您没有检查是否确实在脚本中发布了文件,则会收到错误消息。如果您希望使用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;