perl - 使用 -T 开关运行时 $ENV{ENV} 不安全

标签 perl path taint wc env

当我尝试最后一个例子时 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.

最佳答案

答案第二版

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”(如果没有任何尾随空白行) .

我称其为“严厉”,因为我已经逐步取消了每个环境变量的设置。

关于perl - 使用 -T 开关运行时 $ENV{ENV} 不安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4552197/

相关文章:

c++ - 如何不丢弃 CDC 路径?

regex - 什么是清除绝对路径的好 Perl 正则表达式?

perl - 删除有或没有删除的祝福散列成员

perl - Perl 的污点模式有用吗?

bash - 找不到 Tesseract unicharset_extractor 命令

windows - NPM Windows 路径问题

正则表达式 $1 变量重置

perl - 如何确保数据库(Postgres)连接在准备和执行之间仍然有效?

perl - 如何在 ExtUtils::MakeMaker Makefile.PL 中指定测试先决条件

perl - 超时后如何终止 Perl 系统调用?