【问题标题】:Accessing multiple <select>-ed parameters with Perl CGI使用 Perl CGI 访问多个 <select> 参数
【发布时间】:2012-05-05 08:58:51
【问题描述】:

我正在使用 Perl CGI 模块。如果我有这样的 HTML

<select multiple name="FILTER_SITE">
  <option>1</option>
  <option>2</option>
</select>

并提交我的表单,我可以在 URL 中得到类似的内容: [..] FILTER_SITE=1&amp;FILTER_SITE=2

Perl 的my $FILTER_SITE = $cgi-&gt;param('FILTER_SITE'); 将只捕获第一个实例。

我怎样才能同时使用两者(在这种情况下)?破解它并自己解析引用并将它们添加到数组中是我的第一个想法,但它会有点混乱,然后我几乎不精通 CGI.pm 或 Perl。

有趣的是,有了 Data::Dumper

print "&lt;pre&gt;".Dumper($cgi-&gt;param('FILTER_SITE')) . "&lt;/pre&gt;";

$VAR1 = '1';
$VAR2 = '2';

【问题讨论】:

  • optrion 是错字吗?试试:use Data::Dumper; print Dumper $cgi-&gt;param('FILTER_SITE');
  • 这不是隐藏在文档中的东西。
  • 确实,飞速发展的奇迹..

标签: html perl cgi


【解决方案1】:

注意:当前文档(截至 2020 年 5 月 29 日)称这种方法可能会导致安全漏洞。请在下面查看我的答案。

param 方法在标量上下文中提供单个值,在列表上下文中(可能)提供多个值。阅读它here

因此,如果您将代码更改为,例如

my @FILTER_SITE   = $cgi->param('FILTER_SITE');

那么数组将包含选项的所有选定值。

如果它更适合你的代码,你也可以写

for my $FILTER_SITE ($cgi->param('FILTER_SITE')) {
  :
}

【讨论】:

  • 太好了,我相信这会奏效,但真的要冲刺,稍后再回来查看!
  • @Recc:您使用Data::Dumper 的示例有效,因为子例程调用将参数置于列表上下文中。如您所见,Dumper 将显示列表中每个项目的值。
【解决方案2】:

我知道这是一篇旧帖子,但自从回答了这个问题后,看起来几乎没有什么变化。我想发布有关此的最新信息,特别是因为现在接受的答案被认为是一个安全漏洞。 CGI.pm documentation says

{Warning - calling param() in list context can lead to vulnerabilities if you do not sanitise user input as it is possible to inject other param keys and values into your code. This is why the multi_param() method exists, to make it clear that a list is being returned, note that param() can still be called in list context and will return a list for back compatibility.}

建议改用$cgi-&gt;multi_param方法。

【讨论】:

    【解决方案3】:

    解析值示例

        #!/usr/bin/perl
    
        use Encode;
    
        print "Content-Type: text/html; charset=UTF-8\n\n";
    
        if($ENV{'REQUEST_METHOD'} eq "POST") {
          read(STDIN, $querystring, $ENV{'CONTENT_LENGTH'});
         print "<h1>POST</h1>";
        } else {
          print "<h1>GET</h1>";
          $type = "display_form";
          $querystring = $ENV{'QUERY_STRING'};
        }
    
        print "<p>$querystring</p>";
    
        if (length ($querystring) > 0){
          @pairs = split(/&/, $querystring);
          foreach $pair (@pairs){
               ($name, $value) = split(/=/, $pair);
               $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
               $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
               if (exists $in{$name}) {
                 $value = "$value,$in{$name}";
               }
               $in{$name} = $value;
          }
        }
    
       foreach my $val (sort keys %in) {
         print "<p>$val: $in{$val}</p>";
       }
    

    【讨论】:

      猜你喜欢
      • 2013-04-25
      • 2017-04-12
      • 1970-01-01
      • 2012-04-25
      • 2013-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-11
      相关资源
      最近更新 更多