繁体   English   中英

PHP 应用程序的数据库登录凭据的存储位置

[英]Where to store database login credentials for a PHP application

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

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

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

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

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

用于 MySQL 连接的 Example.ini 文件,使用 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

由于不能使用:: inside.ini-file-keys,因此请在代码中使用constant('PDO::'. $iniKey)来获得所需的 PDO-constants。

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

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

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

相当安全——理论上,无论如何......

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

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

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

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

这是一种安全的方法吗?

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

每个开发者都可以看到数据库连接的详细信息

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

我想您可以使用使用 zend 编码器加密的不同包含文件,其中 function 返回数据库句柄 - 并设置 scope 和不同文件的权限,但隔离 Z2FEC392304A5C23AC138DA228Z7B 数据很棘手。 另一种方法是将所有内容限制为 Web 服务并在 Web 服务层中实现扩展权限 model。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM