【问题标题】:Securing database connection information保护数据库连接信息
【发布时间】:2012-10-11 13:47:58
【问题描述】:

我知道问题How do I secure my database connection credentials? 已被多次询问和回答(例如How to secure database passwords in PHP?)。

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

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

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

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

【问题讨论】:

    标签: php database security webserver credentials


    【解决方案1】:

    假设由于网络服务器出错,网络服务器不再处理 php 文件,而是将它们视为 html 文件。

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

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

    【讨论】:

    • 是的,这实际上发生在 facebook 上一次! techcrunch.com/2007/08/11/facebook-source-code-leaked
    • @Dev 问题是:我们为什么要在 webroot 之外存储数据库凭据?。这就回答了这个问题。
    • 这几乎是我所期待的答案,但我也试图找出是否还有其他更多与黑客相关的原因来这样做。你知道网络服务器是否会出现这样的错误(除了我自己搞砸了)?我同意我搞砸的可能性本身就是这样做的充分理由,所以我不反对......只是想找出所有潜在的风险。
    • 总有一种情况,网络服务器会停止提供文件扩展名。一个段错误,一个 PHP 中的错误,而不会弄乱自己。您可以选择一个根本不由网络服务器提供的文件扩展名,并通过 file_get_contents 或类似的方式读取配置。
    【解决方案2】:

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

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

    【讨论】:

    • 非常好。这就是我想要的更多。我没有想到软件更新和那种搞乱配置的东西。谢谢!
    【解决方案3】:
    1. 为您的应用程序创建一个 O/S 用户,例如“UserForMyApp”

    2. 为该用户创建一个操作系统用户环境变量“MY_APP_DATABASE_PASSWORD”,并设置值

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-26
      • 2010-10-16
      • 2018-04-09
      • 1970-01-01
      相关资源
      最近更新 更多