Warum nicht ein Rohr offene Arbeit unter Perl Taint-Modus?
Frage
Meine ursprüngliche Skript ist wie folgt:
my $cmd = "dir";
open (H, "$cmd |");
my @result = <H>;
close (H);
print STDERR @result,"\n";
Diese Skripte funktioniert gut. Wenn ich an den Skript add folgende Zeile, nicht daran arbeiten:
$ENV{"LD_LIBRARY_PATH"} = "/opt/VRTSsfmh/lib";
$ENV{PATH}="/usr/bin:/bin:/sbin:/usr/sbin";
delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};
Was ist Perl verwenden, wenn Rohr offen genannt wird?
Die Zugabe von folgendem Code das Problem behoben:
if ($^O =~ /Win32/i)
{
$ENV{'SystemRoot'} =~ /([A-Z]:(\\[A-Za-z0-9_]+)+)/;
my $system32_dir = $1."\\system32";
$ENV{'PATH'} = $system32_dir;
}
Lösung
Ihre Frage ist nicht wirklich besudeln Modus verwendet. Sie
$ENV{PATH}="/usr/bin:/bin:/sbin:/usr/sbin";
Diese Verzeichnisse nicht existieren normalerweise auf einem Windows-Rechner. dir
ist ein cmd.exe interner Befehl so in der Lage sein, dass auszuführen, müssen Sie das Verzeichnis hinzuzufügen, wo es auf den Pfad befindet.
Nun beachten Sie, dass die Art und Weise Sie gehen tun es den ganzen Punkt widerspricht dem Weg zu bekannten bestimmten Orten zu setzen. Es ist auf jeden Fall möglich, dass ein ruchloser Benutzer diese Umgebungsvariable zu ändern, um seine gefährliche Version von dir
zu zeigen.
Die Tatsache, dass Windows nicht unbedingt in C: installiert. \ Windows verkompliziert einen Makel sicheren Skript unter Windows zu schreiben, wenn Sie auf einem der Shell builtins verlassen
EDIT: Hier ist ein kurzer Test Programm, das Sie als Basis verwenden können:
#!/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
Im Grunde, was Sie brauchen, ist für den Systemadministrator des akzeptablen Pfad bei der Installation und für nicht vertrauenswürdige Benutzer codieren keine Schreibrechte auf dem Skript zu haben.
Andere Tipps
Taint-Modus ist kompliziert. Sie müssen wirklich lesen und verstehen perldoc perlsec
. Ihr Problem wird im ersten Satz des Reinigen Sie Ihren Weg Abschnitt.