3

当我尝试 perlfaq5 中的最后一个示例时:How-do-I-count-the-number-of-lines-in-a-file? 我收到一条错误消息。我应该怎么做才能让脚本正常工作?

#!/usr/local/bin/perl -T
use warnings;
use 5.012;

$ENV{PATH} = undef;

my $filename = 'perl2.pl';

if( $filename =~ /^([0-9a-z_.]+)\z/ ) {
    my $lines = `/usr/bin/wc -l $1`;
    print $lines;
}

输出:

Insecure $ENV{ENV} while running with -T switch at ./perl1.pl line 10.
4

1 回答 1

5

答案第二版

perldoc perlsec手册描述了污点模式(还有perldoc Taint一个与污点模式相关的模块)。

在某种程度上,它说明了:

$path = $ENV{'PATH'};       # $path now tainted

$ENV{'PATH'} = '/bin:/usr/bin';
delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};

$path = $ENV{'PATH'};       # $path now NOT tainted
system "echo $data";        # Is secure now!

$ENV{PATH} = undef;你的代码之后,我被警告过CDPATH。所以,调整该代码,我使用(perl2.pl 再次):

#!/usr/bin/env perl -T
use warnings;
use 5.012;

delete @ENV{'PATH', 'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};

my $filename = 'perl2.pl';

if ($filename =~ /^([0-9a-z_.]+)\z/)
{
    my $lines = `/usr/bin/wc -l $1`;
    print $lines;
}

这次答案是“13 perl2.pl”。这远没有答案的第一版那么严厉。

第一版答案

这个严厉的解决方案“有效”:

#!/usr/bin/env perl -T
use warnings;
use 5.012;

foreach my $env (keys %ENV)
{
    undef $ENV{$env};
}

my $filename = 'perl2.pl';

if ($filename =~ /^([0-9a-z_.]+)\z/)
{
    my $lines = `/usr/bin/wc -l $1`;
    print $lines;
}

如果脚本名为“perl2.pl”,则运行会perl -T perl2.pl产生答案“16 perl2.pl”(如果您没有任何尾随空行)。

我称其为“严苛”,因为我已经逐步取消了每个环境变量的设置。

于 2010-12-29T07:35:51.403 回答