Как отменить системный вызов в CGI.pm - PullRequest
5 голосов
/ 22 ноября 2011

У меня есть следующий 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 ]

8 голосов
/ 22 ноября 2011

Весь смысл заражения состоит в том, чтобы гарантировать, что непроверенный ввод не может быть передан потенциально небезопасным функциям.

В этом случае ваша переменная $searchterm может содержать неожиданный ввод, который может позволить злоумышленнику выполнить произвольные программы в вашей системе.

Следовательно, вам либо нужно:

  1. untaint переменная, гарантируя, что она соответствует предопределенному регулярному выражению (см. Ответ @ flesk), и в этот момент Perl предполагает, что вы знаете, что делаете, или

  2. не используйте обратные галочки (за ответ @eugene y).

Если вы используете обратные метки, вам также следует указать полный путь к команде grep, чтобы не зависеть от $PATH.

5 голосов
/ 22 ноября 2011

Используйте встроенную функцию grep, например:

open my $fh, '<', $file or die $!;    
my @entries = grep /$searchterm/i, <$fh>;
3 голосов
/ 22 ноября 2011

Я думаю, что проблема здесь в том, что оператор backtick эффективно выполняет код вне среды perl, и поэтому совершенно справедливо не является доверенным, т.е.tainted.

Конечно, вы можете попробовать сделать что-то вроде этого перед ошибочной строкой:

$ENV{"PATH"} = "";

Возможно, вы все равно получите сообщение об ошибке:

my $file = "justafile.txt";

Чтобы исправить это, вы, вероятно, могли бы просто дать ему абсолютный путь, например:

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

Вам почти наверняка придется указать абсолютный путь к команде grep, которую вы выполняете с помощью оператора backtick., так как очистка переменных окружения потеряет путь.Другими словами:

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

Вы также можете скопировать значение $ENV, прежде чем очистить его, на тот случай, если оно понадобится вам позже ...

Надеюсь, что некоторые изэто помогает!

3 голосов
/ 22 ноября 2011

Переключатель -T только предупреждает вас о возможном повреждении ввода: http://perldoc.perl.org/perlsec.html#Taint-mode

Вы должны отключить его самостоятельно, например, используя

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

Хотя это не очень сложный тест и, возможно, не слишком безопасный, если только вы не полностью контролируете, что \w соответствует.

РЕДАКТИРОВАТЬ: Изменено мое минимальное решение для отражения информации, приведенной в комментариях ниже.

...