核心是网络层、web层、数据库层三重卡死:apache用require ip白名单,nginx用location+allow/deny双deny,mysql收紧host字段并设bind-address=127.0.0.1、防火墙禁3306。
禁止公网直接访问 phpmyadmin,核心是切断“公网 ip → 服务器 80/443 端口 → /phpmyadmin 路径”的链路。只改路径或加密码没用,攻击者能扫到服务就可能爆破或利用漏洞。必须从网络层、web 层、数据库层三处同时卡死。
Apache 2.4 中限制 /phpmyadmin 目录的访问来源
Apache 的 Require 指令是当前最可靠的方式,Order Deny,Allow 已废弃,不能再用。
- 在 Apache 配置文件(如
/etc/apache2/conf-available/phpmyadmin.conf或虚拟主机配置中)添加或修改<directory></directory>块 - 明确拒绝所有,再白名单放行内网或特定公网 IP:
<directory><ifmodule mod_authz_core.c> Require all denied Require ip 127.0.0.1 Require ip 192.168.0.0/16 Require ip 10.0.0.0/8 # 如需临时从办公公网访问,加一行:Require ip 203.123.45.67 </ifmodule></directory> - 改完必须执行
sudo systemctl reload apache2(不要只 restart) - 注意路径要和实际安装位置一致:
/usr/share/phpmyadmin是 Debian/Ubuntu 默认;CentOS 可能是/var/www/html/phpmyadmin;XAMPP 是/xampp/phpmyadmin
Nginx 中通过 location + allow/deny 控制访问
Nginx 没有 Require,靠 allow/deny 配合 return 403 实现等效效果,且必须放在 location 块内。
- 在 server 块里加这段(路径需匹配你的部署):
location /phpmyadmin { deny all; allow 127.0.0.1; allow 192.168.1.0/24; # 允许单个公网 IP(谨慎!) # allow 203.123.45.67; deny all; } -
deny all必须写两次:开头兜底,结尾收尾,否则规则可能被绕过 - 如果用了反向代理(比如 Nginx 代理到后端 PHP-FPM),确保该
location块在 proxy_pass 之前生效 - 重载配置:
sudo nginx -t && sudo systemctl reload nginx
MySQL 用户层面同步收紧 Host 字段
即使 Web 层拦住了,如果 MySQL 用户本身允许 '%'@'%' 登录,攻击者一旦拿到凭证或绕过 Web 层(比如 SSRF、本地提权),仍可直连。必须清理 mysql.user 表。
- 登录 phpMyAdmin → 切换到
mysql数据库 → SQL 标签页,执行:UPDATE mysql.user SET Host = 'localhost' WHERE Host != 'localhost' AND User NOT IN ('root', 'debian-sys-maint'); - 执行
FLUSH PRIVILEGES;—— 这步漏掉,所有修改都不生效 - 检查是否残留宽泛 Host:
SELECT User, Host FROM mysql.user WHERE Host IN ('%', '0.0.0.0', '::'); - 特别注意:某些发行版(如 Ubuntu)会创建
debian-sys-maint用户用于服务管理,不能删也不能锁死,保留其原有 Host
bind-address 和防火墙才是最后一道物理防线
Web 配置只是软件层过滤,真正阻止连接建立,得靠 MySQL 服务监听设置和系统防火墙。
- 查当前监听:
SELECT @@bind_address;,返回0.0.0.0就说明 MySQL 正在监听所有网卡 - 编辑
/etc/mysql/mysql.conf.d/mysqld.cnf(或/etc/my.cnf),设:bind-address = 127.0.0.1
- 重启 MySQL:
sudo systemctl restart mysql - 防火墙必须封死 3306 端口对外暴露:
sudo ufw deny 3306(Ubuntu)或sudo firewall-cmd --permanent --remove-service=mysql(CentOS) - 别忘了检查云服务器安全组——很多用户改了本地防火墙,却忘了阿里云/腾讯云控制台里还开着 3306 入方向规则
最容易被忽略的是 bind-address 和防火墙的组合:哪怕 Web 层和 MySQL 用户都锁死了,只要 MySQL 还在监听 0.0.0.0 且防火墙放行 3306,攻击者就能跳过 phpMyAdmin 直连数据库。这一步不做,前面所有配置都形同虚设。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











