PHP 7.x mysqli_connect连接MySQL/MariaDB的密码哈希及安全问询
关于PHP 7.x连接MySQL/MariaDB的安全问题解答
1. mysqli_connect连接时,MySQL/MariaDB是否会哈希数据库密码?
嘿,这个问题得拆成两个场景说清楚:
首先,服务器端存储的密码本身是哈希后的:当你创建数据库用户(比如执行CREATE USER 'dev'@'localhost' IDENTIFIED BY 'your_pass';),MySQL/MariaDB会立刻用对应的认证算法(比如mysql_native_password或caching_sha2_password)把明文密码哈希,然后存在mysql.user表的authentication_string字段里,全程不会存明文。
然后是连接验证阶段:当你用mysqli_connect传递明文密码时,PHP的mysqli扩展会先根据服务器支持的协议,把密码做哈希/加密处理,再发送给服务器。服务器只会拿这个处理后的值,和自己预存的哈希值做对比——它根本不会接收你的明文密码,更不会再对传入的密码做哈希操作。
简单总结:连接过程中数据库不会哈希你传入的密码,验证逻辑是客户端先处理密码,服务器只做哈希值对比。
2. 直接把数据库密码写在PHP页面或引入文件是否安全?有什么最佳实践?
直接硬编码密码或者放在Web可访问的引入文件里安全性非常差,踩坑的概率很高:
- 要是服务器配置出问题(比如PHP解析失败,代码直接以文本形式输出),密码会直接暴露给访问者;
- 不小心把带密码的文件提交到Git这类版本控制系统,一旦仓库泄露,密码就彻底凉了;
- 共享主机环境下,其他用户可能有权限读取你的PHP文件,轻松拿到密码。
给你几个靠谱的最佳实践:
- 用环境变量存密码:把数据库密码设置成服务器的环境变量,PHP里用
getenv('DB_PASSWORD')获取就行。比如Apache里加SetEnv DB_PASSWORD "your_secure_pass",Nginx里用fastcgi_param DB_PASSWORD "your_secure_pass";,密码完全脱离代码,只在服务器配置里存在。 - 把配置文件放在Web根目录外:假设你的Web根目录是
/var/www/html,就把配置文件放到/var/www/config/db_config.php,PHP用绝对路径引入:require_once '/var/www/config/db_config.php';。这样就算服务器出问题,这个配置文件也不会被HTTP请求直接访问到。 - .env文件+版本控制忽略:如果是用框架(比如Laravel、Symfony),可以用
.env文件存密码,但一定要把.env加入.gitignore,绝对不能提交到代码仓库。同时给.env文件设严格权限:chmod 600 .env,只有文件所有者能读写。 - 锁死配置文件权限:不管用哪种方式存密码,对应的文件权限都要设为
600(Linux/Unix系统),避免其他用户读取。
内容的提问来源于stack exchange,提问作者Geekomancer
相关产品推荐
相关产品推荐

