如何在与脚本相同的目录中找到Perl模块

时间:2017-05-02 12:44:57

标签: perl module cgi

现在最新版本的Perl已删除“。”来自@INC,我对模块文件位置的最佳实践感到好奇。到目前为止,与我们网站上每个应用程序相关联的* .pm文件与脚本位于同一目录中。我收集到这一点,会产生一个安全漏洞。

我们没有@INC中其余目录的写访问权。

我们可以将pm文件保留在原来的位置,并将use lib ".";添加到我们现有的所有脚本中,但这不会只是保留安全漏洞吗?

关于如何根据这一新发展最好地组织我们的Perl脚本及其相关模块的任何建议?

2 个答案:

答案 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));