W Perl globalna tablica asocjacyjna %ENV zawiera aktualne zmienne środowiskowe procesu. Każda manipulacja tym hashem bezpośrednio wpływa na środowisko procesu oraz na potomne procesy, tworzone za pomocą system, exec, open itd.
Przykład użycia:
print $ENV{"HOME"}; # Uzyskaj ścieżkę do katalogu domowego użytkownika $ENV{"PATH"} = "/usr/bin"; # Zapisz zmienną PATH
Szczegóły:
%ENV natychmiast wpływają na wszystkie przyszłe polecenia powłoki uruchomione z tego procesu Perl.undef lub usunięcie elementu usuwa odpowiadającą zmienną środowiskową.%ENV, szczególnie w skryptach CGI lub systemowych.exists $ENV{"VAR"}.Czy operacja
$ENV{"MYVAR"} = undefusuwa zmienną środowiskową?
Odpowiedź: Nie! To po prostu przypisuje zmiennej wartość undef, ale klucz pozostaje w hash! Aby usunąć zmienną środowiskową, użyj delete $ENV{"MYVAR"}.
# NIE usuwa zmiennej ze środowiska $ENV{"FOO"} = undef; # Dobrze — usuwa delete $ENV{"FOO"};
Historia
Na serwerze WWW, podczas czyszczenia środowiska dla bezpieczeństwa, programista przypisał undef zamiast usunąć zmienne. Zmienne nie zniknęły i mogły być używane przez atakujących, co spowodowało podatność na wykonanie poleceń z niebezpiecznymi ścieżkami w PATH.
Historia
Podczas przesyłania zmiennych środowiskowych do procesów potomnych zapomniano usunąć stare zmienne, co spowodowało nieoczekiwane awarie w wykonywalnych narzędziach zewnętrznych i niewłaściwe działanie programu.
Historia
Próbując wyczyścić całe środowisko dla procesu potomnego, skrypt po prostu robił %ENV = ();, ale bez wcześniejszego sprawdzenia potrzebnych zmiennych. To spowodowało awarie, ponieważ wiele usług wymaga obowiązkowych kluczy środowiskowych (na przykład USER lub zmienne lokalizacyjne).