Skip to content

githubniko/antibot

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

395 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Инструкция

1745503945878

Программа антибота предназначена для блокировки ботов, которые умеют эмулировать браузер, JavaScript, а так же классических ботов, защищает от поведенческих ботов и BAS.

Проверяет посетителя по настроенным фильтрам, и в зависимости от результата выводит капчу, блокирует или пропускает пользователя.

ДЕМО

Основные фильтры:

  • Автоматическая проверка
  • Разные типы капчи (чекбокс, слайдер, zsay и другие)
  • Белый список ip, network
  • Индексирующие роботы (определяет полезных ботов по обратной DNS записи)
  • Черный список ip, network
  • Исключение по User-agent (для ваших ботов)
  • Исключение по URL (например для JSON и REST API)
  • Без JavaScript (блокировка, кроме исключений)
  • Без Cookie (блокировка, кроме исключений)
  • IPv6
  • Протокол HTTP
  • Мобильный девайс
  • Прямые заходы
  • Открытие сайта в iframe
  • Переход из Tor-сети
  • Анализ User-Agent
  • Блокировка по FingerPrint
  • Блокировка по ASN
  • и другое

Вкл/выкл каждого пункта настраивается в конфигурационном файле.

При первом открытии страницы, программа проверяет совпадения из белого/черного списков, список индексирующих робот, user-agent. Если ни одно из правил не сработало, то открывается страница заглушка, в которой делаются дополнительные проверки, требующие определённое время. В процессе отображается индикатор прогресса. В зависимости от результата, страница может попросить пользователя пройти капчу, заблокировать или пропустить его.

Программа обеспечивает максимальную производительность, не использует базу данных и другие ресурсозатратные операции. Минимизирована зависимость от внешних сервисов.

Для каких сайтов подходит данная защита

  • WordPress, Joomla, 1С Битрикс, Opencart, Drupal, MODX, Netcat, самописная
  • Для любых сайтов на PHP 5.6.4 и старше (тестировался на PHP 5.6.4 и 7.1.33, 8.3.15)

Технические требования

  • PHP >= 5.6.4 (тестировался на PHP 5.6.4 и 7.1.33, 8.3.15)
  • SQLite (используется только для ASN-списоков)

Быстрый старт

  1. Распакуйте файлы проекта в папку /antibot/
  2. Дайте права на запись папкам lists/, logs/ (опционально)
  3. Перейдите по адресу https://ваш_сайт/antibot/ и убедитесь, что нет ошибок
  4. Автоматически будет создан файл настроек config.ini
  5. В белый список добавятся ip вашего домена.
  6. Вставьте следующую строку в начало вашего кода:

Обычно это index.php в корне сайта.

require_once $_SERVER['DOCUMENT_ROOT'].'/antibot/index.php';

или в .htaccess

php_value auto_prepend_file ".../antibot/index.php"
  1. Проверьте работу сайта
  2. Проверьте лог на наличие предупреждений (.../antibot/logs/antibot.log)
  3. Готово

Подключение Яндекс Метрики с передачей IP и FingerPrint

Для корректного сбора данных о посетителях (IP-адрес и цифровой отпечаток браузера) и передачи referrer необходимо заменить стандартный код Яндекс Метрики на модифицированную версию.

1. Удалите старый код счетчика

Найдите на сайте код Яндекс Метрики (обычно начинается с <script src="https://mc.yandex.ru/metrika/...">) и полностью удалите его.

2. Подключите наш обработчик

Разместите следующий код в верхней части сайта (в <head>):

<!-- AWAF Tags -->
<script type="text/javascript" src="/antibot/js/tags.js"></script>
<!-- End AWAF Tags -->

3. Укажите идентификатор счетчика

В конфигурационном файле config.ini (в корне проекта) измените параметры:

[main]
metrika_site = "12345678"
save_referer = On ; передавать referrer (рекомендуется On)
utm_referrer = Off ; отключает альтернативный метод передачи referrer

Где 12345678 — номер вашего счетчика в Яндекс Метрике.

4. Настройте счетчик на сайте https://metrika.yandex.ru

Перейдите в Настройки -> Счетчик -> Дополнительные настройки, снимите галочку "Устаревший код счетчика"

Обновление

В систему встроена функция загрузки последних изменений из репозитория github.com. Для этого предусмотрены следующие настройки в config.ini:

[sysupdate]
enabled = Off ; On - обновит систему при следующем запуске
branch = dev ; master - стабильный выпуск, dev - для тестировщиков
lastupdate = "2025-05-19 00:13:32" ; дата последнего обновления системы

Если выставить enabled = On, то при следующем посещении сайта, система проверит новую версию, скачает и установит её. После чего параметр переключится в Off. Обычно обновление занимает не более 3(трех) секунд.

Папки и файлы logs/, lists/, .git, .gitignore и config.ini не заменяются.

Работа через прокси, балансировщики, сервисы защиты от DDOS, Cloudflare

При работе через проксирующие системы, сервер передает параметры: IP, протокол, версию протокола в специальных заголовках. Чтобы обеспечить совместимость с системой защиты в неё были добавлены соответствующие настройки.

Пример Nginx конфигурации для передачи IP на основной сервер:

location / {
    proxy_pass http://backend_server;
    proxy_set_header X-Forwarded-Proto $scheme;         # http или https
    proxy_set_header X-Forwarded-Http-Version $server_protocol;  # HTTP/1.0, HTTP/1.1, HTTP/2.0
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

Для правильной работы в файле config.ini необходимо включить блок header_proxy и указать соответствующие заголовки как в примере ниже.

[header_proxy]
enabled = On ; Включает обработку дополнительных заголовков
header_ip = X-Real-IP ; ip-адрес
header_http_version = X-Forwarded-Http-Version ; версия HTTP
header_protocol = X-Forwarded-Proto ; http или https

Для других прокси, могут быть другие заголовки. Чтобы их обнаружить создайте php-файл со следующим содержимым и найдите их в переменной _SERVER.

<?php
phpinfo();
?>

Пример для Cloudflare

1748032992338

[header_proxy]
enabled = On
header_ip = HTTP_CF_CONNECTING_IP
header_http_version = SERVER_PROTOCOL
header_protocol = HTTP_X_FORWARDED_PROTO

PS Для платной версии Cloudflare могут быть другие значения.

Белый список

Файл /lists/whilelist_ip содержит список исключений ip-адресов.

Пример:

2001:0db8::85a3:8a2e:0370:7334 #пример для IPv6
5.24.102.211 # пример для IPv4
5.24.102.0/24 # ip/маска
5.24.102.0 - 5.24.102.254 # диапазон

Черный список

Файл /lists/blacklist_ip содержит список заблокированных ip-адресов. В этот список обычно попадают пользователи, которые пытались каким-ли образом обойти механизм проверки на роботность.

Пример файла:

32.23.104.201 # c5b4c36d24417e72 tor
32.23.104.202 # manual ip
32.23.104.0/24 # ip/маска
32.23.104.0 - 32.23.104.254 # диапазон

В данном примере указан IP-адрес, RayID для удобства поиска и комментарий. В данном случае, причина добавления — посещение из Tor-сети и ручная блокировка.

Исключения по User-agent

Файл /lists/whitelist_useragent содержит список разрешающих совпадений User-agent. Можно писать регулярные выражения. Правила проверяются поочередно до первого срабатывания.

Например: Чтобы включить страницу проверки для Android Browser с высокими отказами, в файл lists/captcha_useragent добавляем Linux.*Android.*AppleWebKit

Исключения по URL

Файл /lists/whitelist_url содержит список исключений URL адресов и параметров.

Например:

  • /wp-json/ будет пропускать REST API запросы в Wordpress
  • реглярное выражение .*\.xml$ будет пропускать все xml файлы.

Правила проверяются поочередно до первого срабатывания.

Когда это может пригодиться?

  1. Например, если нужно защитить страницу формы обратной связи. Добавьте URL в captcha_uri и пользователю сначала придется пройти капчу перед заполнением формы.

  2. Так же можно поступить с адресами регистрации или авторизации пользователей для снижение автоматических регистраций и подбора пароля.

  3. Добавьте URL админ-панели CMS в черный список. В этом случае в нее сможет зайти только тот, кто указана в белом списке (по ip, asn или другим исключениям).

  4. Сэкономьте на рекламе Яндекс Директ. Укажите параметр yclid=, чтобы пропустить посетителей из Яндекс Директ через капчу. Настройте оплату за конверсии. В этом случае деньги за незаинтересованного посетителя не спишутся.

  5. Фильтруйте другие URL страницы или GET-запросы.

Индексирующие роботы

Файл /lists/indexbot_rules содержит список PTR индексирующих роботов. Указывается домен первого уровня.

PS Для определения индексирующего робота делается DNS-запрос. Некоторые хостеры устанавливают лимиты на количество обращений к их DNS с одного ip-адреса. Запросы кэшируются, но при высокой посещаемости это может вызвать замедление сайта. В этом случае рекомендуется сменить хостера или отключить защиту. Позже будет добавлен внешний DNS. Проблема встречается редко.

Блокировка по FingerPrint

В защите реализована генерация уникального идентификатора браузера посетителя (FingerprintJS). Это позволяет блокировать ip-адреса одного и того же бота.

В список lists/blacklist_fingerprint можно добавить Fingerprint. Если система обнаружит его у посетителя, то добавит ip в черный список.

Протокол HTTP

Возможность заблокировать ботов, использующих устаревшие версии HTTP-протоколов.

Опция предназначена для опытных пользователей. Чтобы её использовать, сервер должен корректно отдавать значение $_SERVER["SERVER_PROTOCOL"], 99% отдает протокол между nginx<->apache.

[http_checker]
enabled = On ; проверка версии HTTP-протокола
protocols = "HTTP/1.0" ; перечисления протоколов через запятую, HTTP/1.0,HTTP/1.1
action = BLOCK ; ALLOW - разрешить, CAPTCHA - капча, BLOCK - заблокировать, SKIP - пропустить правило
add_blacklist_ip = Off ; On - добавить ip в черный список

Блокировка по ASN

Вы также можете блокировать пользователе и ботов по номерам Автономных Систем (AS), либо настроить показ капчи.

Как работает?

Добавляйте номера автономных система в файл 'lists/blacklist_asn', например: AS8637, AS8638 и т.д. (каждая запись с новой строки). Система запросит список сетей для каждой AS и добавляет их в кеш, по-которому будет проходить проверка. Посмотреть добавленные сети можно в лог-файле 'logs/antibot.log'.

По-умолчанию, обновление списка настроено на 7 дней, но лучше сделать 14-30 дней, т.к. данные обновляются редко.

[asn_checker]
enabled = On
whitelist_asn = "lists/whitelist_asn"
blacklist_asn = "lists/blacklist_asn"
captcha_asn = "lists/captcha_asn"

Источник списков: https://github.com/ipverse/as-ip-blocks

Блокировка по FPS

Основным индикатором для обнаружения ботов является низкая частота кадров. Если значение FPS стабильно ниже 30 или равно нулю (что характерно для серверов без монитора), это с высокой вероятностью указывает на бота.

Есть один недостаток — это блокировка пользователей, работающих через RDP (Удаленный рабочий стол), но в этом случае можно настроить показ капчи.

[fps_checker]
enabled = On
action = CAPTCHA ; CAPTCHA - капча, BLOCK - заблокировать, SKIP - ничего не делать
fps = 50 ; минимальная частота кадров

Отдача 404 заголовка

Можно настроить отдачу 404 заголовка при отображении страницы проверки. Это позволить отсеять ботов, которые обрабатываю 404 ошибку. Для этого установите следующее значение в On.

[main]
header404 = On ; отдает на страницу проверки 404 заголовок

Log-файл и отладка

Каждое посещение записывается в лог-файл logs/antibot.log. Тут можно отследить процесс фильтрации и понять причину блокировки. Лог очень хорошо анализируется ChatGPT, DeepSeek и другими нейросетями. Отключение лога возможно в файле настроек.

[main]
debug = Off

Отключение логирования повышает скорость фильтрации, т.к. нет необходимости лишний раз писать данные на диск.

Вы также можете настроить ротацию логов.

[logs]
max_size = 10 ; Максимальный размер, MB
rotate = 7 ; Количество файлов ротации

Как разблокировать пользователя

Для разблокировки, пользователь должен сообщить RayID и IP, которые отображаются внизу страницы. Используйте их, чтобы найти запись в blacklist_ip, или для поиска причины блокировки.

Автор ПО

EgorNiKO

About

AWAF защита от ботов ПФ, эмулирующих браузер, JavaScript, а так же классических ботов.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors