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

niknxzdl  于 2021-10-10  发布在  Java
关注(0)|答案(17)|浏览(406)

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

muk1a3rh

muk1a3rh1#

有几个人将此误解为关于如何在数据库中存储密码的问题。这是错误的。它是关于如何存储让您访问数据库的密码。
通常的解决方案是将密码从源代码移到配置文件中。然后将管理和保护该配置文件的工作交给系统管理员。这样,开发人员就不需要知道任何有关生产密码的信息,并且在源代码管理中也没有密码记录。

cnh2zyt3

cnh2zyt32#

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

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

ghhaqwfi3#

最安全的方法是根本不在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"));
xmakbtuz

xmakbtuz4#

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

wlp8pajw

wlp8pajw5#

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

puruo6ea

puruo6ea6#

此解决方案是通用的,因为它对开放源代码应用程序和封闭源代码应用程序都很有用。
为应用程序创建操作系统用户。看见http://en.wikipedia.org/wiki/principle_of_least_privilege
使用密码为该用户创建(非会话)os环境变量
以该用户的身份运行应用程序
优势:
您不会意外地将密码检查到源代码管理中,因为您不能
您不会意外地破坏文件权限。好吧,你可以,但这不会影响这个。
只能由root用户或该用户读取。root用户可以以任何方式读取您的所有文件和加密密钥。
如果使用加密,如何安全地存储密钥?
works x平台
确保不要将envvar传递给不受信任的子进程
这种方法是由非常成功的heroku提出的。

7z5jn7bk

7z5jn7bk7#

如果可以在存储凭据的同一文件中创建数据库连接。在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);
rm5edbpk

rm5edbpk8#

以前,我们将db user/pass存储在一个配置文件中,但后来进入了偏执模式——采用了纵深防御策略。
如果您的应用程序遭到破坏,用户将拥有对您的配置文件的读取权限,因此可能会有黑客读取此信息。配置文件也可能会被版本控制缠住,或者被复制到服务器上。
我们已经切换到在apache virtualhost中存储用户/传入环境变量集。此配置只能由root用户读取——希望您的apache用户不是以root用户身份运行。
这样做的缺点是密码现在位于全局php变量中。
为了降低这一风险,我们采取了以下预防措施:
密码是加密的。我们扩展了pdo类,以包含用于解密密码的逻辑。如果有人阅读了我们建立连接的代码,那么很明显,连接是用加密密码建立的,而不是密码本身。
加密密码从全局变量移动到私有变量。应用程序立即执行此操作,以减少值在全局空间中可用的窗口。 phpinfo() 它是残疾的。phpinfo是一个很容易获得包括环境变量在内的所有内容概览的目标。

iyfamqjs

iyfamqjs9#

如果您使用的是postgresql,那么它会在 ~/.pgpass 自动输入密码。有关更多信息,请参阅手册。

nfzehxib

nfzehxib10#

您的选择有点有限,因为您说需要密码才能访问数据库。一种通用方法是将用户名和密码存储在单独的配置文件中,而不是主脚本中。然后确保将其存储在主web树之外。如果存在web配置问题,导致php文件只显示为文本而不是执行,那么您就没有公开密码。
除此之外,您对正在使用的帐户的访问权限最小。再加上
不要将用户名/密码组合用于任何其他用途
将数据库服务器配置为仅接受来自该用户的web主机的连接(如果数据库位于同一台计算机上,则localhost更好),这样即使凭据已公开,也不会对任何人有用,除非他们具有对该机的其他访问权限。
混淆密码(即使rot13也可以)如果有人访问该文件,它不会提供太多防御,但至少可以防止随意查看该文件。
彼得

sqxo8psd

sqxo8psd11#

我们通过以下方式解决了这个问题:
在服务器上使用memcache,并打开与其他密码服务器的连接。
将密码(甚至所有加密的password.php文件)和解密密钥保存到memcache。
该网站调用持有密码文件的memcache密钥来解密内存中的所有密码。
密码服务器每5分钟发送一个新的加密密码文件。
如果您在项目中使用encrypted password.php,那么您将进行审计,检查此文件是否在外部接触或查看。发生这种情况时,您可以自动清理内存,并关闭服务器进行访问。

wfypjpf4

wfypjpf412#

将数据库密码放入文件中,使其对提供文件服务的用户为只读。
除非您有某种方法只允许php服务器进程访问数据库,否则这几乎是您所能做的全部。

ogsagwnx

ogsagwnx13#

如果您谈论的是数据库密码,而不是来自浏览器的密码,那么标准做法似乎是将数据库密码放在服务器上的php配置文件中。
您只需要确保包含密码的php文件具有相应的权限。i、 e.它应该只能由web服务器和您的用户帐户读取。

vsmadaxz

vsmadaxz14#

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

<?php exit() ?>

[...]

Plain text data including password

这并不妨碍您正确设置访问规则。但是,如果您的网站被黑客攻击,那么“require”或“include”将在第一行退出脚本,因此获取数据更加困难。
但是,千万不要让配置文件位于可以通过web访问的目录中。您应该有一个“web”文件夹,其中包含您的控制器代码、css、图片和js。这就是全部。其他任何内容都会放在脱机文件夹中。

nzkunb0c

nzkunb0c15#

通常的做法是将其放入某个配置文件中。只要确保你:
不允许从网络之外的任何服务器访问数据库,
注意不要意外地向用户显示密码(在错误消息中,或通过php文件意外地用作html等等)

相关问题