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

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

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

使用Taint :: Runtime qw(taint_start taint is_tainted);

在你的示例Taint.pl脚本中,一旦完成,is_tainted($data)将评估为true,is_tainted($noise)将为false,is_tainted($evil)将为true.

如果您有一个更复杂的表达式来检查污点,只需将其评估为标量,如果该评估的任何输入被污染,表达式和标量也将被视为污染.检查标量是否被污染等同于检查表达式.如果表达式产生一个列表值,那么像join这样的东西会使它适合一个足以检测污点的标量.

相关文章

1. 如何去重 #!/usr/bin/perl use strict; my %hash; while(...
最近写了一个perl脚本,实现的功能是将表格中其中两列的数据...
表的数据字典格式如下:如果手动写MySQL建表语句,确认麻烦,...
巡检类工作经常会出具日报,最近在原有日报的基础上又新增了...
在实际生产环境中,常常需要从后台日志中截取报文,报文的形...
最近写的一个perl程序,通过关键词匹配统计其出现的频率,让...