Небезопасная $ env {env} во время работы с переключателем -t

StackOverflow https://stackoverflow.com/questions/4552197

  •  13-10-2019
  •  | 
  •  

Вопрос

Когда я пробую последний пример из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 '(если у вас нет никаких пустых линий).

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top