Pergunta

O meu roteiro original é a seguinte:

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

Este script funciona bem. Se eu adicione o seguinte linha ao script, ele não consegue trabalho:

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

O que uso Perl quando aberta tubo é chamado?

A adição de código a seguir corrigiu o problema:

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

Solução

A sua questão não é realmente relacionado com o modo de mácula. Você define

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

Esses diretórios normalmente não existe em uma máquina Windows. dir é um comando interno cmd.exe de modo a ser capaz de executar isso, você precisa adicionar o diretório onde ele reside, para o caminho.

Agora, nota que a maneira como você vai fazer sobre isso contradiz todo o ponto de definir o caminho para locais definitivos conhecidos. É definitivamente possível para um usuário nefasto para mudar esta variável de ambiente para apontar para sua versão perigosa de dir.

O fato de que o Windows não é necessariamente instalado em C:. \ Windows complica escrevendo um script mancha-safe no Windows se você confiar em qualquer um dos builtins shell

EDIT: Aqui está um pequeno programa de teste que você pode usar como uma linha de base:

#!/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

Basicamente, o que você precisa é para o administrador do sistema para codificar o caminho aceitável no momento da instalação e para os usuários não confiáveis ??não ter permissões de gravação no script.

Outras dicas

modo

Taint é complicado. Você realmente deve ler e entender perldoc perlsec . Seu problema é abordado na primeira frase do limpar o seu caminho seção.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top