关于Perl的污点模式

时间:2013-01-20 14:31:48

标签: perl security

我正在阅读本文档以了解Perl的污点模式=> http://www.webreference.com/programming/perl/taint/index.html

提到了一种清洁污染值的方法,

  

清除污点值的另一种更为模糊的方法是将它们用作a   散列键;因为哈希键本身从不被视为污染

我不太明白“将它们用作哈希键”是什么意思,以及为什么哈希键从未被视为污染。感谢是否有人可以提供帮助?

提前谢谢, 林

3 个答案:

答案 0 :(得分:8)

你真的不应该关注那句话。这意味着,如果你在污点模式下运行

my $fname = <>;
chomp $fname;
open my $fh, '>', $fname;

然后程序将因为您使用文件名的污染值而死亡。但是,如果您将该值存储为哈希键,就像这样

my $fname = <>;
chomp $fname;
my %data;
$data{$fname} = 1;
open my $fh, '>', $_ for keys %data;

然后代码运行正常。

这个原因与关于污点值的智慧无关,而是散列的键不是标量值,而只是存储在内部Perl哈希结构中的简单字符串。 Perl标量值 - 如标量变量或散列值或数组值 - 是更复杂的数据结构,包含有关值的状态和性质以及实际内容的信息,只有这些可以被标记为被污染。相反,散列键只是一串字符,它不能携带任何状态信息。

所以,正如我所说,除了意识到Perl的这个缺点之外,你应该忽略文档中的这个陈述。

答案 1 :(得分:6)

这似乎是避免污点检查的一种可疑方式。这是一件非常愚蠢的事情。在那里进行污点检查以确保您在脚本中没有做任何不安全的事情。在这种情况下,使用来自不安全来源的数据而不先验证它。

这是一个例子。 shebang中的-T开关是变成污点检查的原因。

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

chomp(my $foo = <>);
#my %a; $a{$foo} = 1;
#($foo) = keys %a;
open my $fh, ">", $foo or die "cant open $foo: $!";

此代码将死并产生错误:

  

在foo.pl第11行使用-T开关运行时打开时的不安全依赖关系,&lt;&gt;第1行。

如果注释行被取消注释,它将以我们放入的任意文本正常运行,没有任何不受重视。

如上所述,这是一个坏主意,因为它规避了安全措施。

答案 2 :(得分:1)

哈希键不是完整的标量结构,具有跟踪污点等事物的幕后魔法。哈希键是原始字符串。使用值作为哈希键会丢失Perl对标量所做的所有簿记。我在 Mastering Perl 的“安全编程技术”一章中谈到了这一点。