为什么Perl在-T下运行时不想要某些文件?

时间:2012-07-03 10:49:33

标签: perl require taint

我最近注意到,在我的系统上,require 'lib/file.pl'下运行-T时无法require './lib/file.pl',但$ 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

在没有.的情况下执行此操作有两种方式:     $ perl -w -e'require“lib / file.pl”'     $ perl -w -e'requiret ./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

-T

我在doc中找不到这种行为。有人可以告诉我这里有哪些文件或为什么.不喜欢{{1}}作为lib目录?

1 个答案:

答案 0 :(得分:12)

嗯......我想这实际上是well documented

  

当污点模式(-T)生效时,“。”目录已删除   来自@INC,环境变量PERL5LIB和PERLLIB是   被Perl忽略了。您仍然可以在程序外调整@INC   使用-I命令行选项,如perlrun中所述。

...但我认为这只是答案的一半。这种决定背后的原因是here

  

... @INC的问题实际上是SUID脚本的问题   比CGI脚本。当您有一个可以执行的SUID脚本时   Perl进入的另一个用户(例如root)的权限   taintmode自动。

     

对于这个SUID脚本案例,这将是一个巨大的安全漏洞   从用户的当前目录加载库的功能。   如果脚本最终有一个错误,在该错误中找不到库   正常目录路径,然后用户可以通过编写它们来利用它   自己的,恶意的库版本,把它放在当前   目录,并从当前目录运行SUID脚本。

     

但是,这与CGI脚本的问题并不完全相同。用户   没有从任意目录执行您的脚本。你的网站   server控制调用脚本的目录。所以保持   “”在@INC中,与SUID脚本相比并不是真正的问题   在污点模式下自动运行。