一组PHP文件连接到许多数据库之一

时间:2012-06-06 18:10:23

标签: php mysql database

我试图想出一个好的,安全的方法,让一个文件目录(我们的应用程序的一个实例)从一系列多种可能性中连接到一个数据库。我们以前做事的方式是每个客户都有一组文件和一个数据库,他们的文件集将被配置为直接链接到他们的数据库。这是有效的,但是它使得难以在所有客户中保持应用程序的标准化版本;确保每个人都有最新的更新。

我想解决的一个方法是拥有一个独特的通用数据库,用于登录过程。在该数据库中将是包含用户特定数据库的名称的字段,该数据库随后将存储在其会话中。一旦他们登录了应用程序,就会查看会话以获取其数据库的名称,并直接连接到该数据库。

我很确定这种方法可行,我只是担心它可能会出现一些安全问题。关于如何处理这个的任何建议?

2 个答案:

答案 0 :(得分:1)

每个客户唯一需要知道的是数据库连接的user,pass,dbname和hostname。我只是将它们存储在一个配置文件中,每个客户一个,根据客户命名:

/path/to/configs/customer1.ini
/path/to/configs/customer2.ini
/path/to/configs/customer3.ini

然后,您的应用会根据VHOST中设置的环境变量或$ _SERVER ['HTTP_HOST']中的值选择要加载的配置文件。

例如,您的index.php可能包含:

if (!preg_match('/pattern to ensure valid hostname/', $_SERVER['HTTP_HOST'])) {
    header('HTTP/1.1 403 Forbidden');
    exit;
}
$config = '/path/to/configs/' . $_SERVER['HTTP_HOST'] . '.ini';
if (!file_exists($config)) {
    header('HTTP/1.1 404 Not Found');
    exit;
}
require_once $config;

然后创建:

/path/to/configs/customer.com.ini

为:

dbname = whatever
user = whatever
pass = whatever
dbhost = whatever

(呃,对不起,你不会要求输入ini文件,但是你明白了......)

答案 1 :(得分:0)

你使用过Wordpress MU吗?他们巧妙而清晰地解决了这类问题。他们使用了oAuthCookies,而不是将其存储在sessions中。

如果您无法使用oAuth,我猜最好的选择是cookies。使用domain cookies和类似于Apache Virtual Hosts的东西,您可以获得MySQL的所有身份验证详细信息,正如您所说的引用表并基于域/用户名,您可以使用该实例。

我们将此概念称为多租户应用程序。