2

私は汚染モードを使用しようとしています。ユーザー入力に基づいてファイルを開き、ファイルを開いてデータを読み取りたい。以下は私のコードです

#!/usr/bin/perl -w
use strict;
use warnings;

my $name = $ARGV[0];
my $file = "/Desktop/data/$name";

open MYFILE, "$file" or die $!;


while (<MYFILE>) {
    chomp;
    print "$_\n";
}
close(MYFILE);

ケース 1) perl -w filename.pl input.txt を使用してファイルを実行すると、ファイルからデータを読み取ることができます。

ケース 2)

#!/usr/bin/perl -w
to
#!/usr/bin/perl -T

perl -T filename.pl input.txt を使用してファイルを実行します。まだデータを読み取ることができます。

ケース3)書き込みモードで開くようにファイルを変更し、汚染されたモードで実行すると、次のように正しい出力が得られます。

Insecure dependency in open while running with -t switch at test1.pl line 8.

ケース 2 のシナリオで何が問題になる可能性がありますか? それともそれは正しい行動ですか?

ファイルを読み取り用に汚染モードで開くことは許可されていますか?

4

2 に答える 2

4

これは汚染モードの正しい動作です。ドキュメントでは次のように指定されています。

プログラムの外部から派生したデータを使用して、プログラムの外部に影響を与えることはできません。少なくとも偶然ではありません。

[...]

$arg = shift; # $arg is tainted

[...]

安全でないことをしようとすると、「安全でない依存関係」や「安全でない $ENV{PATH}」などの致命的なエラーが発生します。

(編集:いくつかのものを逃した):

汚染されたデータは、次の例外を除いて、サブシェルを呼び出すコマンドでも、ファイル、ディレクトリ、またはプロセスを変更するコマンドでも、直接的または間接的に使用することはできません。

  • print および syswrite への引数は、汚染されているかどうかチェックされません。

(これが、読み取りモードの例がファイル データについて文句を言わない理由です。)

コマンドライン引数は安全でない可能性があるため、別の方法で指定されるまで汚染されます。

データが汚染されているかどうかを判断するには:

変数に汚染されたデータが含まれていて、その使用が「安全でない依存関係」メッセージをトリガーするかどうかをテストするには、Scalar::Util モジュールの tainted() 関数を使用できます。これは、近くの CPAN ミラーで利用でき、Perl の起動に含まれています。リリース 5.8.0 から。

データの汚染を除去するには:

[...]汚染メカニズムを回避する唯一の方法は、正規表現の一致からサブパターンを参照することです。Perl は$1$2、 などを使用して部分文字列を参照する場合、パターンを書いたときに何をしていたかを知っていると想定します。それは、少し考えることを意味します - やみくもに何かを untained しないでください。そうしないと、メカニズム全体を無効にします。変数に悪い文字が含まれているかどうかを確認するよりも、変数に適切な文字のみが含まれていることを確認することをお勧めします (「良い」という特定の値について)。それは、思いもよらなかった悪いキャラクターを見逃すのがあまりにも簡単だからです.

( の警告付きuse locale):

ロケール対応プログラムを作成していて、 を含む正規表現でデータをロンダリングしたい場合は、同じブロック内の式の前に\w置きます。さらなる議論と例については、perllocale の SECURITY をno locale参照してください。

于 2013-04-21T23:14:08.760 に答える