更安全的方式使用CGI文本输入参数?

时间:2011-06-28 17:35:19

标签: perl cgi

好的,所以有一个输入表单,有4个文本框。我使用CGI.pm获取输入:

my $exc0 = param('exclude0') || 'a'; 
my $exc1 = param('exclude1') || 'a';
my $exc2 = param('exclude2') || 'a';
my $exc3 = param('exclude3') || 'a';

我必须包含|| 'a'的原因是,如果没有输入,则允许它工作。有没有更安全的方法来做到这一点?

稍后会在正则表达式中调用它:

next if ($totalmatch->[2] =~ /\b$exc0\b/i);
next if ($totalmatch->[2] =~ /\b$exc1\b/i);
next if ($totalmatch->[2] =~ /\b$exc2\b/i);
next if ($totalmatch->[2] =~ /\b$exc3\b/i);

$totalmatch->[2]是一个句子。如果我没有检查没有输入,当没有输入时没有匹配(a.k.a.它包括$exc在每种情况下)。我猜这是因为每个句子都有一个undef或空格?

我尝试过的是|| '',我想我可以使用if ($exc0)if defined()eq '',但只是寻求帮助。

非常感谢你的时间。

1 个答案:

答案 0 :(得分:3)

如果您没有执行use warnings但未执行|| 'a',则应收到警告:Use of uninitialized value at ...

在perl(或任何语言)中最好的做法是在函数中使用它之前检查变量是否存在,或者在这种情况下是正则表达式,除非有特定的原因是无效的。

你应该真的摆脱|| 'a'并做到这一点:

next if (length($exc0) and $totalmatch->[2] =~ /\b$exc0\b/i);
next if (length($exc1) and $totalmatch->[2] =~ /\b$exc1\b/i);
next if (length($exc2) and $totalmatch->[2] =~ /\b$exc2\b/i);
next if (length($exc3) and $totalmatch->[2] =~ /\b$exc3\b/i);

您不希望在此使用defined(),因为''已定义,您仍然会遇到匹配问题。