Perl'de global bir ilişkilendirilmiş dizi olan %ENV, sürecin mevcut çevresel değişkenlerini içerir. Bu hash'teki herhangi bir manipülasyon, doğrudan sürecin çevresini ve dolayısıyla system, exec, open gibi yöntemlerle oluşturulan alt süreçleri etkiler.
Kullanım örneği:
print $ENV{"HOME"}; # Kullanıcının ev dizininin yolunu alın $ENV{"PATH"} = "/usr/bin"; # PATH değişkenini yeniden yazın
İnce noktalar:
%ENV içindeki herhangi bir değişiklik, bu Perl sürecinden başlatılan tüm gelecekteki kabuk komutlarını anında etkiler.undef atama veya bir öğe kaldırma, ilgili çevresel değişkeni siler.%ENV içinde kullanmayın, özellikle CGI veya sistem betiklerinde güvenlik için garanti edilmeli.exists $ENV{"VAR"} kullanın.
$ENV{"MYVAR"} = undefişlemi çevresel değişkeni kaldırır mı?
Cevap: Hayır! Bu sadece değişkene undef değerini atar, ancak anahtar hash'te kalır! Çevresel bir değişkeni silmek için delete $ENV{"MYVAR"} kullanın.
# Çevreden değişkeni silmez $ENV{"FOO"} = undef; # Doğru - siler delete $ENV{"FOO"};
Hikaye
Bir web sunucusunda, güvenlik için çevreyi temizlerken, programcı değişkenleri silmek yerine undef atıyordu. Değişkenler kaybolmadı ve saldırganlar tarafından kullanılabildi, bu da PATH'teki tehlikeli yollarla komutları çalıştırma zayıflığına yol açtı.
Hikaye
Alt süreçlere çevresel değişkenlerin iletilmesinde, eski değişkenlerin silinmesini unuttular, bu da üçüncü taraf araçlarda beklenmeyen çöküşlere ve programın yanlış davranışlarına yol açtı.
Hikaye
Alt süreç için tüm çevreyi temizlemeye çalışırken, betik yalnızca %ENV = (); yapıyordu, ancak gerekli değişkenleri kontrol etmeden. Bu, bazı hizmetlerin zorunlu çevresel anahtarlara ihtiyaç duyması nedeniyle çöküşlere yol açtı (örneğin, USER veya lokalizasyon değişkenleri).