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


One set of PHP files connecting to one of many databases

我正在尝试找出一种好的,安全的方法,让单个文件目录(我们应用程序的一个实例)连接到多种可能性中的单个数据库。我们过去的工作方式是每个客户都有一组文件和一个数据库,他们的文件集将配置为直接链接到他们的数据库。这有效,但是很难在所有客户中保留应用程序的标准化版本;确保每个人都有最新的更新。

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

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

每个客户唯一需要知道的是数据库连接的用户、通行证、数据库名称和主机名。我只是将它们存储在一个配置文件中,每个客户一个,根据客户命名:

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

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

例如,您的索引.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

(呃,对不起,你不会require_once ini文件,但你明白了......

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

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

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