Perl의 테인트 모드에서 파이프를 열지 않는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/964426

  •  12-09-2019
  •  | 
  •  

문제

내 원본 스크립트는 다음과 같습니다.

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;
}
도움이 되었습니까?

해결책

귀하의 질문은 실제로 오염 모드와 관련이 없습니다. 당신은 설정했습니다

$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

기본적으로, 필요한 것은 시스템 관리자가 설치 시간에 허용 가능한 경로를 하드 코드하고 신뢰할 수없는 사용자가 스크립트에 쓰기 권한을 가지지 않도록하는 것입니다.

다른 팁

오염 모드는 복잡합니다. 당신은 정말로 읽고 이해해야합니다 perldoc perlsec. 귀하의 문제는 길을 청소합니다 부분.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top