ModSecurity 2.9能否修改响应体实现内容审查?
ModSecurity实现响应内容审查(JSON字段过滤)
ModSecurity完全可以实现响应内容的审查与修改,包括你需要的JSON数组元素过滤场景。你的现有方案无法生效,核心问题是阶段选择错误、响应体修改方式不对,以下是修正后的完整实现步骤:
1. 基础配置检查
首先确保ModSecurity启用了响应体处理功能,在主配置文件中添加/确认以下配置:
SecResponseBodyAccess On SecResponseBodyMimeType application/json # 仅处理JSON类型响应,提升效率
2. 修正ModSecurity规则
将你的规则修改为phase:5(响应体处理阶段,此时完整响应体已加载完成),并调整动作参数:
SecRule RESPONSE_BODY "@rx .*" "id:100,phase:5,t:none,pass,exec:/usr/local/bin/change-response-body.lua"
phase:5:必须使用该阶段才能访问完整的响应体(phase:4仅处理响应头,无法获取完整响应内容)pass:允许请求流程继续,仅执行脚本修改响应t:none:关闭默认的字符转换,避免干扰JSON解析
3. 编写Lua过滤脚本
你之前的脚本错误使用setvar修改响应体,ModSecurity Lua API需用m.setbody()方法实现。同时需要引入JSON库解析、生成JSON内容(以社区常用的dkjson为例):
3.1 准备JSON解析库
将dkjson源码保存为dkjson.lua,放在Lua系统搜索路径(如/usr/local/share/lua/5.1/)或与脚本同一目录下。
3.2 编写过滤逻辑脚本
#!/usr/bin/lua local dkjson = require("dkjson") function main() -- 获取原始响应体 local resp_body = m.getvar("RESPONSE_BODY") if not resp_body then return 1 end -- 解析JSON内容 local json_data, parse_err = dkjson.decode(resp_body) if parse_err then m.log(3, "JSON解析失败: " .. parse_err) return 1 end -- 过滤result数组中的"spider"项 if type(json_data.result) == "table" then local filtered_result = {} for _, item in ipairs(json_data.result) do if item.name ~= "spider" then table.insert(filtered_result, item) end end json_data.result = filtered_result end -- 重新编码为格式化JSON local new_body, encode_err = dkjson.encode(json_data, {indent = true}) if encode_err then m.log(3, "JSON编码失败: " .. encode_err) return 1 end -- 设置修改后的响应体 m.setbody(new_body) return 1 end
3.3 给脚本添加执行权限
chmod +x /usr/local/bin/change-response-body.lua
4. 调试与验证
如果仍有问题,开启ModSecurity调试日志排查细节:
SecDebugLog /var/log/modsec/debug.log SecDebugLogLevel 9
通过日志可以确认脚本是否执行、JSON解析/编码是否出现错误。
内容的提问来源于stack exchange,提问作者Spin Egel
相关产品推荐
相关产品推荐

