当PHP应用程序建立数据库连接时,通常当然需要传递登录名和密码。 如果我为我的应用程序使用单个最小权限登录名,则PHP需要在某个地方知道该登录名和密码。 保护该密码的最佳方法是什么? 似乎只在PHP代码中编写它不是一个好主意。
#1楼
另一个技巧是使用一个如下所示的PHP单独的配置文件:
<?php exit() ?>
[...]
Plain text data including password
这不会阻止您正确设置访问规则。 但是,如果您的网站被黑,“ require”或“ include”将仅在第一行退出脚本,因此更难以获取数据。
但是,永远不要将配置文件放在可以通过Web访问的目录中。 您应该有一个“ Web”文件夹,其中包含您的控制器代码,css,图片和js。 就这样。 脱机文件夹中还有其他内容。
#2楼
最安全的方法是完全不使用PHP代码中指定的信息。
如果使用Apache,则意味着在httpd.conf或虚拟主机文件文件中设置连接详细信息。 如果这样做,则可以不带任何参数调用mysql_connect(),这意味着PHP将永远不会输出您的信息。
这是您在这些文件中指定这些值的方式:
php_value mysql.default.user myusername
php_value mysql.default.password mypassword
php_value mysql.default.host server
然后您像这样打开mysql连接:
<?php
$db = mysqli_connect();
或像这样:
<?php
$db = mysqli_connect(ini_get("mysql.default.user"),
ini_get("mysql.default.password"),
ini_get("mysql.default.host"));
#3楼
对于非常安全的系统,我们将数据库密码加密在一个配置文件中(该密码本身由系统管理员保护)。 在应用程序/服务器启动时,应用程序然后提示系统管理员输入解密密钥。 然后从配置文件中读取数据库密码,解密并存储在内存中以备将来使用。 由于它存储在已解密的内存中,因此仍不是100%安全的,但是您有时必须称其为“足够安全”!
#4楼
如果可以在存储凭据的同一文件中创建数据库连接。 内联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);
#5楼
最好的方法是根本不存储密码!
例如,如果您在Windows系统上并连接到SQL Server,则可以使用集成身份验证使用当前进程的身份,无需密码即可连接到数据库。
如果你需要一个密码时,先进行加密连接,使用强大的加密(例如,使用AES-256,然后保护加密密钥,或使用非对称加密,并有操作系统保护证书),然后将其存储在一个具有强ACL的配置文件(位于Web目录外部)。
#6楼
如果您托管在其他人的服务器上,并且没有在Webroot之外的访问权限,则始终可以将密码和/或数据库连接放入文件中,然后使用.htaccess锁定文件:
<files mypasswdfile>
order allow,deny
deny from all
</files>
#7楼
该解决方案是通用的,因为它对开放源代码应用程序和封闭源代码应用程序都很有用。
- 为您的应用程序创建OS用户。 参见http://en.wikipedia.org/wiki/Principle_of_least_privilege
- 使用密码为该用户创建(非会话)OS环境变量
- 以该用户身份运行该应用程序
好处:
- 您不会偶然将密码签入源代码管理中,因为您不能
- 您不会意外搞乱文件权限。 好吧,也许可以,但这不会影响到这一点。
- 只能由root或该用户读取。 Root仍然可以读取您的所有文件和加密密钥。
- 如果使用加密,如何安全地存储密钥?
- 适用于x平台
- 确保不要将envvar传递给不受信任的子进程
此方法由非常成功的Heroku建议。
#8楼
我们已经通过以下方式解决了它:
- 在服务器上使用内存缓存,并与其他密码服务器建立开放连接。
- 将密码(甚至所有已加密的password.php文件)和解密密钥保存到内存缓存中。
- 该网站调用保存密码文件密码的memcache密钥,并在内存中解密所有密码。
- 密码服务器每5分钟发送一次新的加密密码文件。
- 如果在项目上使用加密的password.php,则进行审核,检查该文件是否在外部被触摸或查看过。 发生这种情况时,您可以自动清理内存并关闭服务器以进行访问。
#9楼
以前,我们将DB用户/密码存储在配置文件中,但此后一直处于偏执状态-采用“ 深度防御”策略。
如果您的应用程序受到威胁,则用户将拥有对您的配置文件的读取访问权限,因此,破解者有可能读取此信息。 配置文件也可能陷入版本控制中,或在服务器周围复制。
我们已经切换到将用户/传递存储在Apache VirtualHost中设置的环境变量中。 此配置只能由root用户读取-希望您的Apache用户不是root用户运行。
这样做的缺点是现在密码在Global PHP变量中。
为了减轻这种风险,我们采取以下预防措施:
- 密码已加密。 我们扩展了PDO类,以包括用于解密密码的逻辑。 如果有人在我们建立连接的地方读取了代码,则显然不是使用加密密码而不是密码本身来建立连接。
- 加密的密码从全局变量移至私有变量 。应用程序立即执行此操作,以减小该值在全局空间中可用的窗口。
-
phpinfo()
被禁用。 PHPInfo是一个容易获得的目标,可以全面了解所有内容,包括环境变量。
#10楼
将它们存储在Web根目录之外的文件中。
#11楼
有人将其误解为关于如何在数据库中存储密码的问题。 那是错的。 它是关于如何存储使您能够访问数据库的密码的。
通常的解决方案是将密码从源代码移到配置文件中。 然后,由系统管理员来管理并保护该配置文件。 这样,开发人员无需了解任何有关生产密码的信息,并且在源代码管理中也没有密码的记录。
#12楼
将数据库密码放在文件中,使其对提供文件的用户只读。
除非您有一些只允许php服务器进程访问数据库的方法,否则这几乎是您可以做的。
#13楼
如果您在谈论数据库密码,而不是来自浏览器的密码,那么标准做法似乎是将数据库密码放在服务器上的PHP配置文件中。
您只需要确保包含密码的php文件具有适当的权限即可。 也就是说,它只能由Web服务器和您的用户帐户读取。
#14楼
只需将其放入配置文件中的某个位置即可。 只要确保您:
- 禁止从网络外部的任何服务器访问数据库,
- 请注意不要不小心向用户显示密码(在错误消息中,或者通过不小心被用作HTML等的PHP文件)。
#15楼
正如您所说的那样,您的选择是有限的,因为您需要密码才能访问数据库。 一种通用方法是将用户名和密码存储在单独的配置文件中,而不是主脚本中。 然后确保将其存储在主Web树之外。 就是说,如果有一个网络配置问题,使您的php文件仅以文本形式显示而不是被执行,则您没有暴露密码。
除此之外,您位于右边,对正在使用的帐户的访问权限最少。 加上
- 不要将用户名/密码的组合用于其他任何用途
- 将数据库服务器配置为仅接受来自该用户的Web主机的连接(如果数据库位于同一台计算机上,则localhost甚至更好)这样,即使公开了凭据,它们也不会对任何人有用,除非他们有权访问该主机。机。
- 混淆密码(即使是ROT13也会混淆),即使有人确实可以访问该文件,也不会提供太多防御,但是至少可以防止随意查看该文件。
彼得
#16楼
如果您使用的是PostgreSQL,它将自动在~/.pgpass
查找密码。 有关更多信息,请参见手册 。
来源:CSDN
作者:asdfgh0077
链接:https://blog.csdn.net/asdfgh0077/article/details/104233367