2011-05-04 46 views
19

我们有一个开发服务器和一个带有不同数据库连接细节(用户名,密码等)的活动服务器。在哪里存储PHP应用程序的数据库登录凭证

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

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

一个后果是,每一个开发人员可以看到数据库连接的细节,这是一个有点冒险...

+1

您使用的是什么操作系统,网络服务器和数据库?这可能是相关的。例如,使用MS SQL Server和在Windows机器上运行的Web服务器,您可以使用集成安全性,以便Web服务器进程本身将对数据库进行身份验证,并且PHP代码不需要用户名和密码。 – 2011-05-04 12:02:51

回答

12

我使用.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。

+0

这不能解决可见性问题 - 但你可以在php.ini文件中设置一个(单个)默认mysql数据库/用户 – symcbean 2011-05-04 12:30:01

+0

@symcbean也许我没有真正理解这个问题,但我认为它是一个普通的有关存储数据库设置的问题。 “此文件不受版本控制”回答为“此...的一个后果”。所以每个开发人员都需要他/她自己的设置文件,以及实时系统上的设置文件。 – feeela 2011-05-04 12:38:15

0

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

0

这是一种安全的方法吗?

这取决于您的安全定义。

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

据我所知,不是在php.ini文件使用默认的用户名/密码/数据库等,这个问题几乎是不可避免的(使用默认值意味着他们已经自动访问数据库)。

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

2

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

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

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

非常安全的 - 在理论上,反正...

1

另一种方法是设置环境变量的直播和开发机器上,并从代码中访问他们...我不知道很多PHP,但是在Python这将是:

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

这可让您根据需要开发和部署的服务器分配帐户和密码。根据他们在该机器上的权限,可以防止开发人员访问活动密码。

相关问题