In Perl bevat de globale associatieve array %ENV de huidige omgevingsvariabelen van het proces. Elke manipulatie van deze hash heeft directe invloed op de omgeving van het proces en daarmee op de kindprocessen die worden aangemaakt via system, exec, open, enzovoort.
Voorbeeld van gebruik:
print $ENV{"HOME"}; # Verkrijg het pad naar de home directory van de gebruiker $ENV{"PATH"} = "/usr/bin"; # Schrijf de PATH-variabele opnieuw
Fijnere details:
%ENV beïnvloedt onmiddellijk alle toekomstige shell-opdrachten die vanuit dit Perl-proces worden uitgevoerd.undef of het verwijderen van een element verwijdert de overeenkomstige omgevingsvariabele.%ENV, vooral niet in CGI- of systeemscripts.exists $ENV{"VAR"}.Verwijdert de operatie
$ENV{"MYVAR"} = undefde omgevingsvariabele?
Antwoord: Nee! Dit wijst gewoon de variabele de waarde undef toe, maar de sleutel blijft in de hash! Om een omgevingsvariabele te verwijderen, gebruik delete $ENV{"MYVAR"}.
# VERWIJDERT de variabele NIET uit de omgeving $ENV{"FOO"} = undef; # Correct — verwijdert delete $ENV{"FOO"};
Verhaal
Op de webserver, bij het opschonen van de omgeving voor veiligheid, wees de programmeur undef toe in plaats van variabelen te verwijderen. De variabelen verdwenen niet en konden door aanvallers worden gebruikt, waardoor een kwetsbaarheid voor het uitvoeren van opdrachten met gevaarlijke paden in PATH ontstond.
Verhaal
Bij het doorgeven van omgevingsvariabelen aan subprocessen vergaten ze oude variabelen te verwijderen, wat onverwachte fouten in uitvoerende externe Hulpprogramma's en ongewenst gedrag van het programma veroorzaakte.
Verhaal
Proberend de hele omgeving voor een kindproces op te schonen, deed het script gewoon %ENV = ();, maar zonder vooraf de benodigde variabelen te controleren. Dit leidde tot crashes, omdat een aantal services verplichte omgevingssleutels vereist (zoals USER of localisatievariabelen).