phpwaf规则文件必须为字段完整的JSON格式,含唯一"id"、合法SecRule语法的"rule"、字符串"action"、数字"score"和布尔"enabled";CLI导入需绝对路径加--format=json与--force;Web上传失败多因Nginx/Apache/PHP上传限制。

phpwaf 规则文件格式必须是 JSON 且字段完整
phpwaf(如基于 mod_security 或自研规则引擎的 PHP WAF)批量导入时,rules.json 不是随便拼个数组就能用。常见失败原因是字段缺失或类型错误:比如漏掉 "id"、"rule"、"action",或把 "score" 写成字符串而非数字。
正确结构示例(单条):
{
"id": "900101",
"rule": "SecRule ARGS \"(?i)union\\s+select\" \"phase:2,deny,status:403,msg:'SQL Injection Detected'\"",
"action": "deny",
"score": 5,
"enabled": true
}
-
"rule"字段值必须是合法的 SecRule 语法字符串,不能带换行或未转义双引号 -
"id"必须全局唯一,重复 ID 会导致后导入的覆盖前一条 -
"enabled"建议显式设为true或false,不依赖默认值
使用 phpwaf 提供的 CLI 工具导入需指定 --format=json
多数 phpwaf 部署包附带 phpwaf-cli,但直接 phpwaf-cli import rules.json 往往报错 —— 缺少格式声明。
必须加 --format=json 参数,且路径需为绝对路径(相对路径在 daemon 模式下常解析失败):
立即学习“PHP免费学习笔记(深入)”;
phpwaf-cli import /var/www/phpwaf/rules/rules.json --format=json --force
-
--force跳过启用确认,适合脚本批量执行 - 若提示
"Unsupported rule format",先用jq '.' rules.json验证 JSON 有效性 - 导入后不会自动重载规则,需额外执行
phpwaf-cli reload
导出规则时注意 scope 和 enabled 状态过滤
phpwaf-cli export 默认导出全部规则(含禁用项),但生产环境通常只要启用中的自定义规则。
推荐加上过滤参数:
phpwaf-cli export --scope=custom --enabled-only > custom_enabled_rules.json
-
--scope=custom排除内置规则(如 OWASP CRS 的 900xxx 系列),避免混入不可修改项 -
--enabled-only过滤掉被手动 disable 的测试规则,防止误导入到新环境 - 导出结果不含注释和空行,如需人工可读,用
jq -P . custom_enabled_rules.json格式化
Web 界面批量导入失败大概率是 Nginx/Apache 上传限制
通过 phpwaf 后台 Web 页面上传 rules.json 时卡在“正在上传”或返回 500,基本不是代码问题,而是反向代理层拦截了大文件或长请求。
- Nginx 需检查
client_max_body_size(建议设为10M)和proxy_read_timeout(至少300) - Apache 要确认
LimitRequestBody未设为 0 或过小值 - PHP 层还需核对
upload_max_filesize和post_max_size(两者都需 ≥ 文件大小)
如果规则集超过 2MB,别硬扛 Web 上传,改用 CLI 方式更稳。











