9

我知道该问题How do I secure my database connection credentials?已被多次询问和回答(例如,如何在 PHP 中保护数据库密码?)。

该问题的一个普遍接受的答案是将详细信息存储在 Web 根目录之外。但我很好奇为什么这真的有很大的不同。

据我了解,一个人无法通过 HTTP 下载 PHP 文件的源代码(除非您的网络服务器配置不正确,但您会立即知道这一点)。因此,除非您无论如何都可以访问 PHP 文件的源,否则您将无法看到凭据。如果我错了,请纠正我,但这基本上不意味着您需要 shell 访问权限吗?如果你有 shell 访问权限,你就不能访问 web 根目录之外的文件吗?

如果该问题的答案是包含文件可能具有不允许除 Web 服务器用户之外的任何人读取它的特殊权限,那么(考虑到我有 shell 访问权限),我不能只写(或修改)任何 PHP 文件只是回显这些凭据?

所以问题是,将凭据直接存储在 PHP 脚本中还是存储在 Web 根目录之外的文件中真的有什么区别吗?

4

3 回答 3

8

假设由于 webserver 出错,webserver 不再处理 php 文件,而是将它们视为 html 文件。

在这种情况下,类似的事情http://mysite.com/config.php会简单地显示您的数据库的凭据。

所以答案是:是的,存储数据库凭据的位置和方式确实很重要。

于 2012-10-11T13:50:47.700 回答
5

主要问题是 Web 服务器稍后可能会发生故障。例如,在软件更新后,php 可能不再正常工作,服务器会退回到直接传递文件。或者在软件更新后,配置可能会被重置,因此不再为文件扩展名注册 PHP。或者服务器在负载过重的情况下发生故障,并且也开始简单地传递文件。

很多事情都可能发生,并且在某些时候很容易弄乱配置。最好保持安全并将其保存在文档根目录之外。

于 2012-10-11T14:02:08.317 回答
0
  1. 为您的应用程序创建一个 O/S 用户,例如“UserForMyApp”

  2. 对于该用户,创建一个 O/S 用户环境变量“MY_APP_DATABASE_PASSWORD”,并设置值

  3. 以“UserForMyApp”身份运行您的应用

  4. 在 MyApp 中,读取 O/S 用户环境变量 'MY_APP_DATABASE_PASSWORD' 并使用它来登录数据库

其他非 root 用户无法读取其他用户的 O/S 用户环境变量。这是默认设置。与 w 文件权限不同,您无需设置任何内容。

不会偶然将密码存储在源代码管理中。

如果 db 和 app 在同一台机器上,则可以让 db 信任本地访问而无需密码。

于 2013-10-25T20:51:46.267 回答