4

我正在使用带有单例 PDO 的 PHP 来访问数据库,它显然需要 MySQL 的用户名和密码。

众所周知,用户名和密码不应存储在公共目录中。

因此,我可以做一些类似require 'some_path/my_secrets.php';设置一堆变量的事情,但是这些变量可能是全局定义的,这不是一个好主意(授予,在使用单例时不是全局的,但仍然如此)。好的,我只能在某些函数中需要秘密文件,但要记住的东西很多......

有没有更好的方法让 PHP 脚本可以使用私有数据?另外,我应该采取任何其他步骤吗?谢谢

4

4 回答 4

1

我有同样的问题,最初

  • 数据库密码存储在目录中的包含文件中includes(即防止偶然的 PHP 代码直接从 Web 文件中显示)

然后出现了另一个想法,有点复杂但仍然很可行

  • 制作一个 C 程序,该程序拥有已编码的 DB 数据并通过系统调用传递数据。源代码(包括编码密码)在安全的地方拥有。C 代码必须执行一些检查以确保调用来自 PHP 等...

但这相当昂贵 - C 速度很快,但一直通过系统加载密码很昂贵。因此,将 APC 添加到游戏中会使整个事情变得更容易和更快

  • 在第一次请求期间,将 DB 数据加载到 APC 永久变量中 - 因此数据在内存中,更难以从外部获取。通常,该算法是

算法

Check if APC variables are set
If yes use them
If no load them from C program, only once

APC 文档

  • 另一个想法,例如使用是在包含密码php-fpm的 fpm 配置(只能由root读取)中设置一个环境变量

最后,您还可以创建自己的 PHP 扩展,提供来自 C 代码的数据(扩展通常用 C 编写)。这是一些扩展文档

这不是如何防止密码窃取的最终答案,但至少它会使黑客更难确定密码 - 并且还需要更多的知识。

于 2013-02-23T15:14:16.237 回答
1

我知道的大多数系统都有一个受 .htaccess 保护的包含文件。在里面定义一个配置数组并完成。也许不是最安全的方法,但许多商店、CRM 和其他网络服务都这样做。

于 2013-02-23T15:20:40.140 回答
0

首先,我想说,除非您的 PHP 应用程序需要它,否则尽可能地限制应用程序的数据库帐户的权限(例如:对适当表的读取权限,也许尽可能少的写入权限)。如果您的应用程序需要管理员访问权限来创建表等,那完全是“另一罐蠕虫”。

其次,正如 ring0 建议的那样,不要以纯文本形式存储数据库密码。我建议使用散列 API 来存储密码的散列,例如:https ://gist.github.com/nikic/3707231 。当然,哈希可能最好存储在其他第三个位置(至少是一个单独的文件)。如果您的用户是值得信赖的,并且您可以找到一种方法,则可以根据用户的登录信息计算散列,但这可能需要在您的密码文件中为每个用户单独输入(因为每个散列的数据库密码都是不同的)。

从来没有万无一失的方法,我也不是安全专家,但我知道纯文本总是不利于存储密码,所以我认为这是朝着正确方向迈出的一步。

于 2013-02-23T15:46:07.450 回答
0

你的解决方案很好。

大多数建议的解决方案都被夸大了,尽管它们可能会提高安全级别,但不值得付出额外的努力。

因为安全不应只依赖于密码的保密性。充其量,即使密码被泄露,它的知识对于攻击者来说也毫无价值,因为他无法使用它。

这意味着,使用专用于您的应用程序的 MySQL 用户,其权限遵循最小权限原则,并且只允许从该应用程序的 Web 服务器访问数据库(请参阅MySQL 访问权限系统)。

于 2013-02-23T17:21:55.627 回答