不能自定义CSRF校验,必须升级至phpMyAdmin≥5.2.2;该版本强制校验token并绑定会话ID与IP哈希前缀,绕过checkToken()将导致防护失效,且低版本无法通过补丁修复CVE-2023-38023。
phpmyadmin 不支持“自定义 csrf 校验”——你不能也不该绕过它的内置 token 机制去写自己的 checktoken() 逻辑。所有尝试手动注入、替换或跳过 checktoken() 调用的行为,都会直接导致防护失效。
为什么不能自己实现 CSRF 校验?
phpMyAdmin 的 CSRF 防护不是可插拔模块,而是深度耦合在请求入口和敏感操作链路中的硬性校验:
-
checkToken()在libraries/common.inc.php中被强制调用,早于任何用户代码执行;绕过它等于让整个 POST 流程裸奔 - token 生成依赖
Token::getTokens(),它绑定会话 ID + IP 哈希前缀(非完整 IP),且签名密钥由内部常量控制,无法外部复现 - 所有敏感脚本(如
import.php、tbl_drop.php)在开头就调用checkToken(),不通过则直接 die(),没机会进你的“自定义逻辑”
升级到 5.2.2+ 是唯一有效方案
CVE-2023-38023 漏洞的修复不是加个配置开关,而是重构了整个 token 生命周期。低于 5.2.2 的版本(包括 5.2.1)无论你怎么改 $cfg 或 patch 文件,都无法真正封堵漏洞。
- 必须升级到
phpMyAdmin ≥ 5.2.2,官方已将 token 强制校验嵌入所有关键入口 - 确认 PHP 版本 ≥ 7.4 —— 5.2.2 已放弃对 7.2/7.3 的支持,降级 PHP 会导致白屏或 fatal error
- 不要下载“补丁包”或修改
libraries/classes/Token.php:相关逻辑分散在至少 7 个文件中,漏一处就等于没修
升级后出现 “Token mismatch” 怎么办?
这不是漏洞残留,而是环境未适配新版 token 绑定机制。重点检查三处:
-
session.save_path权限:Web 用户(如www-data)必须对该目录有读写权限,否则每次请求都新建会话,token 值自然不一致 -
session.cookie_samesite设置:若设为Strict且 phpMyAdmin 访问域名与主站跨子域(如phpmyadmin.example.comvsadmin.example.com),浏览器会拦截 token cookie - 反向代理透传:Nginx 需确保
proxy_pass_request_headers on;,Apache 需ProxyPreserveHost On,否则后端收不到原始 Cookie 头
绝对禁止的“缓解”操作
这些操作看似快速,实则主动关闭防护:
立即学习“PHP免费学习笔记(深入)”;
- 注释掉
checkToken()调用 —— 直接暴露所有 POST 接口 - 把
$cfg['CheckConfigurationPermissions'] = false—— 这个配置只影响配置文件权限检查,和 CSRF 完全无关 - 设置
$cfg['LoginCookieValidity'] = 60后以为“安全了” —— 它只缩短 cookie 有效期,不阻止攻击者在 60 秒内完成诱导点击+请求发送
真正的难点不在“怎么加校验”,而在“怎么让 token 在复杂部署下稳定传递”。IP 哈希前缀、SameSite 策略、反向代理头透传、session 存储权限——这些细节出问题,新版 phpMyAdmin 一样报错,但错误本身不是漏洞,而是配置没对齐。



















