phpMyAdmin 无法真正隐藏 MySQL 版本信息,仅能关闭自身页面显示:设 $cfg['ShowServerInfo']=false 和 $cfg['ShowPhpInfo']=false 隐藏底部版本,用 custom.css 隐藏登录页版本;MySQL 握手 banner 必须通过 ProxySQL 或 HAProxy 替换。

phpMyAdmin 本身不提供“禁止显示 MySQL 版本信息”的开关,它只是忠实展示 MySQL 服务返回的内容。所谓“隐藏”,实际是两件事:一是不让登录页和页面底部渲染版本字符串,二是阻止 MySQL 服务在连接握手阶段暴露原始版本号——后者根本不在 phpMyAdmin 控制范围内。
关闭 phpMyAdmin 页面上的 MySQL 和 phpMyAdmin 版本显示
页面底部的 Server version: MySQL x.x.x 和 phpMyAdmin x.x.x 是由 phpMyAdmin 主动渲染的,可通过配置项关闭:
-
$cfg['ShowServerInfo'] = false;—— 隐藏底部“Server version”和“Protocol version”行 -
$cfg['ShowPhpInfo'] = false;—— 隐藏底部“phpMyAdmin x.x.x”字样 - 这两行必须加在
config.inc.php的全局作用域(即$cfg数组顶层),不能放在$cfg['Servers'][$i]里 - 改完后无需重启 Web 服务,但浏览器缓存可能延迟生效,建议硬刷新或清空缓存
隐藏登录页顶部的 phpMyAdmin 版本号(CSS 方式)
登录页顶部 phpMyAdmin x.x.x 是 PHP 动态注入 $cfg['PMA_VERSION'] 后写进 .login-logo h2 或 .login-logo p 的,不能靠删模板解决:
- 在
phpmyadmin/css/custom.css中添加:body.login .login-logo h2,<br>body.login .login-logo p {<br> display: none !important;<br>} - 确保
config.inc.php中已启用该 CSS:$cfg['CustomCSS'] = 'css/custom.css'; - 路径必须准确;
body.login前缀防止影响其他页面;!important是必须的,否则会被内置样式覆盖 - 不要只写
.login-logo h2——某些主题(如 pmahomme)把版本号放在p标签里
MySQL 服务本身的版本 banner 无法被 phpMyAdmin 控制
只要客户端连上 3306 端口,MySQL 就会在 TCP 握手包里明文发送类似 8.0.33 的字符串,phpMyAdmin 完全无权干预这个过程:
立即学习“PHP免费学习笔记(深入)”;
- 执行
nc -w1 localhost 3306 | head -c100就能直接看到原始 banner,跟 phpMyAdmin 是否运行无关 -
version_comment、skip-name-resolve、my.cnf里的version = "xxx"全部无效——它们只影响SELECT VERSION()这类 SQL 返回值 - 真正能替换 handshake banner 的只有协议层代理,比如 ProxySQL(设
mysql-server_version变量)或 HAProxy(用tcp-response content replace) - 别信“改源码重编译 mysqld”的方案,风险高、维护难、驱动兼容性差,生产环境基本不可行
最容易被忽略的一点:即使你关掉了 phpMyAdmin 所有可见版本字段,攻击者仍能通过 /readme.php、/changelog.php、HTTP 响应头 X-Powered-By 或 MySQL 的 SHOW VARIABLES LIKE 'version%' 拿到版本信息。真正的混淆需要三者同步处理:phpMyAdmin 配置 + 自定义 CSS + Web 服务器层静态文件屏蔽 + 代理层 banner 替换。



















