当我尝试最后一个示例perlfaq5:如何在file-in-count-in-count-number 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.
有帮助吗?

解决方案

第二版答案

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'(如果您没有任何尾随的空白行)。

我之所以称其为“ Draconian”,是因为我无法设置每个环境变量,零碎。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top