После некоторой отладки я обнаружил, что основной набор правил mod_security блокирует запросы, у которых нет (необязательного!) Поля заголовка ACCEPT.
Вот что я нахожу в журналах:
ModSecurity: Предупреждение. Требуется соответствие «rx ^ OPTIONS $» и «REQUEST_METHOD». [файл "/etc/apache2/conf.d/modsecurity/modsecurity_crs_21_protocol_anomalies.conf"] [строка "41"] [id "960015"] [msg "Запрос без заголовка принятия"] [серьезность "CRITICAL"] [tag " PROTOCOL_VIOLATION / MISSING_HEADER "] [имя хоста" example.com "] [uri" / "] [уникальный_id" T4F5 @ H8AAQEAAFU6aPEAAAAL "]
ModSecurity: Доступ запрещен кодом 400 (фаза 2). Требуется соответствие «rx ^ OPTIONS $» и «REQUEST_METHOD». [файл "/etc/apache2/conf.d/modsecurity/optional_rules/modsecurity_crs_21_protocol_anomalies.conf"] [строка «41»] [идентификатор «960015»] [сообщение «Запрос отсутствует заголовок принятия»] [серьезность «КРИТИЧЕСКИЙ»] [ тег "PROTOCOL_VIOLATION / MISSING_HEADER"] [имя хоста "example.com"] [uri "/"] [уникальный_id "T4F5 @ H8AAQEAAFU6aPEAAAAL"]
Зачем нужен этот заголовок? Я понимаю, что их отправляет «большинство» клиентов, но почему их отсутствие считается угрозой безопасности?
Я не писал эти правила, но, насколько я понимаю, существует сильная корреляция между клиентами, которые не включают этот заголовок, и вредоносными клиентами, а также между клиентами, которые включают его, и доброкачественными клиентами.
Вы можете найти определенных ботов (например: Pingdom, HostTracker, UpDowner, magpie-crawler, Yandex, Yodao, MJ12, GigaBot и LinkedInBot в быстром поиске через мои журналы), которые не отправляют этот заголовок, однако, если вы объедините его с правило, которое соответствует «обычным» пользовательским агентам, таким как Chrome, Firefox, IE, Safari, Opera и т. д., тогда вы сможете избежать блокировки этих ботов.
Некоторые клиенты (или, возможно, прокси, изменяющие заголовки), отправляют accept:
заголовок (и большинство других заголовков в нижнем регистре). Я еще не смог определить, являются ли они вредоносными или нет, однако все они заявляют, что являются «Firefox / 3.6.8» и имеют:
Via:HTTP/1.1 silk
X-Forwarded-For:10.161.106.98
или какой-то другой IP-адрес 10.x.x.x в своих заголовках ... что подозрительно.
RFC 2616 утверждает, что заголовок Accept ДОЛЖЕН присутствовать во всех запросах. Обратите внимание, что это не абсолютное требование, поэтому пользовательский агент по-прежнему условно соответствует требованиям (как определено в RFC), если он не отправляет этот заголовок.
Причина отказа в запросах без заголовка Accept заключается в том, что все обычные веб-браузеры отправляют заголовок, а многие боты - нет. На практике, однако, после просмотра миллионов запросов некоторые «хорошие» боты также не отправляют заголовок Accept. Так что это правило несовершенно и порождает ложные срабатывания.