如何在PHP中保护数据库密码?

时间:2020-03-06 14:24:01  来源:igfitidea点击:

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

解决方案

我认为OP表示数据库密码。

除非有人通过FTP或者SSH访问服务器(在这种情况下,我们已经很烦了),否则我不会担心将密码以明文形式存储在PHP文件中。我见过的大多数PHP应用程序都是这样做的,例如phpbb。

将它们存储在Web根目录之外的文件中。

有人将其误解为关于如何在数据库中存储密码的问题。那是错的。它是关于如何存储使我们能够访问数据库的密码的。

通常的解决方案是将密码从源代码移到配置文件中。然后,由系统管理员来管理并保护该配置文件。这样,开发人员无需了解任何有关生产密码的信息,并且源代码管理中也没有密码记录。

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

除非我们有一些只允许php服务器进程访问数据库的方法,否则这几乎是我们可以做的所有事情。

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

我们只需要确保包含密码的php文件具有适当的权限即可。 IE。它只能由Web服务器和用户帐户读取。

只需将其放入配置文件中的某个位置即可。只要确保我们:

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

正如我们所说的那样,选择是有限的,因为我们需要密码才能访问数据库。一种通用方法是将用户名和密码存储在单独的配置文件中,而不是存储在主脚本中。然后确保将其存储在主Web树之外。就是说,如果有一个网络配置问题,使php文件仅以文本形式显示而不是被执行,则我们没有暴露密码。

除此之外,我们位于右边,对正在使用的帐户的访问权限最少。补充一点

  • 不要将用户名/密码的组合用于其他任何用途
  • 将数据库服务器配置为仅接受来自该用户的Web主机的连接(如果DB位于同一台计算机上,则localhost甚至更好)这样,即使公开了凭据,它们也不会对任何人有用,除非他们有权访问主机。机器。
  • 混淆密码(即使是ROT13也会混淆),即使有人确实可以访问该文件,也不会提供太多防御,但是至少可以防止随意查看该文件。

彼德

如果我们使用的是PostgreSQL,它将自动在〜/ .pgpass中查找密码。有关更多信息,请参见手册。

另一个技巧是使用一个如下所示的PHP单独的配置文件:

<?php exit() ?>

[...]

Plain text data including password

这不会阻止我们正确设置访问规则。但是,如果网站被黑," require"或者" include"将仅在第一行退出脚本,因此更难获得数据。

但是,永远不要将配置文件放在可以通过Web访问的目录中。我们应该有一个" Web"文件夹,其中包含控制器代码,css,图片和js。就这样。脱机文件夹中还有其他内容。

对于非常安全的系统,我们在配置文件中加密数据库密码(该密码本身由系统管理员保护)。在应用程序/服务器启动时,应用程序然后提示系统管理员输入解密密钥。然后从配置文件中读取数据库密码,将其解密并存储在内存中以备将来使用。由于它存储在解密后的内存中,仍然不是100%安全的,但是我们有时必须称其为"足够安全"!

如果可以在存储凭据的同一文件中创建数据库连接。内联connect语句中的凭据。

mysql_connect("localhost", "me", "mypass");

否则,最好在connect语句之后取消设置凭据,因为无法从内存中读取不在内存中的凭据;)

include("/outside-webroot/db_settings.php");  
mysql_connect("localhost", $db_user, $db_pass);  
unset ($db_user, $db_pass);

最好的方法是根本不存储密码!
例如,如果我们使用Windows系统并连接到SQL Server,则可以使用集成身份验证使用当前进程的身份,无需密码即可连接到数据库。

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

如果我们托管在其他人的服务器上,并且没有在Webroot之外的访问权限,则始终可以将密码和/或者数据库连接放入文件中,然后使用.htaccess锁定文件:

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