mod_security:允许没有请求主体的POST请求的规则

时间:2016-07-08 01:08:36

标签: apache security mod-security

我安装了Apache 2.4和mod_security 2.9.1,它正在运行,有一些非常基本的规则。

我正在尝试发出包含一些标头信息的POST请求,但在请求正文中没有任何内容(请求是指受mod_security保护的API端点,并且该端点需要POST而不包含请求机构)。根据以下内容,不需要正文的POST有效:Are PUT and POST requests required/expected to have a request body?

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)?

我已经使用了正在使用的完整modsecurity.conf的要点(这是一个基本示例,其中包含两个用于过滤内容类型的额外规则)。

1 个答案:

答案 0 :(得分:2)

您可以为零体长的请求禁用正文访问:

SecRule REQUEST_BODY_LENGTH "@eq 0" "id:12345,phase:1,nolog,ctl:requestBodyAccess=off"

或者如果您只想在某个URL上执行此操作,请使用链式规则:

SecRule REQUEST_URI /my/weird/api "phase:1,id:12346,nolog,chain"
   SecRule REQUEST_BODY_LENGTH "@eq 0" "ctl:requestBodyAccess=off"