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 に答える