答案第二版
The 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”(如果没有任何尾随空白行)。
我称其为“严厉”,因为我已经逐步取消了每个环境变量的设置。