Как бороться с ботами на сайте
19.08.2021
В статье «Как в mod_rewrite блокировать по Referer, User Agent, URL, строке запроса, IP и в их комбинациях» я показал, как блокировать запросы на сайт, которые соответствуют сразу нескольким параметрам — с одной стороны, это эффективно против ботов, с другой — практически исключает false positives (ложные срабатывания), то есть когда блокируется обычный пользователь, не имеющий никакого отношения к нагулу ботов.
Заблокировать ботов несложно, сложно другое — найти их паттерны (шаблоны), которые изобличают запрос от бота. В той статье должна была быть ещё одна часть, в которой я показывал, как именно я собирал эти паттерны. Я её писал, делал скриншоты, но в конечном счёте добавлять в статью не стал. Не потому, что мне жалко, а просто я подумал, что это расходится с темой и так не самой простой статьи, да и мало кому это интересно, на самом деле.
Но позавчера началась атака ботов на другой мой сайт, я решил принять меры против ботовода и… забыл, как собирал данные )))) В общем, чтобы не изобретать команды каждый раз, теперь они будут храниться здесь )) Возможно, вам это тоже может пригодиться.
Как узнать, что сайт стал целью нагулки ботов
Первый признак, это резкий и беспричинный рост трафика. Это стало поводом зайти в статистику Яндекс.Метрика и проверить «Отчёты» → «Стандартные отчёты» → «Источники» → «Источники, сводка»:
Да, резкий всплеск прямых заходов, причём сегодня их даже больше, чем переходов из поисковых систем.
Посмотрим в Вебивизор:
Короткие сессии с мобильных устройств, странные User Agent (включают очень старые устройства), определённый характер региона/Интернет-провайдеров. Да, это боты.
Выявление IP ботов-накрутчиков
Посмотрим на команду:
cat site.ru/logs/access_log | grep '"-"' | grep -E -i 'android|iPhone' | grep -i -E -v 'google|yandex|petalbot' | awk '{ print $1 }' | sort | uniq -c
В ней:
- cat site.ru/logs/access_log — считываем файл журнала веб-сервера
- grep '"-"' — фильтруем запросы, оставляя только с пустым реферером
- grep -E -i 'android|iPhone' — фильтруем запросы, оставляя только мобильные
- grep -i -E -v 'google|yandex|petalbot' — убираем запросы от указанных ботов
- awk '{ print $1 }' — оставляем только IP адрес (первое поле)
- sort | uniq -c — сортируем и оставляем уникальные, выводим количество
На мой взгляд, всё довольно очевидно, все запросы идут из одной подсети 185.176.24.0/24.
Но сейчас утро, ещё мало данных, проверим лог веб-сервера за вчерашний день:
zcat site.ru/logs/access_log.1 | grep '"-"' | grep -E -i 'android|iPhone' | grep -i -E -v 'google|yandex|petalbot' | awk '{ print $1 }' | sort | uniq -c
Да, все боты пришли из сети 185.176.24.0/24.
В принципе, можно просто заблокировать всю эту подсеть и закончить на этом. Но лучше продолжить сбор данных ещё не пуганного ботовода, потом объясню почему.
Смотрим, какие именно страницы запрашивают боты:
cat site.ru/logs/access_log | grep '"-"' | grep -E -i 'android|iPhone' | grep -i -E -v 'google|yandex|petalbot' | grep '185.176.24' | awk '{ print $7 }' | sort | uniq -c
zcat site.ru/logs/access_log.1 | grep '"-"' | grep -E -i 'android|iPhone' | grep -i -E -v 'google|yandex|petalbot' | grep '185.176.24' | awk '{ print $7 }' | sort | uniq -c
В этим командах новые части:
- grep '185.176.24' — фильтр запросов из сети атакующего
- awk '{ print $7 }' — запрашиваемая страница в логах моего сервера является седьмым столбцом
Бот запрашивает ровно 30 страниц.
Возвращаемся к статье «Как в mod_rewrite блокировать по Referer, User Agent, URL, строке запроса, IP и в их комбинациях» и блокируем ботовода.
Но в моём случае можно обойтись блокировкой подсети.
В Apache 2.4:
<RequireAll> Require all granted Require not ip 185.176.24 </RequireAll>
В Apache 2.2:
Deny from 185.176.24
Смотрите также: Контроль доступа к сайту (блокировка по IP, User-Agent)
Держите руку на пульсе
Это не первый наплыв ботов, который я отражаю и нужно помнить, что ботовод меняет настройки ботов после ваших действий. Например, в предыдущий раз всё началось со следующего паттерна:
- боты запрашивали 5 определённых страниц
- все боты были с пользовательским агентом Android
- приходили из определённого набора сетей мобильных операторов
- пустой реферер
После того, как я заблокировал по этим признакам, ботовод изменил поведение ботов:
- добавил URL (стало 8 страниц)
- к Android добавился iPhone
- увеличилось количество подсетей, но всё равно боты приходили только от мобильных операторов
Я заблокировал и их. После этого ботовод добавил к пользовательским агентам настольные компьютеры, но все остальные паттерны остались прежними, поэтому я успешно заблокировал.
После этого ботовод не менял поведение ботов и через какое-то время (неделя или две) боты перестали пытаться заходить на сайт, я удалил правила блокировки.
Для последующего анализа
Команда фильтрации запросов из указанной подсети (185.176.240/24), которые имеют код ответа 200 (то есть не заблокирован) — полезно, на случай смены ботовдом User Agent’а:
cat site.ru/logs/access_log | grep '"-"' | grep -E -i 'android|iPhone' | grep -i -E -v 'google|yandex|petalbot' | grep '185.176.24' | grep ' 200 ' | tail -n 10
Вариант приведённой в начале этой статьи команды составления списка IP адресов, но в команде учитываются только запросы с кодом ответа 200 (отфильтровываются те, которые мы уже заблокировали):
cat site.ru/logs/access_log | grep '"-"' | grep -E -i 'android|iPhone' | grep -i -E -v 'google|yandex|petalbot' | grep ' 200 ' | awk '{ print $1 }' | sort | uniq -c
Команда для мониторинга последних запросов, характерных для ботов:
cat site.ru/logs/access_log | grep '"-"' | grep -E -i 'android|iPhone' | grep -i -E -v 'google|yandex|petalbot' | tail -n 10
Как нагулка ботов влияет на сайт
В этот раз я среагировал довольно быстро — через день после начала атаки. Но в предыдущий раз боты гуляли по моему сайту пару недель, прежде чем мне это надоело. Какое-либо влияние на позиции сайта в поисковой выдачи это не оказало.
Билеты на автобусы, паромы и поезда, в том числе стыковочные маршруты:
Авиабилеты на международные и местные направления по минимальным ценам:
Связанные статьи:
- Как в mod_rewrite блокировать по Referer, User Agent, URL, строке запроса, IP и в их комбинациях (100%)
- Как защититься от спама через формы обратной связи (73.8%)
- Как блокировать доступ к сайту с конкретного сайта-букса или любого другого сайта с негативным трафиком (66.3%)
- Истории двух троллей (когда неудачно попытался троллить) (58.1%)
- Как исключить из индексации страницы с определёнными параметрами в URL и другие техники контроля индексации сайта поисковыми системами (54.2%)
- Плагины для защиты от СПАМа в WordPress (RANDOM - 52%)
Огромное спасибо за помощь! Ваше руководство самое продуманное и доступное для понимания начинающих! Перелопатила кучу сайтов и рекомендаций, перепробовала кучу всего. Ничего не помогло… После прочтения ваших статей разобралась с алгоритмом, применила ваше правило и ботов нет!!! Успеха Вам во всех начинаниях!