必须在MySQL层面用GRANT SELECT,SHOW VIEW,LOCK TABLES ON .显式授权,不能依赖phpMyAdmin界面勾选或禁用按钮——因界面操作仅隐藏前端功能,权限未锁死;若权限仅设库级或未先REVOKE清空旧权限,ALTER/DROP仍生效,且phpMyAdmin基础功能(如数据库树、表结构查看)会异常或403。

只读权限必须在 MySQL 层面用 GRANT SELECT, SHOW VIEW, LOCK TABLES ON *.* 显式授予,不能靠 phpMyAdmin 界面勾选“只读”或禁用按钮来实现——那些只是前端隐藏,权限本身没锁死。
为什么在 phpMyAdmin 里勾掉 ALTER/DROP 还是能删表?
常见错误是把权限设在「数据库特定」级别(如 ON `prod_db`.*),但 phpMyAdmin 的数据库列表、表结构查看等功能依赖全局级 SELECT。一旦权限只给到库级,左侧树不显示、点击即 403,用户甚至无法登录成功。更隐蔽的是:如果该用户之前被授予过全局 DROP 或 ALTER,而你只在库级取消勾选,旧权限仍生效——MySQL 权限是叠加的,不是覆盖的。
- 务必先执行
REVOKE ALL PRIVILEGES ON *.* FROM 'inspector'@'192.168.1.%';清空历史权限 - 再执行
GRANT SELECT, SHOW VIEW, LOCK TABLES ON *.* TO 'inspector'@'192.168.1.%'; - 最后
FLUSH PRIVILEGES;,否则变更不落地
phpMyAdmin 自身哪些功能会绕过“只读”假象?
界面禁用按钮只是 CSS 灰显,不代表后端拦截。以下操作在权限未收紧时仍可触发写行为:
-
Export页面点「Quick export」会默认加LOCK TABLES,若用户没被授该权限,导出会报错并暴露表名、引擎等敏感信息 -
Structure页的「Create index」按钮,哪怕灰显,只要账号有INDEX权限就会渲染出来,一点就执行 -
SQL标签页允许输入任意语句,UPDATE报错只是权限拒绝,不是语法拦截——不能当安全边界用
真正有效的做法是在 config.inc.php 中加两行:
立即学习“PHP免费学习笔记(深入)”;
$cfg['Servers'][$i]['DisableIS'] = true; $cfg['ShowSQL'] = false;
前者关闭 INFORMATION_SCHEMA 检索,后者隐藏 SQL 执行框上方的「刷新」「清空」等危险入口。
为什么不用 MySQL 8.0 的 ROLE?
phpMyAdmin(截至 5.2.1)对角色支持不完整:用户登录后常出现数据库列表为空、权限页显示空白,或需手动执行 SET DEFAULT ROLE 才生效——而 phpMyAdmin 不自动执行这步。角色还引入中间态(如未 SET 就登录),排查困难。直接绑用户+全局最小权限,简单、可验证、无歧义。
最容易被忽略的一点:USAGE 权限看似最轻,但它连 SELECT 都不包含;而只给 SELECT 不给 SHOW VIEW,视图会直接显示「没有权限」,巡检第一步就卡住——这两个必须同时存在。



















