php 8.0–8.1 是当前运行 phpwaf 最稳妥的版本区间;php 8.2+ 因废弃花括号字符串访问语法 $str{0} 导致致命错误且官方停止维护,php 7.4 虽可运行但已无维护、存在正则和函数兼容性隐患。

phpwaf 不支持 PHP 8.2+,PHP 8.0–8.1 是当前最稳妥的运行区间;PHP 7.4 仍可运行但已无维护,不建议新部署。
phpwaf 在 PHP 8.2+ 上直接报错 Fatal error: Array and string offset access syntax with curly braces is no longer supported
这是 phpwaf 核心代码中大量使用了已被 PHP 8.2 移除的旧语法 $str{0}(替代写法应为 $str[0])。官方仓库自 2021 年起停止更新,未适配 PHP 8.2+ 的语法变更。
- 实际现象:启用 phpwaf 后 Apache/Nginx worker 直接崩溃,错误日志反复出现该
Fatal error - 临时绕过无效:即使关闭所有规则、仅加载
phpwaf.php入口也会触发 - 不是配置问题,是底层字符串访问语法硬性不兼容
PHP 8.0–8.1 可正常运行,但需注意 mbstring.func_overload 已废弃
phpwaf 依赖 mb_* 系列函数做多字节字符检测(如 SQL 注入中的宽字节绕过),在 PHP 8.0+ 中 mbstring.func_overload 配置项已被移除,若旧 ini 文件里还保留该配置会导致启动警告甚至模块加载失败。
- 检查
php.ini,删掉或注释掉mbstring.func_overload = 2这类行 - 确认
extension=mbstring已启用(phpwaf 会调用mb_stripos等函数) - 部分发行版(如 Ubuntu 22.04 默认 PHP 8.1)需额外安装
php-mbstring包
PHP 7.4 虽能跑通,但存在两个隐蔽风险
表面上所有规则生效、日志可写、拦截正常,但实际在高并发或复杂 payload 场景下容易出问题:
立即学习“PHP免费学习笔记(深入)”;
-
preg_replace的/e修饰符虽未被完全移除,但已被标记为 deprecated,phpwaf 中少量正则使用了该模式,PHP 7.4 日志中会刷屏Deprecated: preg_replace(): The /e modifier is deprecated - 部分规则依赖
get_magic_quotes_gpc(),该函数在 PHP 7.4 中仍存在但返回恒定false,导致相关逻辑失效(如对原始 POST 数据的误判) - PHP 7.4 已于 2022 年 11 月结束生命周期,不再接收安全补丁
没有“官方适配版本”,所有所谓“PHP 8.2 兼容版”都是第三方 patch
GitHub 上几个标称 “fixed for PHP 8.2” 的 fork 仓库,基本只做了两件事:sed -i 's/{\([^}]\+\)}/[\1]/g' 替换全部花括号语法,以及把 create_function() 换成匿名函数。但这类改动未经过完整 WAF 规则测试:
- 替换后部分正则逻辑因数组索引方式变化而失效(例如
$matches{1}→$matches[1],但$matches可能为false) - 未同步更新规则引擎对
$_SERVER['PATH_INFO']等超全局变量的解析方式(PHP 8.1+ 对其编码处理更严格) - 真正关键的漏洞检测逻辑(如 XSS 的 JS 引号逃逸识别)可能因字符串偏移计算偏差而漏判
如果你必须用 PHP 8.2+,与其打补丁,不如换用 mod_security(Apache)或 nginx + lua-resty-waf——phpwaf 的架构和维护状态,已经不适合现代 PHP 环境了。











