如何检查当前Perl语句是否包含受污染的数据?

如何检查当前Perl语句是否包含受污染的数据?,perl,expression,taint,Perl,Expression,Taint,我编写了自己的小Perl调试器,它为每个执行的行打印当前文件名和相应的行号。如何检测当前Perl语句是否包含受污染的数据 我知道模块Scalar::Util中有一个函数被“污染”。但是,它只接受变量名作为参数,而不接受Perl语句 我将污点附加到一个词法变量以跟踪它。 如果我能看到一个语句是否被污染,我只能打印那些包含被污染变量的行。 这是我的自定义污点脚本: Taint.pl use strict; use warnings; use Taint::Runtime qw(taint_st

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

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

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

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;
sub-DB::DB{
我的($package,$filename,$line)=调用者;
打印$filename.:“$line.”;
标量;
}
1.
如中所述,有一个子项称为
受污染
,如果传递受污染的值,该子项将返回true,否则返回false

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

使用污染::运行时qw(污染开始污染被污染);

在您的示例Taint.pl脚本中,一旦完成此操作,
被污染($data)
将计算为true,
被污染($noise)
将为false,
被污染($evil)
将为true


如果您有一个更复杂的表达式来检查污染,只需将其计算为一个标量,如果该计算的任何输入被污染,那么该表达式和标量也将被视为污染。检查标量是否受污染等同于检查表达式。如果表达式生成一个列表值,像join这样的东西将把它放入一个标量中,足以检测污染。

用eval()捕获异常?我发现了这段代码,它使用eval捕获异常,但我不知道如何向它传递Perl语句。本地$@;回来!eval{eval(“#”);你到底想测试什么,为什么不能使用变量?我的主要目标是逐步完成一个程序,只显示包含受污染数据的Perl语句。你应该在问题中添加这些信息。使用链接来完成此操作。