经过一些调试后,我发现 mod_security 的核心规则集会阻止没有(可选!)ACCEPT 标头字段的请求。
这是我在日志中发现的内容:
ModSecurity:警告。需要将“rx ^OPTIONS$”与“REQUEST_METHOD”匹配。[文件“/etc/apache2/conf.d/modsecurity/modsecurity_crs_21_protocol_anomalies.conf”] [行“41”] [id“960015”] [msg“请求缺少接受标头”] [严重性“CRITICAL”] [标签“PROTOCOL_VIOLATION/MISSING_HEADER”] [主机名“example.com”] [uri“/”] [unique_id“T4F5@H8AAQEAAFU6aPEAAAAL”]
ModSecurity:访问被拒绝,代码为 400(阶段 2)。需要将“rx ^OPTIONS$”与“REQUEST_METHOD”匹配。 [文件“/etc/apache2/conf.d/modsecurity/optional_rules/modsecurity_crs_21_protocol_anomalies.conf”] [行“41”] [id“960015”] [msg“请求缺少接受标头”] [严重性“CRITICAL”] [标签“PROTOCOL_VIOLATION/MISSING_HEADER”] [主机名“example.com”] [uri“/”] [unique_id“T4F5@H8AAQEAAFU6aPEAAAAL”]
为什么需要此标头?我知道“大多数”客户端都会发送这些标头,但为什么缺少这些标头会被视为安全威胁?
答案1
我没有编写这些规则,但据我了解,不包含此标头的客户端与恶意客户端之间存在很强的相关性,而包含此标头的客户端与良性客户端之间存在很强的相关性。
您可能会发现某些机器人(例如:Pingdom、HostTracker、UpDowner、magpie-crawler、Yandex、Yodao、MJ12、GigaBot 以及通过我的日志快速 grep 得到的 LinkedInBot)不会发送此标头,但是如果您将其与匹配“正常”用户代理(例如 Chrome、Firefox、IE、Safari、Opera 等)的规则相结合,那么您将能够避免阻止这些机器人。
有些客户端(或者可能是修改标头的代理)会发送accept:
标头(以及大多数其他小写的标头)。我还不能确定这些是否是恶意的,但它们都声称是“Firefox/3.6.8”,并且具有:
Via:HTTP/1.1 silk
X-Forwarded-For:10.161.106.98
或者其标头中的其他 10.xxx IP 地址......这是可疑的。
答案2
RFC 2616 规定,所有请求中都应包含 Accept 标头。请注意,这并不是绝对要求,因此即使用户代理未发送此标头,它仍是有条件合规的(如 RFC 中所定义)。
拒绝没有 Accept 标头的请求的理由是,所有常规 Web 浏览器都会发送标头,而许多机器人不会。但在实践中,在看到数百万个请求后,一些“好”机器人也不会发送 Accept 标头。因此,此规则并不完美,确实会产生误报。