PHPWAF是需手动集成的第三方PHP WAF中间件,非官方扩展,不显示在phpinfo中;须通过auto_prepend_file或前置引入phpwaf.php,配置rules/与config.php,并启用扫描开关及日志权限方可生效。

PHPWAF 不是 PHP 官方组件,也不是 Composer 可直接安装的标准扩展;它是一个第三方 Web 应用防火墙(WAF)中间件,通常以 PHP 脚本形式嵌入项目,首次启用必须手动集成、配置并验证生效路径 —— 否则请求根本不会经过规则检测。
确认 PHPWAF 的实际部署形态
市面上叫 “phpwaf” 的实现有多个分支,常见的是基于 phpwaf.php 入口钩子或通过 auto_prepend_file 注入的轻量方案。你拿到的不是扩展(phpwaf.so),也不会出现在 phpinfo() 的扩展列表里。
- 检查你下载/克隆的包里是否有
phpwaf.php或init.php这类主逻辑文件 - 确认文档是否要求修改
php.ini中的auto_prepend_file指向该文件(例如:auto_prepend_file = /path/to/phpwaf.php) - 若用在 Nginx + PHP-FPM 环境,
auto_prepend_file必须在php-fpm.conf或 pool 配置中设置,而非全局php.ini(后者常被 FPM 忽略) - Apache 用户需在
.htaccess或虚拟主机配置中用php_value auto_prepend_file,且确保AllowOverride Options已启用
规则加载失败的典型表现与排查
启用后无拦截、日志为空、或访问 /phpwaf/status 返回 404 或空白页,大概率是规则未加载。PHPWAF 通常依赖一个 rules/ 目录和 config.php,但默认不开启全部规则。
-
config.php中的$enable_rules默认可能是false或空数组,需显式设为['xss', 'sql', 'file_inclusion']等字符串键名 - 规则文件(如
rules/xss.json)路径必须可读,且 PHP 进程用户(如www-data)有权限读取,常见错误是放到了 Web 根目录外却没调通相对路径 - 若使用
include_once手动引入phpwaf.php,注意它必须放在所有业务代码之前(尤其不能在index.php的require之后),否则已初始化的全局变量(如$_GET)可能被绕过检测
绕过检测的隐藏风险点
PHPWAF 对请求体($_POST、php://input)、Header(如 User-Agent、Referer)和 Cookie 的扫描默认可能关闭,而攻击者常从这些通道注入。
立即学习“PHP免费学习笔记(深入)”;
- 检查
config.php中是否有$scan_post、$scan_headers、$scan_cookies等开关,它们默认值多为false - JSON 接口(
Content-Type: application/json)容易被忽略:PHPWAF 一般不会自动解析php://input,需手动开启$parse_json_input = true并确保json_decode(file_get_contents('php://input'))不报错 - URL 中的 Unicode 编码(如
%u003cscript%u003e)或大小写混合(SeLecT)可能逃逸基础正则,此时需确认规则是否启用了 normalize(标准化)预处理
最常被跳过的其实是日志落盘权限和响应头干扰 —— 如果 logs/ 不可写,攻击记录就丢了;如果业务代码提前调用了 header() 或 http_response_code(),PHPWAF 的拦截响应(如 403)可能发不出去。这些细节不报错,但让整个 WAF 形同虚设。











