当我尝试最后一个例子时 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.
答案 0 :(得分: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'。这远不如第1版的答案那么严厉。
这种严苛的解决方案“有效”:
#!/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'(如果没有任何尾随空行)。
我把它称为'严苛',因为我已经取消了所有环境变量,零碎。