1

我正在阅读这篇文档来学习 Perl 的污点模式 => http://www.webreference.com/programming/perl/taint/index.html

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

清理受污染值的另一种更晦涩的方法是将它们用作哈希键。因为哈希键本身永远不会被认为是被污染的

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

提前谢谢, 林

4

3 回答 3

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 的这个缺点之外,你应该忽略文档中的这个声明。

于 2013-01-20T15:03:14.693 回答
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 行,<> 第 1 行使用 -T 开关运行时打开的不安全依赖项。

如果注释行未注释,它将正常运行,无论我们在其中放置什么任意文本,都不会受到任何污染。

如前所述,这是一个坏主意,因为它绕过了安全措施。

于 2013-01-20T15:11:43.810 回答
1

Hash keys aren't full scalar structures that have the behind-the-scenes magic that tracks things such as taint. A hash key is raw string. Using a value as a hash key loses all the bookkeeping that Perl does with scalars. I talk about this quite a bit in the "Secure Programming Techniques" chapter in Mastering Perl.

于 2013-01-21T15:43:24.947 回答