我如何"解开"变量?

Ani*_*nil 6 perl cgi

据我所知,一旦变量被污染,Perl将不允许在system(),exec(),管道打开,eval(),反引号命令或任何影响程序之外的东西的函数中使用它(例如unlink ).那么解开它的过程是什么?

Øyv*_*aar 12

在受污染的变量上使用正则表达式来提取"安全"值:

有时您只需要清除数据的污点.通过将它们用作散列中的键,可能无法使用值; 否则绕过污点机制的唯一方法是从正则表达式匹配引用子模式.Perl假设如果你使用$ 1,$ 2等引用子字符串,那么你就知道在编写模式时你在做什么.

不要忽略此警告:

这意味着使用一点思考 - 不要盲目地解开任何事情,或者你打败整个机制.最好验证变量只有好字符(对于某些"好"值),而不是检查它是否有任何坏字符.那是因为很容易错过你从未想过的坏人物.

Perlsec:洗涤和检测污染数据


Zai*_*aid 6

use Untaint:

描述

该模块用于清洗因使用-T开关处于污点模式而受污染的数据.这可以用于CGI脚本以及命令行脚本.该模块将取消标记标量,数组和散列.在清洗数组时,只会清洗被污染的数组元素.

概要

use Untaint;

my $pattern = qr(^k\w+);

my $foo = $ARGV[0];

# Untaint a scalar
if (is_tainted($foo)) {
        print "\$foo is tainted. Attempting to launder\n";
        $foo = untaint($pattern, $foo);
}else{
        print "\$foo is not tainted!!\n";
}
Run Code Online (Sandbox Code Playgroud)