为什么Perl在-T下运行时不需要某些文件?
我最近注意到,在我的系统上,当在为什么Perl在-T下运行时不需要某些文件?,perl,require,taint,Perl,Require,Taint,我最近注意到,在我的系统上,当在-T下运行时,不可能要求'lib/file.pl',但要求'/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/
-T
下运行时,不可能要求'lib/file.pl'
,但要求'/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'需要“lib/file.pl”'
$perl-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
我在医生身上找不到这种行为。有人能告诉我这是在哪里记录的,或者为什么-T
不喜欢
作为lib目录吗?呃。。。我想这实际上是:
当污染模式(-T)生效时,“.”目录将被删除
来自@INC,环境变量PERL5LIB和PERLLIB是
被Perl忽略。您仍然可以通过以下方式从程序外部调整@INC
使用-I命令行选项,如perlrun中所述
。。。但我想这只是答案的一半。作出这一决定的原因如下:
。。。@INC的问题实际上更多的是SUID脚本的问题
而不是CGI脚本。当您有一个SUID脚本可以使用
另一个用户(如root)的权限,Perl进入
自动关闭模式
对于这个SUID脚本案例,拥有它将是一个巨大的安全漏洞
从用户当前目录加载库的功能。
如果脚本最终出现错误,而库在
正常目录路径,则用户可以通过写入
拥有恶意版本的库,将其放入当前
目录,并从其当前目录运行SUID脚本
然而,这与CGI脚本的问题并不完全相同。用户的
没有从任意目录执行脚本。你的网站
服务器控制从哪个目录调用脚本。所以保持
与SUID脚本相比,@INC中的“.”并不是一个真正的问题
自动在污染模式下运行
我只是没看到。现在我正在阅读Perl编程,但仍然没有找到这一部分。非常感谢。