在哪里存储PHP应用程序的数据库登录凭据

时间:2011-05-04 08:34:15

标签: php security database connection

我们有一个开发服务器和一个具有不同数据库连接详细信息(用户名,密码等)的实时服务器。

目前我们将数据库连接详细信息存储在initial.php中,如果存在DEFINE语句,则选择一个。我们在我们的实时服务器上手动添加DEFINE语句。

这是一种安全的方法吗?有哪些更好/替代的方法来管理数据库连接安全性?

这样做的一个结果是每个开发人员都可以看到数据库连接的详细信息,这有点风险......

5 个答案:

答案 0 :(得分:12)

我使用.ini文件,然后通过parse_ini_file(INI_FILENAME_HERE, true)解析。 此文件不受版本控制(如php- / template- / whatever-files)。因此,在每台机器上,我为相应的数据库连接创建该文件(.database.ini)。

使用PDO进行MySQL连接的.ini文件:

[db_general]
driver = "mysql"
user = "USERNAME"
password = "PASSWORD"

; DSN
; see http://www.php.net/manual/en/pdo.drivers.php
[db_data_source_name]
host = "localhost"
port = 3306
dbname = "DATABASE_NAME"

; specify PDO-options, provide keys without PDO::
; see http://www.php.net/manual/en/pdo.drivers.php
[db_pdo_options]
MYSQL_ATTR_INIT_COMMAND = "SET NAMES utf8"

; specify more PDO-attributes, provide keys without PDO::
; see http://php.net/manual/en/pdo.setattribute.php
[db_pdo_attributes]
ATTR_CASE = "PDO::CASE_LOWER"
ATTR_ERRMODE = "PDO::ERRMODE_EXCEPTION"
ATTR_EMULATE_PREPARES = false

由于无法在.ini文件密钥中使用::,因此请在代码中使用constant('PDO::' . $iniKey)来获取所需的PDO常量。

答案 1 :(得分:2)

我最近不得不处理这个问题,我所做的是创建两个新的数据库用户。第一个没有任何权限,除了在他自己的模式中对表的读权限。第二个对“加载”表具有插入权限,我将用我的代码填充。

非特权用户在其架构中获得了“凭据”表,其中包含插入用户的凭据和密码(以及我的应用程序所需的一些其他参数)。因此,代码仅包含非特权用户的凭证,硬编码并定期更改,并且在运行时它将查找插入所需的凭据。查询发生在我们的防火墙后面,服务器之间,所以这不是局外人可以窃听的东西。

这不是我担心的开发人员,它是外人和高级用户,他们理论上可以访问Web服务器并查看ini文件。这样,只有开发人员和DBA才能窥探(我们彼此都知道)。其他任何人都必须弄清楚如何查询数据库,找出使用什么SQL,弄清楚如何运行代码......并非不可能,但肯定是一个巨大的多步骤痛苦的屁股,不值得。

非常安全 - 理论上,无论如何......

答案 2 :(得分:1)

另一种方法是在live和development机器上设置环境变量并从代码中访问它们...我不太了解php,但在python中会是:

import os
password = os.environ('DB_PASS')

这使您可以根据需要向开发人员和已部署的服务器分发帐户和密码。根据他们在该计算机上的权限,可以阻止开发人员访问实时密码。

答案 3 :(得分:0)

有点难以保护您的应用程序免受使用它的开发人员的攻击。我的建议是从配置文件加载所有密码并创建2个独立的环境:一个用于开发,一个用于生产服务器。为开发人员提供对开发计算机的完全访问权限,当移动到生产服务器时,应用程序将使用生产配置自给自足,生产配置将仅存储在该计算机上,因此大多数开发人员无法访问。这种类型的安全性更像是一个过程,您必须定义几个步骤,例如谁有权访问生产机器以及谁在进行发布......等等。

答案 4 :(得分:0)

  

这是一种安全的方法吗?

这取决于您对安全的定义。

  

每个开发人员都可以看到数据库连接细节

AFAIK,除了使用php.ini文件中的默认用户名/密码/数据库之外,这个问题几乎是不可避免的(使用默认值意味着他们无论如何都会自动访问数据库)。

我猜你可以使用zend编码器加密的不同包含文件和一个返回数据库句柄的函数 - 并设置不同文件的范围和权限,但将PHP代码与基础数据隔离起来很棘手。另一种方法是将所有内容限制为Web服务,并在Web服务层中实现扩展权限模型。