我正在尝试修改PERLLIB,以允许访问某个库所在的文件夹。
为此,我正在修改PERLLIB变量:
export PERLLIB=/some/folder
Run Code Online (Sandbox Code Playgroud)
现在,如果我这样做:
perl
print "$_\n" for @INC;
Run Code Online (Sandbox Code Playgroud)
显示新文件夹。但是,如果我这样做
perl -wT
print "$_\n" for @INC;
Run Code Online (Sandbox Code Playgroud)
不显示新文件夹。有没有办法用带有T标志的env变量来修改INC变量?
不。这将违背这一点。的整个目的-T是避免让调用者执行任意代码,而给予他们控制权@INC将允许这样做。
$ cat script
#!/usr/bin/perl
use strict;
use warnings;
print "Hello World\n";
$ printf '%s' 'print "owned\n";' >strict.pm
$ PERL5LIB=. script
owned
Hello World
Run Code Online (Sandbox Code Playgroud)
由于-Tsetuid脚本通常使用该脚本,因此允许调用者进行修改@INC将允许调用者以脚本所有者的身份执行任意代码。
您可以使用以下两种方法之一(但是脚本的setuid和setgid位将被忽略):
perl -I/some/folder -T script
Run Code Online (Sandbox Code Playgroud)
perl -Mlib=/some/folder -T script
Run Code Online (Sandbox Code Playgroud)
如果是setuid / setgid脚本,则可以在脚本本身中添加以下内容:
use lib '/some/folder';
Run Code Online (Sandbox Code Playgroud)
确保使用绝对路径,否则您将无效-T。
该perlsec手册页有这样一段对说污染模式和@INC。
当异味模式(
-T)生效时,“。” 目录从去除@INC,以及环境变量PERL5LIB和PERLLIB由Perl的忽略。您仍然可以按照perlrun中的说明@INC使用-I命令行选项从程序外部进行调整。这两个环境变量将被忽略,因为它们被模糊了,并且运行程序的用户可能不知道已设置它们,而-I选项清晰可见,因此可以使用。
@INC无需修改程序即可进行修改的另一种方法是使用lib编译指示,例如:Run Code Online (Sandbox Code Playgroud)perl -Mlib=/foo program使用
-Mlib=/fooover 的好处-I/foo是,前者将自动删除所有重复的目录,而后者则不会。请注意,如果将污染的字符串添加到中
@INC,将报告以下问题:使用-T开关运行时对require的依赖关系不安全