普通用户能删库是因为phpmyadmin默认允许有drop权限的用户执行drop database且界面不校验权限粒度;需同时设置$cfg['allowuserdropdatabase'] = false并收回mysql层drop权限,再禁用$cfg['ignoremultisubmiterrors']以实现双保险。
为什么普通用户能删库?默认配置没关掉这个开关
phpmyadmin 默认允许有 drop 权限的用户执行 drop database,但界面层不校验权限粒度——只要 mysql 账号本身有 drop 权限,phpmyadmin 就会显示「删除数据库」按钮。很多人以为只在 phpmyadmin 里不给权限就安全了,其实不是:mysql 层的权限才是决定性因素。
$cfg['AllowUserDropDatabase'] = false 是最直接的开关
这个配置项控制 phpMyAdmin 是否渲染删除数据库按钮。设为 false 后,即使用户账号有 DROP 权限,界面上也根本看不到「删除」链接或弹窗提示。
- 修改位置:在
config.inc.php(不是config.default.php)中添加或修改这一行 - 必须写在
$cfg['Servers'][$i]配置块**之外**,全局生效 - 值必须是布尔型
false,不是字符串'false',否则无效 - 改完不用重启 Web 服务,但需清空浏览器缓存或换无痕窗口验证
MySQL 层必须同步收回 DROP 权限
光关按钮没用。攻击者可绕过 phpMyAdmin,直接连 MySQL 执行 DROP DATABASE xxx。所以必须从源头撤销权限:
- 用管理员账号登录 phpMyAdmin → 进入「用户账户」→ 编辑目标用户 → 取消勾选「DROP」权限(注意:是在「全局权限」或「数据库特定权限」里操作)
- 执行后点击「执行」,别忘了保存;若用命令行,运行
REVOKE DROP ON *.* FROM 'username'@'host'; - 特别注意:如果用户被授予了
ALL PRIVILEGES,先REVOKE ALL再重新授最小权限,否则REVOKE DROP不生效 - 验证方式:用该用户登录后执行
SHOW GRANTS;,确认输出里没有DROP
别漏掉 config.inc.php 里的 $cfg['IgnoreMultiSubmitErrors'] 隐患
这个参数默认为 true,会导致批量操作(比如同时删多个库)时跳过权限错误继续执行。一旦用户误点或被诱导提交恶意请求,可能删掉本不该碰的库。
- 显式设为
false:$cfg['IgnoreMultiSubmitErrors'] = false; - 它会让任何一条语句失败就中断整个操作,并报错提示,强制暴露权限问题
- 和
$cfg['AllowUserDropDatabase']配合,形成界面+逻辑双保险
真正起作用的是 MySQL 权限 + phpMyAdmin 配置的组合,单靠一个层面永远不牢靠。尤其是当用户能直连数据库时,phpMyAdmin 的按钮开关只是第一道提醒,不是锁。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











