第 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' という回答が得られます (末尾の空白行がない場合)。
すべての環境変数を少しずつ設定解除したため、私はそれを「厳格」と呼んでいます。