为什么modsecurity在POST请求中需要Content-Length?

我有一个REST风格的Web服务,它接受一个POST请求给没有实体的资源,例如一个空的POST请求。 默认的modsecurityconfiguration要求所有的POST请求都有一个Content-Length:

# Require Content-Length to be provided with every POST request SecFilterSelective REQUEST_METHOD "^POST$" chain SecFilterSelective HTTP_Content-Length "^$" 

modsecurity控制台将此报告为PROTOCOL_VIOLATION / EVASION。 不过,在阅读HTTP / 1.1 RFC时 ,我并不认为这是真的。 一个服务器被允许要求Content-Length(返回400或411),但是我没有看到任何说服务器必须(或推荐它应该)以这种方式行事的事情。

这可能因浏览器而异,但是,在没有实体主体的情况下发出POST请求的Flash客户端不会发送请求标头。 当你“curl-XPOST …”的时候也不会curl。 由于这些原因,并且因为我认为modsecurity规则是对HTTP规范的误解,所以我正在考虑在我们的configuration中解决对POST请求的Content-Length头的需求。

有谁知道是否有一个具体的利用这个规则是为了解决? 众多谷歌search,我只发现这是股票modsecurityconfiguration的一部分的参考。

首先,您应该知道您正在运行ModSecurity的过时版本(分支1.x)。 如果您正在运行Apache 2.0.x,则应升级到ModSecurity 2.x. 如果您仍在运行Apache 1.3.x,那么恐怕您没有select,因为ModSecurity 2.x将无法使用它。 ModSecurity 1.x本身并不被认为是脆弱的,但是它的规则引擎对于今天的需求太不灵活了。

如果我没有记错,ModSecurity 1.x需要POST请求来指定内容长度,纯粹是因为它不支持分块的请求体(提交请求体的另一种方式,其中总长度直到结束才知道)。 (当时我们正在谈论2003年,2004年),并且仍然很less(尽pipe一些移动设备正在使用它们)。

在ModSecurity 2.x中没有这样的限制。

如果你消除了这个规则,你将会创造一个大洞,通过这个洞可以被偷偷潜入。 另一方面,我可以争辩说,在运行ModSecurity 1.x时,还有其他方法可以做到这一点。 或者,调整规则以拒绝具有Transfer-Encoding请求头设置的请求。 你应该安全的。

披露:我写了ModSecurity。

我相信这个需求是xml-rpc规范的一部分,而不是http规范。 如果你不是在xml-rpc之后,我会认为这是一个可以省略的事情。

我不太了解它在mod_security中被普遍包含的原因,除非它本来是为了防止某种深奥的缓冲区溢出。