Perl에서 전역 연관 배열 %ENV는 프로세스의 현재 환경 변수를 포함합니다. 이 해시에 대한 모든 조작은 프로세스의 환경에 즉각적으로 반영되며, system, exec, open 등을 통해 생성된 자식 프로세스에도 영향을 줍니다.
사용 예:
print $ENV{"HOME"}; # 사용자 홈 디렉토리 경로 가져오기 $ENV{"PATH"} = "/usr/bin"; # PATH 변수 재설정
세부 사항:
%ENV의 모든 변경 사항은 이 Perl 프로세스에서 실행된 모든 후속 셸 명령에 즉시 영향을 미칩니다.undef를 할당하거나 요소를 삭제하면 해당 환경 변수가 제거됩니다.%ENV에 사용자 입력을 직접 사용하지 마십시오, 특히 CGI 또는 시스템 스크립트에서.exists $ENV{"VAR"}를 통해 키의 존재를 확인하십시오.
$ENV{"MYVAR"} = undef연산이 환경 변수를 제거합니까?
답변: 아니요! 이것은 단순히 변수에 undef 값을 할당할 뿐이며, 키는 해시에서 남아 있습니다! 환경 변수를 제거하려면 delete $ENV{"MYVAR"}를 사용하십시오.
# 환경에서 변수를 제거하지 않음 $ENV{"FOO"} = undef; # 올바른 방법 — 제거함 delete $ENV{"FOO"};
이야기
웹 서버에서 보안을 위해 환경을 정리할 때, 프로그래머는 변수를 삭제하는 대신 undef를 할당했습니다. 변수는 사라지지 않았고 악의적인 사용자가 사용할 수 있어 PATH에서 위험한 경로를 실행하는 취약점이 발생했습니다.
이야기
하위 프로세스에 환경 변수를 전달할 때 이전 변수를 삭제하는 것을 잊어버려서 외부 유틸리티에서 예기치 않은 실패와 프로그램의 잘못된 동작이 발생했습니다.
이야기
자식 프로세스를 위해 모든 환경을 정리하려고 시도하는 스크립트는 단순히 %ENV = ();를 수행했지만 필요한 변수를 미리 확인하지 않았습니다. 이로 인해 필수 환경 키(예: USER 또는 로컬 변수를 요구하는 서비스)가 필요한 수많은 서비스가 중단되었습니다.