2

我正在尝试使用污点模式。我想根据用户输入打开一个文件并打开一个文件来读取数据。下面是我的代码

#!/usr/bin/perl -w
use strict;
use warnings;

my $name = $ARGV[0];
my $file = "/Desktop/data/$name";

open MYFILE, "$file" or die $!;


while (<MYFILE>) {
    chomp;
    print "$_\n";
}
close(MYFILE);

案例 1)当我使用 perl -w filename.pl input.txt 运行文件时,我能够从文件中读取数据。

案例2)当我改变

#!/usr/bin/perl -w
to
#!/usr/bin/perl -T

并使用 perl -T filename.pl input.txt 运行文件我仍然能够读取数据。

案例3)当我将文件更改为以写入模式打开并以污染模式运行时,我得到正确的输出,

Insecure dependency in open while running with -t switch at test1.pl line 8.

案例两种情况可能有什么问题?或者这是一个正确的行为?

是否允许以污点模式打开文件进行读取?

4

2 回答 2

4

这是污点模式的正确行为。该文档指定:

你不能使用从你的程序外部获得的数据来影响你的程序之外的其他东西——至少,不是偶然的。

[...]

$arg = shift; # $arg is tainted

[...]

如果你尝试做一些不安全的事情,你会得到一个致命的错误,比如“不安全的依赖”或“不安全的 $ENV{PATH}”。

(编辑:错过了一些东西):

受污染的数据不得直接或间接用于任何调用子 shell 的命令,也不得用于任何修改文件、目录或进程的命令,但以下情况除外:

  • 不检查 print 和 syswrite 的参数是否有污染。

(这就是读取模式示例不抱怨文件数据的原因。)

命令行参数可能不安全,因此除非另有说明,否则会受到污染。

要确定数据是否被污染:

要测试变量是否包含受污染的数据,以及其使用是否会触发“不安全依赖”消息,您可以使用 Scalar::Util 模块的 tainted() 函数,该模块在您附近的 CPAN 镜像中可用,并包含在 Perl 开始从 5.8.0 版开始。

清除数据:

[...]绕过污染机制的唯一方法是从正则表达式匹配中引用子模式。Perl 假定如果您使用$1,$2等引用子字符串,那么您在编写模式时就知道自己在做什么。这意味着要花点心思——不要盲目地清除任何东西,否则你会破坏整个机制。最好验证变量是否只有好字符(对于某些“好”值),而不是检查它是否有坏字符。那是因为很容易错过你从未想过的坏角色。

(带有警告use locale):

如果您正在编写一个区域设置感知程序,并且想要使用包含 的正则表达式清洗数据,请在同一块中的表达式前面\w放置。有关进一步的讨论和示例,no locale请参阅perllocale 中的 SECURITY 。

于 2013-04-21T23:14:08.760 回答
2

这可以防止以下内容清除您的硬盘驱动器:

perl script.pl '| rm -rf /'

解决方案:使用open只接受文件名的形式。

open(my $fh, '<', $ARGV[0])
于 2013-04-22T00:07:14.463 回答