3 回答
注意:当前文档(截至 2020 年 5 月 29 日)表示此方法可能会导致安全漏洞。请在下面查看我的答案。
该param
方法在标量上下文中提供单个值,在列表上下文中(可能)提供多个值。在这里阅读。
因此,如果您将代码更改为,例如
my @FILTER_SITE = $cgi->param('FILTER_SITE');
那么该数组将包含该选项的所有选定值。
如果它更适合您的代码,您也可以编写
for my $FILTER_SITE ($cgi->param('FILTER_SITE')) {
:
}
我知道这是一篇旧帖子,但自从回答了这个问题以来,似乎几乎没有什么变化。我想发布有关此的最新信息,特别是因为现在接受的答案被认为是一个安全漏洞。CGI.pm 文档说
{ 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->multi_param
方法。
解析值示例
#!/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>";
}