当PHP应用程序建立数据库连接时,当然通常需要传递登录名和密码。如果我对我的应用程序使用一个最小权限的登录,那么PHP需要知道这个登录名和密码。保护密码的最好方法是什么?只在PHP代码中编写它似乎不是一个好主意。
当前回答
这个解决方案是通用的,因为它对开放源代码和闭源应用程序都有用。
为应用程序创建一个操作系统用户。参见http://en.wikipedia.org/wiki/Principle_of_least_privilege 用密码为该用户创建一个(非会话)操作系统环境变量 作为该用户运行应用程序
优点:
您不会意外地将密码检入源代码控制,因为您不能这样做 您不会意外地搞砸文件权限。你可能会,但这不会影响这个。 只能由root或该用户读取。Root可以读取你所有的文件和加密密钥。 如果使用加密,如何安全地存储密钥? 作品x-platform 请确保不要将envvar传递给不受信任的子进程
这个方法是Heroku提出的,他很成功。
其他回答
一个额外的技巧是使用一个PHP单独的配置文件,如下所示:
<?php exit() ?>
[...]
Plain text data including password
这并不妨碍您正确地设置访问规则。但如果你的网站被黑客攻击,“要求”或“包括”将在第一行退出脚本,因此更难获得数据。
然而,不要让配置文件在可以通过web访问的目录中。你应该有一个“Web”文件夹,包含你的控制器代码,css,图片和js。这是所有。其他的都放在脱机文件夹中。
只是把它放在配置文件的某个地方是通常完成的方式。只要确保你:
禁止从网络外的任何服务器访问数据库, 注意不要意外地向用户显示密码(在错误消息中,或通过PHP文件意外地作为HTML提供,等等)。
如果你在别人的服务器上托管,在你的webroot之外没有访问权限,你可以把你的密码和/或数据库连接放在一个文件中,然后使用.htaccess锁定文件:
<files mypasswdfile>
order allow,deny
deny from all
</files>
是否可以在存储凭据的同一文件中创建数据库连接。将凭据内联到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的json_encode函数转换UTF-8字符串为十六进制实体?
- 将表从一个数据库复制到另一个数据库的最简单方法?
- 主体、使用者和主体之间的意义和区别是什么?
- 什么是分片,为什么它很重要?
- 如何从一个查询插入多行使用雄辩/流利
- 数据库触发器是必要的吗?
- 在PHP单元测试执行期间,如何在CLI中输出?
- 在PHP中使用heredoc的优势是什么?
- PHP中的echo, print和print_r有什么区别?
- 为什么我应该使用基于文档的数据库而不是关系数据库?
- 哪个更快/最好?SELECT *或SELECT columnn1, colum2, column3等
- 将值从同一表中的一列复制到另一列
- 如何将XML转换成PHP数组?
- 什么是数据库池?
- 如何将对象转换为数组?