【问题标题】:How to check if current Perl statement contains tainted data?如何检查当前的 Perl 语句是否包含受污染的数据?
【发布时间】:2016-01-10 11:58:34
【问题描述】:

我编写了自己的小 Perl 调试器,它打印每个执行的行、当前文件名和相应的行号。如何检测当前 Perl 语句是否包含污染数据?

我知道模块 Scalar::Util 中有一个“被污染”的函数。但是它只接受变量名作为参数,而不接受 Perl 语句。

我已将 Taint 附加到一个词法变量以跟踪它。 如果我能够看到一个语句是否被污染,我只能打印那些包含我被污染的变量的行。 这是我的自定义污点脚本:

Taint.pl

use strict; 
use warnings; 

use Taint::Runtime qw(taint_start taint); 
taint_start(); 

my $data = taint("abc"); --> interesting 
my $noise = "noise"; --> not interesting 
my $evil = $data . " evil"; --> interesting

Debugger.pl

sub DB::DB{

    my($package, $filename, $line) = caller;

    print $filename . ":" . $line . " ";
    scalar <STDIN>;

}

1;

【问题讨论】:

  • 用 eval() 捕获异常?
  • 我找到了这段代码,它使用 eval 来捕获异常,但我不知道如何将 Perl 语句传递给它。本地 $@;返回 ! eval { eval("#" .substr(join("", @_), 0, 0)); 1 };
  • 您到底想测试什么,为什么不能在其中使用变量?
  • 我的主要目标是单步执行一个程序,并且只显示包含污染数据的 Perl 语句。
  • 您应该将该信息添加到您的问题中。使用edit 链接来做到这一点。

标签: perl expression taint


【解决方案1】:

POD Documentation for Taint::Runtime 中所述,有一个名为is_tainted 的子程序,如果您传递一个受污染的值,它将返回true,否则返回false。

您需要更改相关的使用行以导入该功能:

use Taint::Runtime qw(taint_start taint is_tainted);

在您的示例 Taint.pl 脚本中,一旦完成,is_tainted($data) 的计算结果为真,is_tainted($noise) 为假,is_tainted($evil) 为真。

如果您有一个更复杂的表达式来检查污染,只需将其评估为标量,如果该评估的任何输入被污染,则表达式和标量也将被视为污染。检查该标量是否被污染等同于检查表达式。如果表达式产生一个列表值,像 join 之类的东西会将它放入一个足以检测污染的标量。

【讨论】:

    猜你喜欢
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    • 2014-04-29
    • 1970-01-01
    • 2016-01-24
    • 1970-01-01
    • 2018-02-18
    相关资源
    最近更新 更多