我有以下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行?
污染的全部意义在于确保未检查的输入不能提供给可能不安全的函数。
在这种情况下,您的$searchterm
变量可能包含意外的输入,这可能允许攻击者在您的系统上执行任意程序。
因此,您需要:
-
un污染变量,确保它匹配预先确定的regexp(参见@flesk的回答),此时Perl假定您知道自己在做什么,或者
-
不要使用反引号(根据@eugene y的回答)。
如果你使用反引号,你还应该指定grep
命令的完整路径,这样你就不依赖于$PATH
了。
使用内置的grep
功能,例如:
open my $fh, '<', $file or die $!;
my @entries = grep /$searchterm/i, <$fh>;
我认为这里的问题是,反划操作符是有效地执行代码以外的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
之前复制它的值,以防你以后需要它…
希望能有所帮助!
-T
开关仅警告您可能受污染的输入:http://perldoc.perl.org/perlsec.html#Taint-mode
您需要自己清除它,例如使用
my $safe_searchterm = "";
$safe_searchterm .= $_ for $searchterm =~ /w+/g;
这不是一个非常复杂的测试,可能也不太安全,除非你完全控制w
匹配的内容。
EDIT:更改了我的最小解决方案,以反映下面评论中给出的信息