我安装了 Apache 2.4 和 mod_security 2.9.1,它正在工作,有一些非常基本的规则。
我正在尝试发出一个包含一些标头信息的 POST 请求,但请求正文中没有任何内容(该请求是发送给受 mod_security 保护的 API 端点,并且该端点需要一个没有请求正文的 POST) 。不需要正文的 POST 是有效的,如下所示:PUT 和 POST 请求是否需要/期望有请求正文?
mod_security 正在阻止请求,因为它似乎无法解析/格式化正文(可能是因为它不存在)。
我如何修改规则以允许在没有正文的情况下进行 POST,但如果正文确实存在,则可以正常工作。
正在触发的具体规则是:
SecRule REQBODY_ERROR "!@eq 0" \
"id:'200002', phase:2,t:none,log,deny,status:415,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2"
错误是:
[Fri Jul 08 10:32:32.901230 2016] [:error] [pid 7697] [client 10.0.2.2:57442] [client 10.0.2.2] ModSecurity: JSON parser error: parse error: premature EOF\n [hostname "example.com"] [uri "/api/v1/logout"] [unique_id "V377qH8AAQEAAB4RU6cAAAAD"]
[Fri Jul 08 10:32:32.901555 2016] [:error] [pid 7697] [client 10.0.2.2:57442] [client 10.0.2.2] ModSecurity: Access denied with code 415 (phase 2). Match of "eq 0" against "REQBODY_ERROR" required. [file "/etc/modsecurity/modsecurity.conf"] [line "61"] [id "200002"] [msg "Failed to parse request body."] [data "JSON parser error: parse error: premature EOF\\x0a"] [severity "CRITICAL"] [hostname "example.com"] [uri "/api/v1/logout"] [unique_id "V377qH8AAQEAAB4RU6cAAAAD"]
或者,我应该干脆不发送Content-Type
HTTP 标头,以便让 mod_security 解析正文(尽管我更愿意强制所有 POST 请求始终具有已定义的Content-Type
)?
我已经总结了完整的要点修改安全配置文件正在使用(这是一个基本示例,有两个用于过滤内容类型的额外规则)。