我写了我自己的小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;

最佳答案

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

您将需要更改相关的使用行以导入该功能:
use Taint::Runtime qw(taint_start taint is_tainted);
在示例Taint.pl脚本中,完成此操作后,is_tainted($data)的评估结果为true,is_tainted($noise)的评估结果为false,is_tainted($evil)的评估结果为true。

如果您有一个更复杂的表达式来检查污点,只需将其评估为标量,如果对该评估的任何输入都被污点,则该表达式以及标量也将被视作污点。检查标量是否被污染等同于检查表达式。如果表达式产生列表值,则类似join的东西将其很好地适合标量以检测污点。

关于perl - 如何检查当前的Perl语句是否包含污染数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34705088/

10-12 06:44