PHP 7.4 默认启用 session.lazy_write=On 导致 phpMyAdmin 会话锁阻塞、响应延迟;null 数组下标访问更严格暴露旧代码缺陷;ProtectHome=true 阻止家目录加载文件;需关闭 setup/、禁用 allow_url_include 等危险配置。
PHP 7.4 默认启用 session.lazy_write = On 导致会话锁阻塞
这不是漏洞,但会放大 phpmyadmin 的响应延迟和假死现象。php 7.4 将该配置默认设为 on,意味着 session 文件锁在读取后不会立即释放,而是等到数据真正被修改才写入——而 phpmyadmin 大量只读操作(如表结构加载、权限检查)调用 session_start() 后不写数据,锁就一直挂着。
典型表现:Unable to clear session lock record 频繁出现在错误日志;点几个按钮就卡住;AJAX 请求挂起数秒;F12 Network 中多个请求状态为 pending。
- 修复首选:把
session.lazy_write = Off写进/etc/php/7.4/fpm/php.ini或/etc/php/7.4/apache2/php.ini,然后重启服务(sudo systemctl restart php7.4-fpm或apache2) - 验证是否生效:访问
phpinfo()页面搜索session.lazy_write,确认值为Off - 别误判成权限问题:
Failed to initialize storage module才是路径或属主问题;Unable to clear session lock record只跟锁机制有关
PHP 7.4 对 null 数组下标访问更严格,暴露旧代码逻辑缺陷
phpMyAdmin 自身代码若存在类似 $config['blowfish_secret'][0] 这类操作,且 $config['blowfish_secret'] 为 null,PHP 7.4 会直接报错 Trying to access array offset on value of type null,而不是像旧版那样静默返回 null。
这本身不是 phpMyAdmin 的漏洞,但会让原本“侥幸运行”的不健壮代码崩在启动阶段,尤其在自定义配置或插件场景下容易触发。
- 临时绕过:加判断
is_array($config['blowfish_secret']) && !empty($config['blowfish_secret']) - 长期建议:升级到 phpMyAdmin 5.2+,其已适配 PHP 7.4+ 的类型严格性
- 注意:Docker 构建时若用三方 base 镜像(如某些国产 PHP 镜像),可能自带老版本 phpMyAdmin + 未适配的 config,比源码部署更容易中招
PHP 7.4 的 ProtectHome 选项让 phpMyAdmin 文件包含失败
PHP-FPM 7.4 新增 ProtectHome = true 默认行为,禁止从用户家目录(如 /home/www)加载 PHP 文件。如果 phpMyAdmin 被部署在非标准路径(比如挂载到 /home/www/html/phpmyadmin),就会报 File not found —— 实际文件存在,只是被 FPM 主动拒载。
立即学习“PHP免费学习笔记(深入)”;
- 查证方式:运行
systemctl cat php7.4-fpm.service | grep ProtectHome,若输出含ProtectHome=true即确认 - 修复方法:创建覆盖配置
sudo systemctl edit php7.4-fpm.service,加入:[Service] ProtectHome=false
,再sudo systemctl daemon-reload && sudo systemctl restart php7.4-fpm - 替代方案:把 phpMyAdmin 移到
/var/www/等系统标准 Web 目录,避免依赖家目录路径
phpMyAdmin 在 PHP 7.4 下仍沿用旧版危险配置习惯
PHP 7.4 本身没新增攻击面,但会放大 phpMyAdmin 原有配置风险——比如默认开启的 setup/ 目录、未禁用的 allow_url_include、或通过 SQL 界面修改 auto_prepend_file 的能力,这些在 PHP 7.4 下依然有效,且因性能提升反而让 RCE 利用更快。
- 必须关闭
setup/:删掉或用 Web 服务器配置location /setup { return 403; } - 禁用危险 ini 设置:确保
allow_url_include = Off、disable_functions = exec,system,passthru,shell_exec - 别信“新版更安全”:PHP 7.4 不修复 phpMyAdmin 的逻辑漏洞(如 CVE-2020-15129),只修复 PHP 自身解析器问题,旧版 phpMyAdmin + 新 PHP 仍是高危组合
php.ini 就万事大吉,却忘了 FPM 还有独立的 www.conf 里也能覆盖 session 行为。



















