我知道问题How do I secure my database connection credentials?
已被多次询问和回答(例如How to secure database passwords in PHP?)。
该问题的一个普遍接受的答案是将详细信息存储在Web根目录之外。但我很好奇为什么这真的有很大不同。
根据我的理解,一个人无法通过HTTP下载PHP文件的来源(除非你的web服务器配置不正确,但你马上就会知道)。因此,除非您无论如何都可以访问PHP文件的源代码,否则您将无法看到凭据。如果我错了,请纠正我,但这不是基本上意味着你需要shell访问吗?如果你有shell访问权限,那么你不能直接访问web root之外的文件吗?
如果该问题的答案是包含文件可能具有除了Web服务器用户之外不允许任何人读取它的特殊权限,那么(考虑到我有shell访问权限),我不能写(或者修改)任何PHP文件只是回显那些凭证?
所以问题是,无论是直接在PHP脚本中还是在Web根目录外的文件中存储凭证,真的是否真的?
答案 0 :(得分:8)
假设由于网络服务器中的错误,网络服务器不再处理php文件,而是将它们视为html文件。
在这种情况下,类似http://mysite.com/config.php
的内容会简单地显示数据库的凭据。
所以答案是:是的,它确实很重要,存储数据库凭据的位置和方式。
答案 1 :(得分:5)
主要问题是Web服务器可能会在以后崩溃。例如。软件更新后,php可能无法正常工作,服务器会回退直接传递文件。或者在软件更新后再次重置配置,因此PHP不再注册文件扩展名。或者服务器在负载很重的情况下崩溃,并且还开始明确地提供文件。
很多事情都可能发生,而且在某些时候搞乱配置相当容易。最好是安全的,并将其保留在文档根目录之外。
答案 2 :(得分:0)
为您的应用程序创建一个操作系统用户,例如'UserForMyApp'
对于该用户,创建一个O / S用户环境变量'MY_APP_DATABASE_PASSWORD',并设置值
将您的应用设为“UserForMyApp”
在MyApp中,读取O / S用户环境变量'MY_APP_DATABASE_PASSWORD'并使用它来登录数据库
其他非root用户无法为其他用户读取O / S用户环境变量。这是默认值。与w文件权限不同,您不必设置任何内容。
无法将密码存储在源代码管理中。
如果db和app在同一台机器上,则可以让db信任本地访问而无需密码。