보안: 오용을 방지하기 위해 IFS 변수를 재설정하는 쉘 스크립트?

보안: 오용을 방지하기 위해 IFS 변수를 재설정하는 쉘 스크립트?

O'Reilly의 "Classic Shell Scripting"을 읽은 결과 잠재적으로 악의적이거나 기타 잘못된 입력을 방지하기 위해 각 쉘 스크립트의 시작 부분에서 입력 필드 구분 기호 IFS를 개행, 공백 및 탭으로 재설정하려는 것 같습니다.

이것이 실제로 모든 쉘 스크립트에 대한 모범 사례입니까? 모든 쉘 스크립트에 이것을 포함시키는 것은 나에게는 실용적이지 않은 것 같습니다.

IFS='
     '

답변1

요즘 모범 사례에 꼭 필요한 것은 아니며 단지 혼란스러울 뿐입니다. 역사적으로 이것은 의문의 여지가 있습니다.

역사

역사적으로 sh의 일부 구현은 IFS다른 변수와 마찬가지로 환경에서 상속받았지만 다른 구현에서는 기본값(space-tab-newline)으로 강제 설정했습니다. 대부분의 21세기 포탄은 후자입니다.

POSIX두 가지 동작을 모두 허용하는 데 사용됩니다.

구현에서는 쉘이 호출될 때 환경의 IFS 값을 무시하여 IFS를 설정되지 않은 것으로 처리할 수 있습니다.

"IFS를 설정되지 않은 것으로 처리"는 실제로 필드 분할에 설정 해제와 동일한 효과가 있는 값으로 설정하는 일반적인 동작을 설명하지 않습니다. 이것은 에서 논의되었습니다.오스틴 그룹 개선 요청 096문구를 수정하지만 여전히 유지 또는 재정의를 허용합니다 IFS.

몇년전부터 이렇게 바뀌었는데오스틴 그룹 결함 0000884시작 시 "IFS를 다음으로 설정하려면 sh가 필요합니다 <space><tab><newline>. " 이 제안서는 2015년에 제출되었으며 2016년 버전에 채택되었습니다.POSIX:2008이제 다음을 선언하세요.

쉘은 <space> <tab> <newline>호출될 때 IFS를 설정해야 합니다.

IFS그 근거는 신뢰할 수 없는 소스에서 설정되었을 수 있는 환경에서 스크립트가 설정 및 실행되지 않을 때 자주 발생하는 바람직하지 않은 동작을 피하기 위한 것입니다 .

따라서 요즘에는 IFS이전 쉘을 사용하는 경우 명시적으로 기본값만 설정하면 되며, 표준 관행과 다른 변형이 필요할 수 있습니다.

이것이 모범 사례입니까?

스크립트가 신뢰할 수 없는 소스로부터 환경 변수를 상속받는 경우 많은 문제가 발생할 수 있습니다. IFS이는 많은 잠재적인 문제 중 하나일 뿐입니다. 그리고 PATH,,,,,,,...모두 설정할 자신이 있으신가요 LD_LIBRARY_PATH? 기억 나니? ? ?PYTHONPATHPERLLIBPERL5LIBRUBYPATHLD_PRELOADTEXINPUTSRSYNC_RSH일부 변수의 이름에는 다음이 포함됩니다.()?

스크립트가 임의의 이름을 가진 환경 변수를 상속하는 경우저것문제이므로 스크립트 내부에서 수정할 수 없습니다. 공격자가 제한 없이 환경의 변수 이름을 확인할 수 있도록 허용하는 셸 스크립트를 실행하지 마십시오. 그렇기 때문에스도화이트리스트 환경 변수 이름만 허용됩니다.

역사적으로 이것은 주로 문제였습니다.컴퓨터 그래픽 이미지 처리환경 변수 이름을 필터링하지 않는 인터페이스. 사용되는 통신사 중 하나입니다.쉘 쇼크. 좋은 최신 CGI와 같은 시스템은 모든 변수 앞에 접두사를 붙이고 변수 이름이 ASCII 영숫자 문자와 밑줄로만 구성되도록 허용합니다.

관련 정보