当PHP应用程序建立数据库连接时,当然通常需要传递登录名和密码。如果我对我的应用程序使用一个最小权限的登录,那么PHP需要知道这个登录名和密码。保护密码的最好方法是什么?只在PHP代码中编写它似乎不是一个好主意。


当前回答

这个解决方案是通用的,因为它对开放源代码和闭源应用程序都有用。

为应用程序创建一个操作系统用户。参见http://en.wikipedia.org/wiki/Principle_of_least_privilege 用密码为该用户创建一个(非会话)操作系统环境变量 作为该用户运行应用程序

优点:

您不会意外地将密码检入源代码控制,因为您不能这样做 您不会意外地搞砸文件权限。你可能会,但这不会影响这个。 只能由root或该用户读取。Root可以读取你所有的文件和加密密钥。 如果使用加密,如何安全地存储密钥? 作品x-platform 请确保不要将envvar传递给不受信任的子进程

这个方法是Heroku提出的,他很成功。

其他回答

只是把它放在配置文件的某个地方是通常完成的方式。只要确保你:

禁止从网络外的任何服务器访问数据库, 注意不要意外地向用户显示密码(在错误消息中,或通过PHP文件意外地作为HTML提供,等等)。

最好的办法是根本不存储密码! 例如,如果您在Windows系统上,并连接到SQL Server,则可以使用集成身份验证来使用当前进程的标识连接到数据库,而不需要密码。

如果您确实需要使用密码连接,首先对其进行加密,使用强加密(例如使用AES-256,然后保护加密密钥,或使用非对称加密并让操作系统保护证书),然后将其存储在具有强acl的配置文件中(在web目录之外)。

如果谈论的是数据库密码,而不是来自浏览器的密码,标准的做法似乎是将数据库密码放在服务器上的PHP配置文件中。

您只需要确保包含密码的php文件具有适当的权限即可。也就是说,它应该是可读的只有web服务器和您的用户帐户。

这个解决方案是通用的,因为它对开放源代码和闭源应用程序都有用。

为应用程序创建一个操作系统用户。参见http://en.wikipedia.org/wiki/Principle_of_least_privilege 用密码为该用户创建一个(非会话)操作系统环境变量 作为该用户运行应用程序

优点:

您不会意外地将密码检入源代码控制,因为您不能这样做 您不会意外地搞砸文件权限。你可能会,但这不会影响这个。 只能由root或该用户读取。Root可以读取你所有的文件和加密密钥。 如果使用加密,如何安全地存储密钥? 作品x-platform 请确保不要将envvar传递给不受信任的子进程

这个方法是Heroku提出的,他很成功。

你的选择是有限的,因为你说你需要密码来访问数据库。一种常用的方法是将用户名和密码存储在单独的配置文件中,而不是主脚本中。然后确保将其存储在主web树之外。这是如果有一个web配置问题,让你的php文件只是显示为文本,而不是执行,你还没有暴露密码。

除此之外,你是在正确的行与最小的访问所使用的帐户。再加上

不要使用用户名/密码的组合 将数据库服务器配置为只接受来自该用户的web主机的连接(如果DB在同一台机器上,localhost更好),这样即使凭证暴露出来,它们对任何人都没有用处,除非他们有其他访问机器的权限。 混淆密码(即使是ROT13也可以),如果有人访问了文件,它不会提供太多的防御,但至少可以防止随意查看它。

彼得