我编写了自己的小型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的东西会很好地将其放入标量中,以检测污点。