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


当前回答

如果你在别人的服务器上托管,在你的webroot之外没有访问权限,你可以把你的密码和/或数据库连接放在一个文件中,然后使用.htaccess锁定文件:

<files mypasswdfile>
order allow,deny
deny from all
</files>

其他回答

将它们存储在web根目录外的一个文件中。

有些人把这个问题误解为如何在数据库中存储密码。这是错误的。它是关于如何存储密码,让您进入数据库。

通常的解决方案是将密码从源代码移到配置文件中。然后,将管理和保护配置文件的工作交给系统管理员。这样,开发人员就不需要知道任何关于产品密码的信息,并且在源代码控制中也没有密码记录。

将数据库密码放在一个文件中,使其对提供文件的用户只读。

除非您有某种方法只允许php服务器进程访问数据库,否则这几乎就是您所能做的全部工作。

之前我们将DB user/pass存储在一个配置文件中,但后来进入了偏执模式——采用了深度防御策略。

如果您的应用程序被泄露,用户将拥有对您的配置文件的读访问权,因此黑客就有可能读取这些信息。配置文件也可能在版本控制中被捕获,或者在服务器中被复制。

我们已经切换到在Apache VirtualHost中设置的环境变量中存储user/pass。这个配置只能由根用户读取——希望您的Apache用户不是以根用户身份运行。

这样做的缺点是,现在密码在一个全局PHP变量中。

为了降低这种风险,我们有以下预防措施:

The password is encrypted. We extend the PDO class to include logic for decrypting the password. If someone reads the code where we establish a connection, it won't be obvious that the connection is being established with an encrypted password and not the password itself. The encrypted password is moved from the global variables into a private variable The application does this immediately to reduce the window that the value is available in the global space. phpinfo() is disabled. PHPInfo is an easy target to get an overview of everything, including environment variables.

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

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

优点:

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

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