【问题标题】:cgi param() function did not workcgi param() 函数不起作用
【发布时间】:2012-02-05 04:45:42
【问题描述】:

我的 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

【问题讨论】:

  • @Sparky672 Lincoln Stein 是 CGI.pm 模块的作者。
  • @tadmc,现在更有意义了。泰。

标签: perl cgi param


【解决方案1】:

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

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

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

我希望这会有所帮助。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 感谢JRideout!我只是吞下代码并尝试理解 param() 函数。现在我意识到我还有很长的路要走。
    猜你喜欢
    • 2011-08-09
    • 2014-08-26
    • 1970-01-01
    • 2012-04-25
    • 2017-09-21
    • 2013-01-29
    • 2015-04-27
    • 2019-01-28
    • 1970-01-01
    相关资源
    最近更新 更多