我最近注意到在我的系统上,在 -T
下运行时无法require 'lib/file.pl'
,但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 'require "./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
不喜欢.
作为库目录?
呃...我想这实际上是有据可查的:
当污点模式 (-T ) 生效时,将删除 "." 目录 从 @INC 中,环境变量 PERL5LIB 和 PERLLIB 是 被 Perl 忽略。您仍然可以通过以下方式从程序外部调整@INC 使用 -I 命令行选项,如 perlrun 中所述。
。但我想这只是答案的一半。这种决定背后的原因如下:
。@INC的问题实际上更多的是SUID脚本的问题 比 CGI 脚本。当您有一个可以执行的 SUID 脚本时 另一个用户的权限(如root),Perl进入 自动污染模式。
对于此SUID脚本案例,这将是一个巨大的安全漏洞 从用户的当前目录加载库的功能。 如果脚本最终出现在 正常目录路径,然后用户可以通过编写他们的 自己的恶意库版本,将其放在当前 目录,并从其当前目录运行 SUID 脚本。
但是,这与CGI脚本的问题并不相同。用户的 未从任意目录执行脚本。您的网络 服务器控制从哪个目录调用脚本。所以保持 "." 与 SUID 脚本相比,@INC 并不是真正的问题 在污点模式下自动运行。