3

perlfaq5の最後の例を試してみると : How-do-I-count-the-number-of-number-of-lines-in-a-file? エラーメッセージが表示されます。スクリプトを機能させるにはどうすればよいですか?

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

1 に答える 1

5

第 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' という回答が得られます (末尾の空白行がない場合)。

すべての環境変数を少しずつ設定解除したため、私はそれを「厳格」と呼んでいます。

于 2010-12-29T07:35:51.403 に答える