创建应用专用数据库用户时必须显式指定主机名,生产环境禁用localhost和%通配符,权限按最小必要原则授予特定数据库,连接时host统一写127.0.0.1并执行FLUSH PRIVILEGES生效。
创建应用专用数据库用户时,必须显式指定主机名
直接在 phpmyadmin 的「用户账户」页点「新增用户账户」,填用户名和密码后,host 字段别留默认的 localhost 或空值。生产环境里,应用通常不在数据库本机运行(比如 php 服务在另一台服务器),如果设成 localhost,远程连接会报错 access denied for user 'xxx'@'xxx.xxx.xxx.xxx'。
实操建议:
- 若应用与 MySQL 同机(如 Docker Compose 网络内),用
127.0.0.1(避免 Unix socket 误匹配) - 若应用在另一台机器,填具体 IP,或更安全地用子网段(如
192.168.10.%) - 绝对不要用
%—— 这等于开放所有来源,连公网扫描器都能撞库
给账号授最小必要权限,别点「全选」
phpMyAdmin 创建用户后,默认没任何权限。进「检查权限」页手动勾选时,常见错误是把 SELECT、INSERT、UPDATE、DELETE 全打钩,甚至加上 DROP 和 ALTER。一旦应用被注入或配置泄露,攻击者能删表、改结构。
实操建议:
- 只授予当前应用明确需要的权限:Web 前端读写通常只需
SELECT、INSERT、UPDATE、DELETE - 后台管理类操作才额外加
CREATE(如上传附件建临时表),但应隔离到独立账号 - 永远不给
FILE权限(可读写服务器文件)、GRANT OPTION(可转授权限) - 权限作用范围选「特定数据库」,不是「所有数据库」;数据库名填应用专属库名,如
myapp_prod
应用连接字符串里的 host 不能写 localhost
很多开发者以为账号 Host 设了 127.0.0.1,代码里就该写 localhost —— 实际上 MySQL 把这两者当不同主机处理:localhost 强制走 Unix socket,127.0.0.1 才走 TCP。如果账号只允许 127.0.0.1,而 PHP 用 localhost 连,就会提示 Access denied for user 'xxx'@'localhost'。
立即学习“PHP免费学习笔记(深入)”;
实操建议:
- PHP 连接时,
$host变量统一写127.0.0.1(即使同机) - 检查
mysqli_connect()或 PDO DSN 中的 host 参数是否硬编码为localhost - 环境变量配置(如
DB_HOST)也需同步改为127.0.0.1
phpMyAdmin 用户列表里看不到新账号?检查刷新时机
创建完用户后立刻回「用户账户」页,有时新账号不显示。这不是失败,而是 phpMyAdmin 缓存了用户列表(尤其启用了某些插件或代理层)。更麻烦的是,权限变更不会实时生效,MySQL 需要重载权限表。
实操建议:
- 创建完成后,点页面右上角「刷新」按钮(不是浏览器 F5)
- 如果仍不显示,执行 SQL 手动验证:
SELECT User, Host FROM mysql.user WHERE User = 'your_app_user'; - 权限修改后,必须执行
FLUSH PRIVILEGES;—— phpMyAdmin 不自动帮你做这步 - 测试连接前,先用命令行验证:
mysql -u your_app_user -p -h 127.0.0.1 myapp_prod











