Perl 将受污染的值用作散列键来清除它们意味着什么?

Perl 将受污染的值用作散列键来清除它们意味着什么?,perl,security,Perl,Security,我阅读本文档是为了学习Perl的污染模式=> 这是清洁污染价值的一种方式 另一种更模糊的清除受污染值的方法是将它们用作 散列密钥;因为散列键本身从未被认为是受污染的 我不太明白使用它们作为散列键是什么意思,以及为什么散列键从未被视为受污染的。如果有人能帮忙,我会很感激的 提前感谢,, 林你真的不应该注意那句话。这意味着,如果你在污染模式下运行 my $fname = <>; chomp $fname; open my $fh, '>', $fname; 然后程序将死亡,因为您

我阅读本文档是为了学习Perl的污染模式=>

这是清洁污染价值的一种方式

另一种更模糊的清除受污染值的方法是将它们用作 散列密钥;因为散列键本身从未被认为是受污染的

我不太明白使用它们作为散列键是什么意思,以及为什么散列键从未被视为受污染的。如果有人能帮忙,我会很感激的

提前感谢,,

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

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的这个缺点之外,您应该忽略文档中的这条语句。

您真的不应该注意这条语句。这意味着,如果你在污染模式下运行

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的这个缺点之外,您还应该忽略文档中的这个语句。

这似乎是一种规避污染检查的可疑方法。这是一件非常愚蠢的事情。污染检查是为了确保你在脚本中没有做任何不安全的事情。在这种情况下,使用来自不安全源的数据而不首先对其进行验证

这里有一个例子。这里的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开关运行时,open中存在不安全的依赖项

如果注释行未注释,则它将正常运行,并使用我们在其中输入的任意文本,而无需任何卸载


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

这似乎是一种规避污染检查的可疑方法。这是一件非常愚蠢的事情。污染检查是为了确保你在脚本中没有做任何不安全的事情。在这种情况下,使用来自不安全源的数据而不首先对其进行验证

这里有一个例子。这里的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开关运行时,open中存在不安全的依赖项

如果注释行未注释,则它将正常运行,并使用我们在其中输入的任意文本,而无需任何卸载


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

散列键不是完全标量结构,它具有跟踪诸如污染之类事物的幕后魔力。散列键是原始字符串。使用值作为散列键会丢失Perl对标量所做的所有簿记。我在《掌握Perl》中的安全编程技术一章中详细讨论了这一点。

散列键不是完全标量结构,它具有跟踪污染等事件的幕后魔法。散列键是原始字符串。使用值作为散列键会丢失Perl对标量所做的所有簿记。我在Perl的安全编程技巧章节中谈到了这一点。

你知道哈希是什么吗?你应该把它看成是一个警告,而不是关于如何清除被污染的值的建议。你知道哈希是什么吗?你应该把它看成是一个警告,而不是关于如何清除被污染的建议。value.or$foo=each%{{{$foo=>1}@ysth是的,可以缩短代码并跳过转换变量,但可能无法清楚地说明示例

呃在这种情况下,并不是说它很傻。这是你必须小心的事情,以防你不小心做了。@briandfoy,你是认真的吗?你是否因为你认为这句话是一个警告而不是一个建议而对我的回答投了反对票?我的回答有什么不有用的地方吗?我投你的反对票,因为你散布了一个谎言,说污染检查是为了确保你在脚本中没有做任何不安全的事情。如果您试图将未受污染的外部数据传递给外部进程,则污点检查所做的唯一事情就是停止您的程序。此外,卸载数据并不能使其安全。或者$foo=each%{{{$foo=>1}@是的,可以缩短代码并跳过转换变量,但在本例中,这并不能使示例更清晰。这并不是说这很愚蠢。这是你必须小心的事情,以防你不小心做了。@briandfoy,你是认真的吗?你是否因为你认为这句话是一个警告而不是一个建议而对我的回答投了反对票?我的回答有什么不有用的地方吗?我投你的反对票,因为你散布了一个谎言,说污染检查是为了确保你在脚本中没有做任何不安全的事情。如果您试图将未受污染的外部数据传递给外部进程,则污点检查所做的唯一事情就是停止您的程序。此外,清除数据并不能使其安全。为什么要忽略该语句?说这话真是太蠢了。每个人都应该意识到,污染检查是一种开发工具,而不是一个安全网。有很多事情它不能或不会为你做。@briandfoy,因为这句话听起来像是一个建议?这是一个可怕的建议,每个人都应该忽视?当你在上下文中阅读它时,听起来并没有那么糟糕,但在stackoverflow.com上它是独立的,并且提供的链接可能并不总是为那些愿意点击链接了解更多信息的少数人提供上下文。嗨,Borodin,谢谢你的详细回复。我的困惑是,如果输入字符串用作哈希表的键,黑客可以输入任意键来获得任意映射的哈希值。例如,如果我们使用哈希表存储用户ID到密码的映射关系。在法律案件中,他应该只输入他的ID来获取密码,但如果他输入管理员的用户ID,他就可以获取管理员的密码。所以,我认为即使对散列键使用外部输入值,它也不安全,应该被视为受污染的值?有什么评论吗?@briandfoy:另一个。。。清除受污染价值观的方法是一个可怕的措辞选择。不幸的是,Perl无法在哈希键上维护污点检查,在这方面必须小心。@LinMa:你说得很对。Perl不会解开散列键,因为这是一个好主意,它这样做是因为没有可行的方法来做其他事情。这意味着,如果使用受污染的数据作为散列键,则必须特别小心,并记住,在这种情况下,Perl的污染检查不会警告您?说这话真是太蠢了。每个人都应该意识到,污染检查是一种开发工具,而不是一个安全网。有很多事情它不能或不会为你做。@briandfoy,因为这句话听起来像是一个建议?这是一个可怕的建议,每个人都应该忽视?当你在上下文中阅读它时,听起来并没有那么糟糕,但在stackoverflow.com上它是独立的,并且提供的链接可能并不总是为那些愿意点击链接了解更多信息的少数人提供上下文。嗨,Borodin,谢谢你的详细回复。我的困惑是,如果输入字符串用作哈希表的键,黑客可以输入任意键来获得任意映射的哈希值。例如,如果我们使用哈希表存储用户ID到密码的映射关系。在法律案件中,他应该只输入他的ID来获取密码,但如果他输入管理员的用户ID,他就可以获取管理员的密码。所以,我认为即使对散列键使用外部输入值,它也不安全,应该被视为受污染的值?有什么评论吗?@briandfoy:另一个。。。清除受污染价值观的方法是一个可怕的措辞选择。不幸的是,Perl无法在哈希键上维护污点检查,在这方面必须小心。@LinMa:你说得很对。Perl不会解开散列键,因为这是一个好主意,它这样做是因为没有可行的方法来做其他事情。这意味着,如果您使用受污染的数据作为散列键,您必须特别小心,并且请记住,在这种情况下,Perl的污染检查不会警告您。我的困惑是,如果输入字符串用作哈希表的键,黑客可以输入任意键来获得任意映射的哈希值。例如,如果我们使用哈希表存储用户ID到密码的映射关系。在法律案件中,他只需输入身份证即可获得通行证
word,但如果他输入管理员的用户ID,他可以得到管理员的密码。所以,我认为即使对散列键使用外部输入值,它也不安全,应该被视为受污染的值?有什么意见吗?基于我所说的原因,taint不能处理这个问题。嗨,Brian,谢谢你的详细回复。我的困惑是,如果输入字符串用作哈希表的键,黑客可以输入任意键来获得任意映射的哈希值。例如,如果我们使用哈希表存储用户ID到密码的映射关系。在法律案件中,他应该只输入他的ID来获取密码,但如果他输入管理员的用户ID,他就可以获取管理员的密码。所以,我认为即使对散列键使用外部输入值,它也不安全,应该被视为受污染的值?有什么意见吗?基于我说的原因,污点不能处理这个问题。