我如何“解开”变量?

时间:2012-01-03 08:13:05

标签: perl cgi

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

2 个答案:

答案 0 :(得分:12)

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

  

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

不要忽略此警告:

  

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

Perlsec: Laundering and Detecting Tainted Data

答案 1 :(得分: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";
}