2-е издание Ответа
В руководстве 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-е издание ответа.
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» (если у вас нет завершающих пустых строк).
Я называю это «драконовским», потому что я не установилкаждая переменная среды, по частям.