2012-07-03 2 views
4

최근 내 시스템에서 -T을 실행할 때 require 'lib/file.pl'을 실행할 수 없다는 것을 알았지 만 require './lib/file.pl'이 작동합니다.-T에서 실행될 때 Perl이 특정 파일을 필요로하지 않으려하는 이유는 무엇입니까?

$ perl -wT -e 'require "lib/file.pl";' 
Can't locate lib/file.pl in @INC (@INC contains: /usr/lib/perl5/site_perl/5.14.2/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.14.2 /usr/lib/perl5/vendor_perl/5.14.2/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.14.2 /usr/lib/perl5/5.14.2/x86_64-linux-thread-multi /usr/lib/perl5/5.14.2 /usr/lib/perl5/site_perl/5.14.2/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.14.2 /usr/lib/perl5/site_perl) 

$ perl -wT -e 'require "lib/file.pl"' 

두 가지 방법으로 -T 작동하지 않고 그 일 : $ 펄 -w -e ' "lib 디렉토리/file.pl"을 요구하는' $ 펄 -w -e ' "./lib/file.pl을 필요로 " '

오염 모드에서 .@INC의 일부가 아닙니다.

perl -w -e 'print "@INC"' 
[..snip..] /usr/lib/perl5/site_perl/5.14.2 /usr/lib/perl5/site_perl . 
perl -wT -e 'print "@INC"' 
[..snip..] /usr/lib/perl5/site_perl/5.14.2 /usr/lib/perl5/site_perl 

문서에서 해당 동작을 찾을 수 없습니다. 누군가가 이것이 문서화 된 곳 또는 lib 디렉토리로 -T.을 좋아하지 않는 이유를 말해 줄 수 있습니까?

답변

12

음 ...이 실제로 well documented, 내가 생각 : "."

오점 모드 (-T)이 적용되면, 디렉토리가 @INC의 에서 제거되고 환경 변수 PERL5LIB 및 PERLLIB가 Perl에서 무시 된 입니다. perlrun에 설명 된대로 -I 명령 행 옵션을 사용하여 프로그램 외부에서 @INC를 까지 조정할 수 있습니다.

...하지만 대답은 절반에 불과합니다. 이러한 결정의 뒤에 이유는 here 주어집니다 :

이 ... @ INC의 문제가 CGI 스크립트에 비해 SUID 스크립트 에 문제가 정말 이상이다. 과 함께 다른 사용자 (예 : root)의 권한으로 실행할 수있는 SUID 스크립트가 있으면 Perl은 자동으로 taintmode로갑니다.

이 SUID 스크립트의 경우 에 사용자의 현재 디렉토리에서 라이브러리를로드 할 수있는 보안상의 큰 결함이 있습니다. 스크립트가 일반 경로에서 라이브러리를 찾을 수없는 버그가 발생하면 악성 버전의 라이브러리를 작성하여 현재 디렉토리에두고 실행 중일 수 있습니다 현재 디렉토리의 SUID 스크립트

그러나 이것은 실제로 CGI 스크립트와 같은 문제는 아닙니다. 사용자의 이 임의의 디렉토리에서 스크립트를 실행하지 않습니다. 귀하의 웹 서버는 스크립트가 호출되는 디렉토리를 제어합니다. 그래서 유지 "." @INC의 경우 이 자동으로 오염 모드에서 작동하는 SUID 스크립트에 비해 실제로는 문제가 아닙니다.

+0

나는 그것을 보지 못했다. 지금 당장 필자는 Programming Perl *을 읽고 있지만 아직 그 부분을 찾지 못했다. **고맙습니다!** – simbabque

관련 문제