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



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

调试器.pl

sub DB::DB{
    my($package, $filename, $line) = caller;
    print $filename . ":" . $line . " ";
    scalar <STDIN>;
}
1;

如Taint::Runtime的POD文档中所述,有一个名为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的东西会很好地将其放入标量中,以检测污点。

相关内容

  • 没有找到相关文章

最新更新