4

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 '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不喜欢.作为 lib 目录?

4

1 回答 1

12

嗯...这实际上是有据可查的,我想:

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

...但我想这只是答案的一半。此处给出了此类决定背后的原因:

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

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

然而,这与 CGI 脚本的问题并不完全相同。用户没有从任意目录执行您的脚本。您的 Web 服务器控制从哪个目录调用脚本。所以保留“。” 与在污点模式下自动运行的 SUID 脚本相比,@INC 并不是真正的问题。

于 2012-07-03T10:53:41.593 回答