Sil*_*nce 7 perl expression taint
我编写了自己的小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
Run Code Online (Sandbox Code Playgroud)
Debugger.pl
sub DB::DB{
my($package, $filename, $line) = caller;
print $filename . ":" . $line . " ";
scalar <STDIN>;
}
1;
Run Code Online (Sandbox Code Playgroud)
正如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 之类的东西会将其很好地拟合到标量中以检测污点。