2012-10-11 187 views
9

我知道这个问题How do I secure my database connection credentials?已被要求,并回答了多次(例如How to secure database passwords in PHP?)。保护数据库连接信息

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

从我的理解,一个人无法通过HTTP下载PHP文件的源(除非你的web服务器配置不正确,但你知道这件事的时候了)。因此,除非您有权访问PHP文件的源,否则您将无法查看凭证。纠正我,如果我错了,但这不是基本上意味着你需要shell访问?如果你有shell访问权限,你能不能直接访问web根目录以外的文件?

如果这个问题的答案是,包括文件可能有特殊权限,不允许任何人,但与Web服务器用户阅读它,然后(考虑到我有shell访问),我不能只写(或修改)任何PHP文件只是回应这些凭据?

所以问题是,它是否真的是否有任何区别,直接存储在PHP脚本中的证书,而不是在Web根外的文件?

回答

8

假设,由于网络服务器上的错误,Web服务器不再处理PHP文件,而是将它们视为HTML文件。

在这种情况下,像http://mysite.com/config.php会简单揭示你的数据库的凭据。

所以答案是:是的,它确实很重要,在哪里以及如何存储数据库凭证。

+1

是的,这实际上发生在Facebook一次! http://techcrunch.com/2007/08/11/facebook-source-code-leaked/ – fire

+0

或者防止这个bug:http://eindbazen.net/2012/05/php-cgi-advisory-cve-2012- 1823/ – Tchoupi

+0

@Dev问题是:*为什么我们应该在webroot之外存储数据库证书?*。这回答了这个问题。 – Tchoupi

5

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

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

+0

非常好的一点。这更多的是我正在寻找的东西。我没有想过软件更新和那种搞乱配置的事情。谢谢! – Travesty3

0
  1. 为应用程序创建的O/S的用户,如 'UserForMyApp'

  2. 对于该用户,创建的O/S的用户环境变量 'MY_APP_DATABASE_PASSWORD',并将该值设置

  3. 运行你的应用程序为“UserForMyApp”

  4. 在MyApp的,读O/S的用户环境变量“MY_APP_DATABASE_PASSWORD”,并用它来登录到数据库

其它非根用户不能读取为另一个用户的O/S的用户环境变量。这是默认设置。与w文件权限不同,您不必设置任何内容。

无意中将密码存储在源代码管理中。

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