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