经过一些debugging之后,我发现mod_security的核心规则集阻止了没有(可选的!)ACCEPT头域的请求。
这是我在日志中find的:
ModSecurity:警告。 需要匹配“rx ^ OPTIONS $”和“REQUEST_METHOD”。 [file“/etc/apache2/conf.d/modsecurity/modsecurity_crs_21_protocol_anomalies.conf”] [line“41”] [id“960015”] [msg“Request Missing Accept Header”] [severity“CRITICAL”] [tag“ PROTOCOL_VIOLATION / MISSING_HEADER“] [主机名”example.com“] [uri”/“] [unique_id”T4F5 @ H8AAQEAAFU6aPEAAAAL“]
ModSecurity:访问被代码400拒绝(阶段2)。 需要匹配“rx ^ OPTIONS $”和“REQUEST_METHOD”。 [file“/etc/apache2/conf.d/modsecurity/optional_rules/modsecurity_crs_21_protocol_anomalies.conf”] [line“41”] [id“960015”] [msg“Request Missing Accept Header”] [severity“CRITICAL”] [标签“PROTOCOL_VIOLATION / MISSING_HEADER”] [主机名“example.com”] [uri“/”] [unique_id“T4F5 @ H8AAQEAAFU6aPEAAAAL”]
为什么这个标题是必需的? 我知道“大多数”客户发送这些信息,但为什么他们的缺席被视为安全威胁?
我没有写这些规则,但据我了解,不包括这个标头的客户端与恶意客户端之间,以及包含它的客户端与良性客户端之间有很强的相关性。
你可以通过我的日志find某些机器人(例如:Pingdom,HostTracker,UpDowner,magpie-crawler,Yandex,Yodao,MJ12,GigaBot和LinkedInBot,通过我的日志快速的grep),但是如果你把它和与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地址在他们的头…这是可疑的。
RFC 2616指出Accept头应该存在于所有的请求中。 请注意,这不是一个绝对的要求,所以如果用户代理不发送这个头,它仍然是有条件的(在RFC中定义的)。
拒绝没有Accept头的请求的基本原理是,所有常规的Web浏览器确实发送头,而许多机器人却没有。 但实际上,在看到数以百万计的请求后,一些“好”的机器人也不会发送Accept头。 所以这个规则并不完美,并且会产生误报。