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


当前回答

是否可以在存储凭据的同一文件中创建数据库连接。将凭据内联到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);  

其他回答

之前我们将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.

你的选择是有限的,因为你说你需要密码来访问数据库。一种常用的方法是将用户名和密码存储在单独的配置文件中,而不是主脚本中。然后确保将其存储在主web树之外。这是如果有一个web配置问题,让你的php文件只是显示为文本,而不是执行,你还没有暴露密码。

除此之外,你是在正确的行与最小的访问所使用的帐户。再加上

不要使用用户名/密码的组合 将数据库服务器配置为只接受来自该用户的web主机的连接(如果DB在同一台机器上,localhost更好),这样即使凭证暴露出来,它们对任何人都没有用处,除非他们有其他访问机器的权限。 混淆密码(即使是ROT13也可以),如果有人访问了文件,它不会提供太多的防御,但至少可以防止随意查看它。

彼得

是否可以在存储凭据的同一文件中创建数据库连接。将凭据内联到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);  

实际上,最好的做法是将数据库凭据存储在环境变量中,因为:

These credentials are dependant to environment, it means that you won't have the same credentials in dev/prod. Storing them in the same file for all environment is a mistake. Credentials are not related to business logic which means login and password have nothing to do in your code. You can set environment variables without creating any business code class file, which means you will never make the mistake of adding the credential files to a commit in Git. Environments variables are superglobales : you can use them everywhere in your code without including any file.

如何使用它们?

使用$_ENV数组: 设置:$_ENV['MYVAR'] = $ MYVAR 获取:echo $_ENV["MYVAR"] 使用php函数: 设置与putenv函数- putenv("MYVAR=$ MYVAR "); 使用getenv函数获取- getenv('MYVAR'); 在vhosts文件和.htaccess中,但不建议这样做,因为它在另一个文件中,这样做并不能解决问题。

您可以轻松地删除包含所有环境变量的文件(如envars .php)并执行它(php envars .php)并删除它。这有点老派,但它仍然可以工作,而且服务器中没有任何带有凭据的文件,代码中也没有凭据。由于这有点费力,框架做得更好。

Symfony的例子(不只是PHP) 像Symfony这样的现代框架建议使用环境变量,并将它们存储在.env未提交的文件中或直接存储在命令行中,这意味着你可以这样做:

使用CLI: symfony var:set FOO=bar——env-level 用。env或。env。local: FOO="bar"

文档:

如果你正在使用PostgreSQL,那么它在~/。Pgpass自动设置密码。有关更多信息,请参阅手册。