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

Perl 使用CGI文本输入参数的更安全方法?,perl,cgi,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

好的,这里有一个输入表单,有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]
是一个句子。如果我不检查是否没有输入,当没有输入时,就不会出现匹配项(也就是说,它在每种情况下都包括
$exc
)。我猜这是因为每个句子中都有一个undef或空格

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


非常感谢您的时间。

如果您不使用
警告,并且不使用
|a'
您应该会收到警告:
在…使用未初始化值。

perl(或任何语言)的最佳实践是,在函数或正则表达式中使用变量之前检查变量是否存在,除非有特定的原因表明它可能为null

您应该真正摆脱
| |“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()
,因为
'
已定义,但仍存在匹配问题。

谢谢,这就解决了问题。我认为hash-bang行上的-w与use-warnings相同?&&比“和”更快/更高效吗?谢谢!如果$exc0等人的值可能为“0”,那么Corey的代码将不会做正确的事情。因为我们想在使用变量之前检查它是否有一定的长度,所以我们应该执行以下操作:next if(length($exc0)和$totalmatch->[2]…@Jon,你也会得到带有
-w
的警告,但是
-w
使用警告;
是不同的。
使用警告;
是词汇范围,而
-w
是全局的。@Jon,
&
之间的效率没有区别。区别在于运算符优先级。这影响了cts如何解析代码。在这种情况下,
&&
是常规选择,但
的行为将相同。@Corey Henderson,@Jon,为了避免警告,
length($exc0)
应该是
length($exc0/”)
如果代码将在Perl 5.10上运行。如果代码将在Perl 5.8上运行,则定义
length($exc0)&&length($exc0)
是避免警告的必要工具。我不能和safe说话,因为我不认为安全是问题。但肯定有一个更简单的方法。每当你看到自己在“$exc0”中键入“$variable_number”,你应该问这是一个更适合数组的工作吗?
我的@exc=map{param(“排除$)|a'}0..3;
…及以后的…
foreach(@exc){next if($totalmatch->[2]=~/\b$exc[$\u]\b/i);…}
很抱歉,句子中可能有“a”,我不想排除它。这是缩短代码的好方法,感谢您提供的一般提示。仍然没有习惯于定期使用map。谢谢!字符串上下文中的undef,如正则表达式中的undef,就好像它是空字符串一样。每个字符串都包含空字符串,因此每个字符串都包含空字符串字符串将匹配与空字符串匹配的正则表达式。
exclude0
等正则表达式模式吗?如果不是,则需要
/\b\Q$exc0\E\b/
@tadmc,但每个字符串都不会匹配
/\b\b/
。事实上,不会匹配。