Perl在严格-T模式错误中设置变量的值

时间:2018-04-22 19:02:49

标签: perl strict taint

我的脚本运行严格的-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

1 个答案:

答案 0 :(得分:4)

  

$date = $params;

此类代码将受污染的$params值分配给$date,而不会忽略它。

相反:将所需的确切数据与正则表达式匹配,并使用正则表达式捕获来提取未受污染的值。例如:

if ($params =~ /^(\d{2,4})$/) {
    $date = $1;
}

等等其他案例。

请注意,分配正则表达式$foo = /bar/不会分配正则表达式对象,而是将该正则表达式与$_变量进行匹配的结果分配!如果需要创建正则表达式对象,请使用qr/.../运算符。但是,在程序中使用正则表达式对象似乎是不必要的 - 只需在每个条件中记下正则表达式以避免出现问题。