5

我有以下 CGI 脚本:

#!/usr/bin/perl -T
use strict;
use warnings;
use CGI::Carp qw(fatalsToBrowser);
use CGI qw/:standard/;
my $query = CGI->new();
my $searchterm = param('name');

my $file = "justafile.txt";
# Begin searching terms and ignoring case
my @entries = `grep -i \"$searchterm\" $file`; # Line10
chomp @entries;
# Do something

当我执行命令时,它给了我这个

Insecure dependency in `` while running with -T switch at /foo/cgi-bin/mycode.cgi line 10.

如何修复第 10 行?

4

4 回答 4

8

污染的全部意义在于确保无法将未经检查的输入提供给潜在的不安全功能。

在这种情况下,您的$searchterm变量可能包含可能允许攻击者在您的系统上执行任意程序的意外输入。

因此,您要么需要:

  1. 通过确保它与预先确定的正则表达式匹配(参见@flesk的答案)来消除变量的污染,此时 Perl 假定您知道自己在做什么,或者

  2. 不要使用反引号(根据@eugene y 的回答)。

如果您使用反引号,您还应该指定grep命令的完整路径,这样您就不会依赖$PATH.

于 2011-11-22T13:56:47.707 回答
5

使用内置grep函数,例如:

open my $fh, '<', $file or die $!;    
my @entries = grep /$searchterm/i, <$fh>;
于 2011-11-22T13:48:45.327 回答
3

-T开关仅警告您可能的污染输入: http: //perldoc.perl.org/perlsec.html#Taint-mode

您需要自己清除它,例如使用

my $safe_searchterm = "";
$safe_searchterm .= $_ for $searchterm =~ /\w+/g;

不过,这不是一个非常复杂的测试,也可能不太安全,除非您完全控制\w匹配的内容。

编辑:更改了我的最小解决方案以反映下面评论中给出的信息。

于 2011-11-22T13:52:45.987 回答
3

我认为这里的问题是反引号运算符在 perl 环境之外有效地执行代码,因此不被信任是完全正确的,即。污染。

当然,您可以尝试在违规行之前执行以下操作:

$ENV{"PATH"} = "";

您可能仍会从该行收到错误消息:

my $file = "justafile.txt";

要解决这个问题,您可能只需给它一个绝对路径,例如:

my $file = "/home/blah/justafile.txt";

您几乎肯定必须为您正在使用反引号运算符执行的 grep 命令提供绝对路径,因为清除环境变量会丢失路径。换句话说:

# Begin searching terms and ignoring case
my @entries = `/bin/grep -i \"$searchterm\" $file`; # Line10

您可能还想$ENV在清除它之前复制它的值,以防以后需要它......

希望有些帮助!

于 2011-11-22T13:56:18.803 回答