我最近注意到,在我的系统上,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目录?
答案 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脚本相比并不是真正的问题 在污点模式下自动运行。