perl 污染模式:不安全的依赖

perl 污染模式:不安全的依赖

ERROR: Insecure dependency in `` while running with -T switch at

我正在从 perl 脚本执行 bash 脚本。

my $date_tmp="31-DEC-2016";
my $new  = `/bin/sh ./compareDate.sh "$date_tmp"`;

我将捕获变量中的输出$newperl在污点模式打开时如何完成此操作?

答案1

佩尔塞克:

   ...otherwise the only way to bypass the
   tainting mechanism is by referencing subpatterns from a regular
   expression match.  Perl presumes that if you reference a substring
   using $1, $2, etc., that you knew what you were doing when you wrote
   the pattern.

因此,假设您需要从外部脚本获取数据并对其进行操作,您需要验证所获取的数据。我会冒险建议您compareDate.sh返回给定日期和今天之间的天数。如同:

$ /bin/sh ./compareDate.sh "$date_tmp"
42

然后可以这样清理:

my $new  = `/bin/sh ./compareDate.sh "$date_tmp"`;    # TAINTED
if ($new =~ /^(\d+)$/) {
  $new = $1;                                          # Not tainted
} else {
  die "Unexpected output from compareDate.sh!\n";
}

代码并没有简单地清除变量(尽管我们的检查过于宽松,这是可能的),它验证了它是否具有预期的内容。如果有人弄乱了它,使它包含:

$ /bin/sh ./compareDate.sh "$date_tmp"
42; /bin/rm -rf *;

那么验证就会失败。只有数字才能打通,我们不希望它们给我们带来任何麻烦。显然,更复杂的输出可能需要更多验证。


当我写上面的内容时,我主要查看代码,并且$date_tmp从代码中分配了一个文字字符串,并且必须是未受污染的。但正如乔丹指出的那样,错误消息告诉我们反引号执行根本没有发生。问题并不是 shell 的输出,而是一些早期的污点阻止了它的运行。

反引号中的唯一变量是$date_tmp,因此在反引号中的赋值和使用之间需要对其进行类似的验证。

相关内容