-t switchで実行中に、不安定な$ env {env}
質問
から最後の例を試してみるときPerlfaq5:どのようにdo-i-count-theNumber-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.
解決
回答の第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版
このDraconianソリューション「機能」:
#!/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 '(後続の空白線がない場合)を生成します。
私はそれを「ドラコニアン」と呼んでいます。なぜなら、私はすべての環境変数を断片的に解き放つからです。
所属していません StackOverflow