1

好的,我放弃并寻求帮助;

我有一个脚本可以访问我的 MySQL 数据库中的信息。我希望我的凭据隐藏在一个我可以包含的文件中以确保安全。为了使它更整洁,我尝试在我的 cgi-bin 目录中创建一个子目录(包含)。

这是一个省略所有数据库内容的简单示例(因为这不是我的问题)。

config.pl(在包含目录中)

#!/usr/bin/perl
use strict;
use warnings;


$data_base = 'dbi::mysql::test_db';
$db_user = 'some_user';
$db_pw = 'password';    

test_driver.pl(在 cgi-bin 目录中)

#!/usr/bin/perl
use strict;
use warnings;
use DBI;

require'/include/config.pl';

$param1 = $data_base;
$param2 = $db_user;
$param3 = $db_pw;

我得到的第一个错误是找不到包含。我还看到很多帖子显示our在变量前面添加。大多数帖子也提到根本不使用require,但对于简单的事情我宁愿。

我最终遵循了一些关于如何制作模块的教程。我让它工作了,但对于一个简单的配置文件来说,这似乎需要付出很多努力。

4

2 回答 2

5

让我们回到你在做什么,虽然......

当您使用require时,它实际上是在执行期间读入文件。但是,作为要求状态的 Perldoc:

该文件是通过 do-FILE 机制包含的,它本质上只是各种“eval”,但需要注意的是调用脚本中的词法变量对包含的代码是不可见的。

词法(又名局部变量,又名my变量)不起作用。您需要包(又名全局,又名our)变量。

这是一个简单的测试:

测试.pl

#! /usr/bin/env perl
use 5.10.0;
use warnings;

our $variable;

require 'include.pl';
say "The value of \$foo is $foo";

包括.pl

$foo = "I am foo (honest!)";

1;

如果我跑步test.pl,我会得到:

The value of $foo is I am foo (honest!)

我看到几个问题。首先,您强迫自己使用特定变量作为您的帐户和密码。这并不是一个很好的编程理念。它基本上是看不见的东西发生在视线之外。

与其包含在文件中,不如使用真正的 INI 文件。我以前使用过一个名为Config::Ini的 Perl 模块,它相当容易使用。您创建一个类似 Windows 的 INI 文件,并从中读取您的信息。

如果您不想使用 INI 文件,请使用子例程。这样,您不必使用our变量,也不会被困在说您的密码必须是$password. 毕竟,这个配置文件很可能会被多个程序使用。这只是更好的编程:

测试驱动程序.pl

#! /usr/bin/env perl
use 5.10.1;
use warnings;

require "config.pl";

my $password = get_password();
my $account  = get_account();

配置文件

use 5.10.1;
use warnings;

sub get_password { return "swordfish" );
sub get_account { return "some_user" };
sub get_db      { return "database_name" };

1;
于 2013-04-12T00:36:31.350 回答
2

您在 中提供的路径require已关闭:您指定了绝对路径,但您将服务器的 docroot 误认为是实际的文件系统根。

/include/config.pl锚定在文件系统根目录,方式相同/usr/bin/perl

./include/config.pl将是相对于当前目录(可能是cgi-bin文件夹)的路径,并且可能会更好。如果你知道 cgi-bin 目录的绝对路径,你可以使用绝对路径:/var/www/whatever/structure/the/host/has/htdocs/cgi-bin/include/config.pl

如果您使用的是 Web 框架(我希望您是)而不是普通的、过时的 CGI,那么可能已经存在一个配置文件。例如,Dancer 有一个 YAML 文件,其中包含许多可以扩展的设置。

于 2013-04-11T23:58:48.523 回答