Небезопасный $ ENV {ENV} при работе с ключом -T - PullRequest
3 голосов
/ 29 декабря 2010

Когда я пытаюсь выполнить последний пример из perlfaq5: «Как мне рассчитать количество строк в файле?» Я получаю сообщение об ошибке.Что я должен сделать, чтобы скрипт работал?

#!/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.

1 Ответ

5 голосов
/ 29 декабря 2010

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» (если у вас нет завершающих пустых строк).

Я называю это «драконовским», потому что я не установилкаждая переменная среды, по частям.

...