我们有一个开发服务器和一个带有不同数据库连接细节(用户名,密码等)的活动服务器。在哪里存储PHP应用程序的数据库登录凭证
目前,我们正在将数据库连接详细信息存储在initial.php中,并且如果存在DEFINE语句,则会选择其中一个。我们在我们的实时服务器上手动添加DEFINE语句。
这是一种安全的方法吗?管理数据库连接安全性的更好/替代方法是什么?这
一个后果是,每一个开发人员可以看到数据库连接的细节,这是一个有点冒险...
我们有一个开发服务器和一个带有不同数据库连接细节(用户名,密码等)的活动服务器。在哪里存储PHP应用程序的数据库登录凭证
目前,我们正在将数据库连接详细信息存储在initial.php中,并且如果存在DEFINE语句,则会选择其中一个。我们在我们的实时服务器上手动添加DEFINE语句。
这是一种安全的方法吗?管理数据库连接安全性的更好/替代方法是什么?这
一个后果是,每一个开发人员可以看到数据库连接的细节,这是一个有点冒险...
我使用.ini文件,然后通过parse_ini_file(INI_FILENAME_HERE, true)
解析。 该文件不受版本控制(与php-/template-/whatever-files一样)。因此,在每台机器上,我为相应的数据库连接创建该文件(.database.ini)。
例的.ini文件的一个MySQL连接,使用PDO:
[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 -constants。
有点难以保护您的应用程序免受使用它的开发人员的影响。我的建议是从配置文件加载所有密码,并创建2个独立的环境:一个用于开发,一个用于生产服务器。为开发人员提供完全访问开发人员的机会,并且在转移到生产服务器时,应用程序将自己提供生产配置,该配置将仅存储在该机器上,因此大多数开发人员无法访问。这种类型的安全性更多的是一个过程,你必须定义几个步骤,比如谁有权访问生产机器以及谁正在发布......等。
这是一种安全的方法吗?
这取决于您的安全定义。
每个开发人员都可以看到数据库连接的详细
据我所知,不是在php.ini文件使用默认的用户名/密码/数据库等,这个问题几乎是不可避免的(使用默认值意味着他们已经自动访问数据库)。
我想你可以使用不同的包含文件使用Zend编码器加密一个函数返回数据库句柄 - 并设置不同文件的范围和权限,但它很难将PHP代码隔离到底层数据。另一种方法是将所有内容限制为web服务,并在Web服务层中实现扩展权限模型。
我最近不得不处理这个问题,而我所做的是创建两个新的数据库用户。第一个没有特权,除了在他自己的模式中对表格的读特权。第二个插入特权到一个“加载”表我将填充我的代码。
非特权用户在他的模式中获得了“凭证”表,该表包含插入用户的凭据和密码(以及我的应用程序需要的其他一些参数)。所以代码只包含非特权用户的凭证,硬编码和定期更改,并且在运行时会查找需要插入的凭证。查找发生在我们的防火墙后面,服务器之间,所以它不是一个外人可以窃听的东西。
这不是我担心的开发者,它是外部人员和高级用户,他们理论上可以访问Web服务器并查看ini文件。这样,只有开发人员和数据库管理员才能窥探(我们都知道彼此)。任何人都必须弄清楚如何查询数据库,找出要使用的SQL,弄清楚如何运行代码......这不是不可能的,但肯定是一个巨大的多步骤痛苦,不值得。
非常安全的 - 在理论上,反正...
另一种方法是设置环境变量的直播和开发机器上,并从代码中访问他们...我不知道很多PHP,但是在Python这将是:
import os
password = os.environ('DB_PASS')
这可让您根据需要开发和部署的服务器分配帐户和密码。根据他们在该机器上的权限,可以防止开发人员访问活动密码。
您使用的是什么操作系统,网络服务器和数据库?这可能是相关的。例如,使用MS SQL Server和在Windows机器上运行的Web服务器,您可以使用集成安全性,以便Web服务器进程本身将对数据库进行身份验证,并且PHP代码不需要用户名和密码。 – 2011-05-04 12:02:51