我的脚本严格使用-t参数或'taint'模式。如果我尝试设置已经定义的变量的值,则它会崩溃。我没有做太多的事情,我只是想修改它,不知道为什么它会破裂。这是它的外观:
#!/usr/bin/perl -T
use 5.010;
use CGI;
use CGI::Carp qw/fatalsToBrowser/;
use strict;
use warnings;
use localtime;
my @months = qw(january february march april may june july august september october november december);
my $q = CGI->new();
say $q->header(), $q->start_html(-title=>'Calendar');
for my $param ($q->param()) {
my $safe_param = $q->escapeHTML($param);
for my $value ($q->param($param)) {
my $params = $q->escapeHTML($value);
{
local $ENV{"PATH"} = "/bin:/usr/local/bin:/usr/bin";
local $ENV{"BASH_ENV"}="";
my $date = "";
my $white = /^s*$/;
my $singleyear = /^d{2,4}$/;
my $nummonth = /^d{1,2}sd{1,4}$/;
# If $params is empty or all white space, set $date to a single space
if ($params =~ $white) {
my($day, $month, $year)=(localtime)[3,4,5];
my $monthname = $months[$month];
$date = "$monthname $year"
}
# If $params is only a single 1-4 digit year, set $date to year
if ($params =~ $singleyear) {
$date = $params;
}
# If $params is a 1-2 digit month and a 1-4 digit year set $date to month and year
if ($params =~ $nummonth) {
my $monthnumber = $params =~ /^d{1,2}/;
my $monthstring = $months[$monthnumber];
my $yearnumber = $params =~ /(d{1,4})$/;
$date = "$monthstring $yearnumber";
}
if ($date eq "") {
say "<h1>Invalid Parameters: $params</h1>";
} else {
say "<h1>Parameters: $params</h1>";
}
my $cmds = "cal -h " . $date;
my @lines = `$cmds`;
say ("<pre>");
for my $line (@lines) {
print ("$line");
}
say ("</pre>");
}
}
say '</p>';
}
say $q->end_html();
在任何时候我设置了$date
的值,它会引发错误:
Insecure dependency in `` while running with -T switch
如果我设置了my $date
,则不会引发任何错误,但实际上没有更新日期的值。
另外,我很确定我所有的正则是错误的,因为我进行了一些测试,并且由于某种原因,无论用户输入如何,所有这些案例都会对true进行评估。但这并不是我现在面临的问题。
$params
02 1999
$date = $params;
这样的代码将污染的$params
值分配给$date
,而无需拆卸。
而是:将所需的确切数据与正则匹配匹配,并使用正则捕获以提取未污染的值。例如:
if ($params =~ /^(d{2,4})$/) {
$date = $1;
}
等其他情况。
请注意,分配正则 $foo = /bar/
并未分配正则对象,而是分配了与$_
变量相匹配的结果!如果需要创建正则对象,请使用qr/.../
操作员。但是,在程序中使用Regex对象似乎不必要 - 只需在每个条件下写下正则态度即可避免问题。