现在最新版本的Perl已删除“。”来自@INC,我对模块文件位置的最佳实践感到好奇。到目前为止,与我们网站上每个应用程序相关联的* .pm文件与脚本位于同一目录中。我收集到这一点,会产生一个安全漏洞。
我们没有@INC中其余目录的写访问权。
我们可以将pm文件保留在原来的位置,并将use lib ".";
添加到我们现有的所有脚本中,但这不会只是保留安全漏洞吗?
关于如何根据这一新发展最好地组织我们的Perl脚本及其相关模块的任何建议?
答案 0 :(得分:2)
不,将模块放在与脚本相同的目录中不是安全漏洞。假设当前工作目录(.
)是脚本的目录,则是一个错误和一个安全漏洞。
.
从未保证是脚本所在的目录。 (事实上,人们一次又一次地在CGI脚本中发现.
为/
。)继续使用您应该使用的内容:
use FindBin qw( $RealBin );
use lib $RealBin;
答案 1 :(得分:1)
FindBin的替代方法是:
#!/usr/bin/env perl
use strict;
use warnings;
use File::Basename qw( dirname );
use File::Spec::Functions qw( rel2abs );
use lib rel2abs( dirname(__FILE__) );
print "$_\n" for @INC;
正如@ikegami所指出的,如果你想通过符号链接来调用脚本,你需要:
use Cwd qw( abs_path );
use lib dirname(abs_path($0));