【问题标题】:Insecure $ENV{ENV} while running with -T switch使用 -T 开关运行时不安全的 $ENV{ENV}
【发布时间】:2011-05-31 22:23:33
【问题描述】:

当我尝试最后一个示例时 perlfaq5: How-do-I-count-the-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.

【问题讨论】:

  • 好问题。但是顺便说一句,即使wc -l 可能是大文件中最快的,尝试使用这样的正则表达式获取文件名将在包含异常字符的文件名上失败(如果您放松正则表达式,则需要添加引用 shell 命令,你永远无法确定你引用的所有内容都完全正确......)
  • 是否有其他方法可以清除文件名?
  • Mastering Perl 中的安全章节汇集了您需要了解的有关污染的所有信息。

标签: perl path taint wc env


【解决方案1】:

第二版答案

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”。这远没有答案的第一版那么严厉。

答案第一版

这个严厉的解决方案“有效”:

#!/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”(如果您没有任何尾随空行)。

我将其称为“严苛”,因为我已逐步取消设置每个环境变量。

【讨论】:

  • 我想您没有尝试使用 "#!/usr/bin/env perl -T" Shebang 的示例。
  • foreach my $env (keys %ENV) { undef $ENV{$env}; } 为什么是undef 而不是delete?为什么不用local %ENV = (); 在一条指令中清空哈希? ↑ 上面的 sid_com ↑ 暗示env perl -T 不起作用。改善这一切。
  • @daxim:因为是Perl,TMTOWTDI,而且已经深夜了。
猜你喜欢
  • 2016-06-16
  • 2020-04-20
  • 2018-02-20
  • 1970-01-01
  • 2019-02-10
  • 2022-10-21
  • 1970-01-01
  • 2020-09-22
相关资源
最近更新 更多