当php应用程序建立数据库连接时,它当然通常需要传递登录名和密码。如果我对我的应用程序使用一个最小权限登录,那么php需要知道该登录名和密码。保护该密码的最佳方法是什么?似乎仅仅在php代码中编写它不是一个好主意。
muk1a3rh1#
有几个人将此误解为关于如何在数据库中存储密码的问题。这是错误的。它是关于如何存储让您访问数据库的密码。通常的解决方案是将密码从源代码移到配置文件中。然后将管理和保护该配置文件的工作交给系统管理员。这样,开发人员就不需要知道任何有关生产密码的信息,并且在源代码管理中也没有密码记录。
cnh2zyt32#
如果您托管在其他服务器上,并且在webroot之外没有访问权限,则始终可以将密码和/或数据库连接放入文件中,然后使用.htaccess锁定该文件:
<files mypasswdfile> order allow,deny deny from all </files>
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"));
xmakbtuz4#
将它们存储在web根目录之外的文件中。
wlp8pajw5#
对于非常安全的系统,我们在配置文件中加密数据库密码(配置文件本身由系统管理员保护)。在应用程序/服务器启动时,应用程序会提示系统管理员输入解密密钥。然后从配置文件读取数据库密码,解密并存储在内存中以备将来使用。仍然不是100%安全,因为它是存储在内存中解密的,但您必须在某个时候称之为“足够安全”!
puruo6ea6#
此解决方案是通用的,因为它对开放源代码应用程序和封闭源代码应用程序都很有用。为应用程序创建操作系统用户。看见http://en.wikipedia.org/wiki/principle_of_least_privilege使用密码为该用户创建(非会话)os环境变量以该用户的身份运行应用程序优势:您不会意外地将密码检查到源代码管理中,因为您不能您不会意外地破坏文件权限。好吧,你可以,但这不会影响这个。只能由root用户或该用户读取。root用户可以以任何方式读取您的所有文件和加密密钥。如果使用加密,如何安全地存储密钥?works x平台确保不要将envvar传递给不受信任的子进程这种方法是由非常成功的heroku提出的。
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);
rm5edbpk8#
以前,我们将db user/pass存储在一个配置文件中,但后来进入了偏执模式——采用了纵深防御策略。如果您的应用程序遭到破坏,用户将拥有对您的配置文件的读取权限,因此可能会有黑客读取此信息。配置文件也可能会被版本控制缠住,或者被复制到服务器上。我们已经切换到在apache virtualhost中存储用户/传入环境变量集。此配置只能由root用户读取——希望您的apache用户不是以root用户身份运行。这样做的缺点是密码现在位于全局php变量中。为了降低这一风险,我们采取了以下预防措施:密码是加密的。我们扩展了pdo类,以包含用于解密密码的逻辑。如果有人阅读了我们建立连接的代码,那么很明显,连接是用加密密码建立的,而不是密码本身。加密密码从全局变量移动到私有变量。应用程序立即执行此操作,以减少值在全局空间中可用的窗口。 phpinfo() 它是残疾的。phpinfo是一个很容易获得包括环境变量在内的所有内容概览的目标。
phpinfo()
iyfamqjs9#
如果您使用的是postgresql,那么它会在 ~/.pgpass 自动输入密码。有关更多信息,请参阅手册。
~/.pgpass
nfzehxib10#
您的选择有点有限,因为您说需要密码才能访问数据库。一种通用方法是将用户名和密码存储在单独的配置文件中,而不是主脚本中。然后确保将其存储在主web树之外。如果存在web配置问题,导致php文件只显示为文本而不是执行,那么您就没有公开密码。除此之外,您对正在使用的帐户的访问权限最小。再加上不要将用户名/密码组合用于任何其他用途将数据库服务器配置为仅接受来自该用户的web主机的连接(如果数据库位于同一台计算机上,则localhost更好),这样即使凭据已公开,也不会对任何人有用,除非他们具有对该机的其他访问权限。混淆密码(即使rot13也可以)如果有人访问该文件,它不会提供太多防御,但至少可以防止随意查看该文件。彼得
sqxo8psd11#
我们通过以下方式解决了这个问题:在服务器上使用memcache,并打开与其他密码服务器的连接。将密码(甚至所有加密的password.php文件)和解密密钥保存到memcache。该网站调用持有密码文件的memcache密钥来解密内存中的所有密码。密码服务器每5分钟发送一个新的加密密码文件。如果您在项目中使用encrypted password.php,那么您将进行审计,检查此文件是否在外部接触或查看。发生这种情况时,您可以自动清理内存,并关闭服务器进行访问。
wfypjpf412#
将数据库密码放入文件中,使其对提供文件服务的用户为只读。除非您有某种方法只允许php服务器进程访问数据库,否则这几乎是您所能做的全部。
ogsagwnx13#
如果您谈论的是数据库密码,而不是来自浏览器的密码,那么标准做法似乎是将数据库密码放在服务器上的php配置文件中。您只需要确保包含密码的php文件具有相应的权限。i、 e.它应该只能由web服务器和您的用户帐户读取。
vsmadaxz14#
另一个技巧是使用一个单独的php配置文件,如下所示:
<?php exit() ?> [...] Plain text data including password
这并不妨碍您正确设置访问规则。但是,如果您的网站被黑客攻击,那么“require”或“include”将在第一行退出脚本,因此获取数据更加困难。但是,千万不要让配置文件位于可以通过web访问的目录中。您应该有一个“web”文件夹,其中包含您的控制器代码、css、图片和js。这就是全部。其他任何内容都会放在脱机文件夹中。
nzkunb0c15#
通常的做法是将其放入某个配置文件中。只要确保你:不允许从网络之外的任何服务器访问数据库,注意不要意外地向用户显示密码(在错误消息中,或通过php文件意外地用作html等等)
17条答案
按热度按时间muk1a3rh1#
有几个人将此误解为关于如何在数据库中存储密码的问题。这是错误的。它是关于如何存储让您访问数据库的密码。
通常的解决方案是将密码从源代码移到配置文件中。然后将管理和保护该配置文件的工作交给系统管理员。这样,开发人员就不需要知道任何有关生产密码的信息,并且在源代码管理中也没有密码记录。
cnh2zyt32#
如果您托管在其他服务器上,并且在webroot之外没有访问权限,则始终可以将密码和/或数据库连接放入文件中,然后使用.htaccess锁定该文件:
ghhaqwfi3#
最安全的方法是根本不在php代码中指定信息。
如果您使用的是apache,这意味着要在httpd.conf或虚拟主机文件中设置连接详细信息。如果这样做,就可以调用mysql_connect(),而无需任何参数,这意味着php永远不会输出您的信息。
以下是在这些文件中指定这些值的方式:
然后按如下方式打开mysql连接:
或者像这样:
xmakbtuz4#
将它们存储在web根目录之外的文件中。
wlp8pajw5#
对于非常安全的系统,我们在配置文件中加密数据库密码(配置文件本身由系统管理员保护)。在应用程序/服务器启动时,应用程序会提示系统管理员输入解密密钥。然后从配置文件读取数据库密码,解密并存储在内存中以备将来使用。仍然不是100%安全,因为它是存储在内存中解密的,但您必须在某个时候称之为“足够安全”!
puruo6ea6#
此解决方案是通用的,因为它对开放源代码应用程序和封闭源代码应用程序都很有用。
为应用程序创建操作系统用户。看见http://en.wikipedia.org/wiki/principle_of_least_privilege
使用密码为该用户创建(非会话)os环境变量
以该用户的身份运行应用程序
优势:
您不会意外地将密码检查到源代码管理中,因为您不能
您不会意外地破坏文件权限。好吧,你可以,但这不会影响这个。
只能由root用户或该用户读取。root用户可以以任何方式读取您的所有文件和加密密钥。
如果使用加密,如何安全地存储密钥?
works x平台
确保不要将envvar传递给不受信任的子进程
这种方法是由非常成功的heroku提出的。
7z5jn7bk7#
如果可以在存储凭据的同一文件中创建数据库连接。在connect语句中内联凭据。
否则,最好在connect语句之后取消设置凭据,因为不在内存中的凭据无法从内存中读取;)
rm5edbpk8#
以前,我们将db user/pass存储在一个配置文件中,但后来进入了偏执模式——采用了纵深防御策略。
如果您的应用程序遭到破坏,用户将拥有对您的配置文件的读取权限,因此可能会有黑客读取此信息。配置文件也可能会被版本控制缠住,或者被复制到服务器上。
我们已经切换到在apache virtualhost中存储用户/传入环境变量集。此配置只能由root用户读取——希望您的apache用户不是以root用户身份运行。
这样做的缺点是密码现在位于全局php变量中。
为了降低这一风险,我们采取了以下预防措施:
密码是加密的。我们扩展了pdo类,以包含用于解密密码的逻辑。如果有人阅读了我们建立连接的代码,那么很明显,连接是用加密密码建立的,而不是密码本身。
加密密码从全局变量移动到私有变量。应用程序立即执行此操作,以减少值在全局空间中可用的窗口。
phpinfo()
它是残疾的。phpinfo是一个很容易获得包括环境变量在内的所有内容概览的目标。iyfamqjs9#
如果您使用的是postgresql,那么它会在
~/.pgpass
自动输入密码。有关更多信息,请参阅手册。nfzehxib10#
您的选择有点有限,因为您说需要密码才能访问数据库。一种通用方法是将用户名和密码存储在单独的配置文件中,而不是主脚本中。然后确保将其存储在主web树之外。如果存在web配置问题,导致php文件只显示为文本而不是执行,那么您就没有公开密码。
除此之外,您对正在使用的帐户的访问权限最小。再加上
不要将用户名/密码组合用于任何其他用途
将数据库服务器配置为仅接受来自该用户的web主机的连接(如果数据库位于同一台计算机上,则localhost更好),这样即使凭据已公开,也不会对任何人有用,除非他们具有对该机的其他访问权限。
混淆密码(即使rot13也可以)如果有人访问该文件,它不会提供太多防御,但至少可以防止随意查看该文件。
彼得
sqxo8psd11#
我们通过以下方式解决了这个问题:
在服务器上使用memcache,并打开与其他密码服务器的连接。
将密码(甚至所有加密的password.php文件)和解密密钥保存到memcache。
该网站调用持有密码文件的memcache密钥来解密内存中的所有密码。
密码服务器每5分钟发送一个新的加密密码文件。
如果您在项目中使用encrypted password.php,那么您将进行审计,检查此文件是否在外部接触或查看。发生这种情况时,您可以自动清理内存,并关闭服务器进行访问。
wfypjpf412#
将数据库密码放入文件中,使其对提供文件服务的用户为只读。
除非您有某种方法只允许php服务器进程访问数据库,否则这几乎是您所能做的全部。
ogsagwnx13#
如果您谈论的是数据库密码,而不是来自浏览器的密码,那么标准做法似乎是将数据库密码放在服务器上的php配置文件中。
您只需要确保包含密码的php文件具有相应的权限。i、 e.它应该只能由web服务器和您的用户帐户读取。
vsmadaxz14#
另一个技巧是使用一个单独的php配置文件,如下所示:
这并不妨碍您正确设置访问规则。但是,如果您的网站被黑客攻击,那么“require”或“include”将在第一行退出脚本,因此获取数据更加困难。
但是,千万不要让配置文件位于可以通过web访问的目录中。您应该有一个“web”文件夹,其中包含您的控制器代码、css、图片和js。这就是全部。其他任何内容都会放在脱机文件夹中。
nzkunb0c15#
通常的做法是将其放入某个配置文件中。只要确保你:
不允许从网络之外的任何服务器访问数据库,
注意不要意外地向用户显示密码(在错误消息中,或通过php文件意外地用作html等等)