1

私の元のスクリプトは次のとおりです。

my $cmd = "dir";
open (H, "$cmd |");
my @result = <H>;
close (H);
print STDERR @result,"\n";

このスクリプトは正常に動作します。スクリプトに次の行を追加すると、機能しません。

$ENV{"LD_LIBRARY_PATH"} = "/opt/VRTSsfmh/lib";
$ENV{PATH}="/usr/bin:/bin:/sbin:/usr/sbin";
delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};

パイプオープンが呼び出されたときにPerlは何を使用しますか?

次のコードを追加すると、問題が修正されました。

if ($^O =~ /Win32/i) 
{
    $ENV{'SystemRoot'} =~ /([A-Z]:(\\[A-Za-z0-9_]+)+)/;
    my $system32_dir = $1."\\system32";
    $ENV{'PATH'} = $system32_dir;
}
4

2 に答える 2

7

あなたの質問は汚染モードとは関係ありません。あなたが設定した

$ENV{PATH}="/usr/bin:/bin:/sbin:/usr/sbin";

これらのディレクトリは通常、Windows マシンには存在しません。dirは cmd.exe の内部コマンドであるため、これを実行できるようにするには、それが存在するディレクトリをパスに追加する必要があります。

さて、あなたがそれを行う方法は、パスを既知の明確な場所に設定するという全体のポイントと矛盾することに注意してください. 悪意のあるユーザーが、この環境変数を変更して危険なバージョンの を指すようにすることは間違いなく可能ですdir

Windows が必ずしも C:\Windows にインストールされているとは限らないという事実は、シェルのビルトインのいずれかに依存している場合、Windows で汚染防止スクリプトを作成することを複雑にします。

編集:ベースラインとして使用できる短いテスト プログラムを次に示します。

#!/usr/bin/perl -T

use strict;
use warnings;

$ENV{PATH} = join(';', qw(C:\Windows C:\Windows\System32) );
delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};

open my $pipe_h, '-|', 'dir'
    or die "Cannot open pipe to dir: $!";

print while <$pipe_h>;

close $pipe_h
    or die "Cannot close pipe to dir: $!";

__END__

C:\Temp> perl -T v.pl

...

2009/05/25  08:58 AM             3,584 zzz.exe
              64 File(s)     32,125,365 bytes
              14 Dir(s)  39,251,894,272 bytes free

基本的に、必要なのは、システム管理者がインストール時に受け入れ可能なパスをハードコーディングすることと、信頼できないユーザーがスクリプトへの書き込み権限を持たないようにすることです。

于 2009-06-08T11:42:42.013 に答える
0

汚染モードは複雑です。あなたは本当に読んで理解する必要がありますperldoc perlsec。問題は、「パスのクリーンアップ」セクションの最初の文で対処されています。

于 2009-06-08T13:44:50.440 に答える