我的脚本运行严格的-T参数或'污染'模式。如果我尝试设置已经定义的变量的值,它就会崩溃。我没有做太多的事情,我只是想修改它并且不知道它为什么会破坏它。以下是它的主旨:
#!/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}\s\d{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
答案 0 :(得分:4)
$date = $params;
此类代码将受污染的$params
值分配给$date
,而不会忽略它。
相反:将所需的确切数据与正则表达式匹配,并使用正则表达式捕获来提取未受污染的值。例如:
if ($params =~ /^(\d{2,4})$/) {
$date = $1;
}
等等其他案例。
请注意,分配正则表达式$foo = /bar/
不会分配正则表达式对象,而是将该正则表达式与$_
变量进行匹配的结果分配!如果需要创建正则表达式对象,请使用qr/.../
运算符。但是,在程序中使用正则表达式对象似乎是不必要的 - 只需在每个条件中记下正则表达式以避免出现问题。