Небезопасная $ env {env} во время работы с переключателем -t
Вопрос
Когда я пробую последний пример изPerlfaq5: как Do-i-in-number-of-in-файл? Я получаю ошибку. Что я должен сделать, чтобы сценарий работать?
#!/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.
Решение
2 -е издание ответа
А perldoc perlsec
Ручное описание режима Taint (есть также perldoc Taint
для модуля, связанного с режимом Deaint).
Частично это иллюстрирует:
$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 '(если у вас нет никаких пустых линий).
Я называю это «драконовским», потому что я не отключаю каждую переменную среды, частично.