In Perl enthält das globale assoziative Array %ENV die aktuellen Umgebungsvariablen des Prozesses. Jede Manipulation dieses Hashes spiegelt sich direkt in der Umgebung des Prozesses und damit in den Kindprozessen wider, die durch system, exec, open usw. erzeugt werden.
Beispielverwendung:
print $ENV{"HOME"}; # Den Pfad zum Home-Verzeichnis des Benutzers abrufen $ENV{"PATH"} = "/usr/bin"; # Den PATH-Wert überschreiben
Details:
%ENV hat sofortige Auswirkungen auf alle zukünftigen Shell-Kommandos, die aus diesem Perl-Prozess gestartet werden.undef oder das Löschen eines Elements entfernt die entsprechende Umgebungsvariable.%ENV, insbesondere in CGI- oder Systemskripten.exists $ENV{"VAR"}.Entfernt die Operation
$ENV{"MYVAR"} = undefdie Umgebungsvariable?
Antwort: Nein! Es weist der Variable einfach den Wert undef zu, aber der Schlüssel bleibt im Hash! Um die Umgebungsvariable zu entfernen, verwenden Sie delete $ENV{"MYVAR"}.
# Entfernt die Variable nicht aus der Umgebung $ENV{"FOO"} = undef; # Richtig - entfernt delete $ENV{"FOO"};
Geschichte
Auf einem Webserver hat ein Programmierer beim Bereinigen der Umgebung für die Sicherheit undef zugewiesen, anstatt Variablen zu löschen. Die Variablen verschwanden nicht und konnten von Angreifern verwendet werden, was zu einer Ausführungsschwäche mit gefährlichen Pfaden in PATH führte.
Geschichte
Beim Übergeben von Umgebungsvariablen an Unterprozesse wurden alte Variablen nicht entfernt, was unerwartete Abstürze in ausführbaren Drittanbieter-Utilities und fehlerhaftes Verhalten des Programms verursachte.
Geschichte
Der Versuch, die gesamte Umgebung für den Kindprozess zu bereinigen, führte einfach dazu, dass %ENV = (); gesetzt wurde, jedoch ohne vorherige Überprüfung der erforderlichen Variablen. Dies führte zu Abstürzen, da eine Reihe von Diensten zwingend erforderliche Umgebungsvariablen (z. B. USER oder Lokalisierungsvariablen) benötigt.