In Perl, l'array associativo globale %ENV contiene le attuali variabili d'ambiente del processo. Qualsiasi manipolazione di questo hash influisce direttamente sull'ambiente del processo e, di conseguenza, sui processi figli generati tramite system, exec, open, e così via.
Esempio di utilizzo:
print $ENV{"HOME"}; # Ottieni il percorso della home dell'utente $ENV{"PATH"} = "/usr/bin"; # Ridefinisci la variabile PATH
Dettagli:
%ENV influisce istantaneamente su tutti i futuri comandi della shell eseguiti da questo processo Perl.undef o rimuovere un elemento elimina la corrispondente variabile d'ambiente.%ENV, specialmente in script CGI o di sistema.exists $ENV{"VAR"}.L'operazione
$ENV{"MYVAR"} = undefrimuove la variabile d'ambiente?
Risposta: No! Questo assegna semplicemente il valore undef alla variabile, ma la chiave rimane nell'hash! Per rimuovere la variabile d'ambiente, utilizzare delete $ENV{"MYVAR"}.
# NON rimuove la variabile dall'ambiente $ENV{"FOO"} = undef; # Corretto — rimuove delete $ENV{"FOO"};
Storia
Su un server web, durante la pulizia dell'ambiente per motivi di sicurezza, un programmatore assegnava undef invece di rimuovere le variabili. Le variabili non scomparivano e potevano essere usate da malintenzionati, causando vulnerabilità nell'esecuzione di comandi con percorsi pericolosi in PATH.
Storia
Durante il passaggio di variabili d'ambiente a subprocessi, si dimenticava di rimuovere le vecchie variabili, causando crash imprevisti nelle utility di terze parti eseguibili e comportamenti erratici del programma.
Storia
Cercando di pulire completamente l'ambiente per un processo figlio, lo script semplicemente faceva %ENV = ();, ma senza controllare in precedenza le variabili necessarie. Ciò ha causato crash poiché alcuni servizi richiedono chiavi d'ambiente obbligatorie (ad esempio, USER o variabili di localizzazione).