当PHP应用程序建立数据库连接时,当然通常需要传递登录名和密码。如果我对我的应用程序使用一个最小权限的登录,那么PHP需要知道这个登录名和密码。保护密码的最好方法是什么?只在PHP代码中编写它似乎不是一个好主意。
当前回答
如果你正在使用PostgreSQL,那么它在~/。Pgpass自动设置密码。有关更多信息,请参阅手册。
其他回答
是否可以在存储凭据的同一文件中创建数据库连接。将凭据内联到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);
最安全的方法是在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"));
将数据库密码放在一个文件中,使其对提供文件的用户只读。
除非您有某种方法只允许php服务器进程访问数据库,否则这几乎就是您所能做的全部工作。
实际上,最好的做法是将数据库凭据存储在环境变量中,因为:
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"
文档:
一个额外的技巧是使用一个PHP单独的配置文件,如下所示:
<?php exit() ?>
[...]
Plain text data including password
这并不妨碍您正确地设置访问规则。但如果你的网站被黑客攻击,“要求”或“包括”将在第一行退出脚本,因此更难获得数据。
然而,不要让配置文件在可以通过web访问的目录中。你应该有一个“Web”文件夹,包含你的控制器代码,css,图片和js。这是所有。其他的都放在脱机文件夹中。
推荐文章
- 为什么PHP的json_encode函数转换UTF-8字符串为十六进制实体?
- 将表从一个数据库复制到另一个数据库的最简单方法?
- 主体、使用者和主体之间的意义和区别是什么?
- 什么是分片,为什么它很重要?
- 如何从一个查询插入多行使用雄辩/流利
- 数据库触发器是必要的吗?
- 在PHP单元测试执行期间,如何在CLI中输出?
- 在PHP中使用heredoc的优势是什么?
- PHP中的echo, print和print_r有什么区别?
- 为什么我应该使用基于文档的数据库而不是关系数据库?
- 哪个更快/最好?SELECT *或SELECT columnn1, colum2, column3等
- 将值从同一表中的一列复制到另一列
- 如何将XML转换成PHP数组?
- 什么是数据库池?
- 如何将对象转换为数组?