Новости проекта
Модули 1.4.20–1.4.22: защита держится, даже когда сервер сайта не успевает дозвониться до BotBan
Под наплывом ботов сервер сайта перестал успевать спросить BotBan — и модуль, как положено при сбое, начал пропускать всех. Версии 1.4.20–1.4.22 закрывают этот круг с четырёх сторон.
13 ноября у магазина ковролина сайт с утра отвечал ошибкой 502. На него шёл рой из нескольких сотен адресов китайского облака. Пока модуль на сайте спрашивал BotBan, рой получал блокировку: за ночь больше семи тысяч раз. А потом запросы к сервису почти прекратились: с шести тысяч в час до девятнадцати, а затем ни одного.
Мы проверили свою сторону: сервер сайта у нас не заблокирован, остальные сайты ходят как обычно. Дело было в самом сайте. При загрузке процессора под 100 % модуль не укладывался в отведённые на вопрос к сервису 300 мс: только поиск адреса botban.ru в DNS мог занять больше. После пяти неудач подряд модуль две минуты пропускает всех. Так он устроен намеренно: сбой не должен закрывать сайт от покупателей. Но здесь сбой вызывали сами боты. Пропущенный рой грузил сервер ещё сильнее, и защита больше не включалась.
Была и вторая щель. Аварийная проверка, включённая в настройках сайта, закрывала рою страницы, но фоновые запросы (подгрузку корзины и всплывающих окон) по-прежнему пропускала. Рой ходил по ним напрямую в PHP.
Что изменилось в модулях 1.4.20–1.4.22:
- Соединение с сервисом переживает запрос. На PHP 8.5 модуль держит соединение, TLS-сессию и ответ DNS между запросами одного процесса, и рукопожатие не повторяется на каждой странице. На PHP 7.4–8.4 с версии 1.4.22 модуль держит своё защищённое соединение на процесс PHP-FPM: повторный вопрос по нему в нашем замере занял 0,12 секунды вместо 1,1 секунды с рукопожатием. Если такое соединение на хостинге не устанавливается, модуль возвращается к прежнему способу. Сертификат проверяется как раньше, по имени.
- Не успел спросить — спросит после ответа. На этом сервере одно TLS-рукопожатие занимало 0,4–0,6 секунды, больше всего лимита. Теперь, если сервис не ответил за 300 мс, посетитель проходит как раньше, но модуль сразу после отдачи страницы спрашивает сервис ещё раз, уже не торопясь, и кладёт решение в кэш. Следующий запрос с того же адреса его получит. Рой, у которого каждый адрес делает десятки запросов, останавливается со второго. Посетитель ничего не ждёт: к этому моменту ответ ему уже закрыт.
- Модуль помнит сети хостингов, которые сервис недавно блокировал. Когда сервис блокирует адрес из сети хостинга, модуль запоминает эту сеть на час. Если сервис потом не ответит, новые адреса этой сети получат страницу проверки браузера, а не пропуск. Сети мобильных операторов и домашних провайдеров, а также Cloudflare и другие ретрансляторы сюда не попадают. Блокировки без ответа сервиса по-прежнему не бывает: только проверка, которую человек проходит сам.
- Без связи с сервисом фоновые запросы браузера от новых посетителей без пропуска получают короткий ответ «временно недоступно». Это касается аварийной проверки и запомненных сетей хостингов. Тот, кто уже был на сайте или прошёл проверку, ничего не заметит. Формы, задания по расписанию, вебхуки и обмен с 1С проходят как раньше.
Модуль обновится на сайтах сам. Делать ничего не нужно.