Php 保护数据库连接信息

Php 保护数据库连接信息,php,database,security,webserver,credentials,Php,Database,Security,Webserver,Credentials,我知道问题如何保护数据库连接凭据?已被多次询问和回答(例如) 对于这个问题,一个普遍接受的答案是将细节存储在web根目录之外。但我很好奇为什么这真的有很大的不同 据我所知,一个人无法通过HTTP下载PHP文件的源代码(除非您的web服务器配置不正确,但您会马上知道)。因此,除非您能够访问PHP文件的源代码,否则您将无法查看凭据。如果我错了,请纠正我,但这基本上不意味着您需要shell访问吗?如果你有shell访问权限,你就不能直接访问web根目录之外的文件吗 如果这个问题的答案是include文

我知道问题
如何保护数据库连接凭据?
已被多次询问和回答(例如)

对于这个问题,一个普遍接受的答案是将细节存储在web根目录之外。但我很好奇为什么这真的有很大的不同

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

如果这个问题的答案是include文件可能具有特殊权限,除了web服务器用户之外,任何人都不允许读取它,那么(考虑到我有shell访问权限),我不能只编写(或修改)任何PHP文件来回显这些凭证吗


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

假设,由于web服务器中的错误,web服务器不再处理PHP文件,而是将其视为html文件

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


因此,答案是:是的,它确实很重要,您将数据库凭据存储在何处以及如何存储。

主要问题是web服务器以后可能会出现故障。例如,软件更新后,php可能无法正常工作,服务器会退回到直接交付文件的状态。或者,在软件更新之后,可能会重置配置,因此不再为文件扩展名注册PHP。或者服务器在负载过重的情况下发生故障,并开始简单地传送文件

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

  • 为应用程序创建O/S用户,例如“UserForMyApp”

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

  • 以“UserForMyApp”身份运行应用程序

  • 在MyApp中,读取O/S用户环境变量“MY_APP_DATABASE_PASSWORD”,并使用该变量登录数据库

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

    不可能意外地将密码存储在源代码管理中


    如果数据库和应用程序在同一台机器上,则可以让数据库信任本地访问,而无需密码。

    是的,这实际上在facebook上发生过一次!或者防止此错误:@Dev问题是:为什么要在webroot之外存储db凭据?。这回答了这个问题。这几乎是我所期待的答案,但我也试图找出是否还有其他更多与黑客相关的原因。你知道web服务器是否有任何方式会产生这样的错误(除了我自己把它搞砸之外)?我同意我把它搞砸的可能性本身就是这样做的充分理由,所以我并不反对……只是试图找出所有潜在的风险。总有一种情况,Web服务器会停止服务器的文件扩展名。一个segfault,一个PHP中的bug,而不会把自己搞砸。您可以选择一个Web服务器根本不提供的文件扩展名,并通过文件\u get\u contents或类似文件读取配置。这一点很好。这正是我想要的。我没有想到软件更新之类的事情会把配置搞得一团糟。谢谢