Коротко: если у вас свой сервер с nginx и PHP-FPM, защиту Bot Guard можно подключить без плагина CMS. nginx перед каждым запросом спрашивает небольшой PHP-шлюз, пускать ли посетителя, шлюз передаёт данные запроса в Bot Guard и отвечает «пропустить», «заблокировать» или «показать проверку браузера». Установка занимает около пятнадцати минут, архив с файлами лежит ниже.

Когда это нужно

Для WordPress и 1С-Битрикс у нас есть готовые плагин и модуль. Вариант для nginx подходит, если сайт не на этих системах (самописный, Laravel, Django, статический сайт, интернет-магазин на другой платформе) или если вы хотите, чтобы проверка шла на уровне сервера, раньше, чем запрос дойдёт до приложения. Бот в этом случае вообще не нагружает ваш PHP, базу и CMS: отказ выдаёт nginx.

Как это устроено

  1. Посетитель обращается к сайту, nginx принимает запрос.
  2. Директива auth_request отправляет внутренний подзапрос в шлюз gate.php. Подзапрос не виден посетителю.
  3. Шлюз передаёт в Bot Guard IP-адрес, User-Agent, метод, referer, язык браузера и адрес запроса и получает ответ: нормальный посетитель, бот или подозрительный.
  4. Шлюз отвечает nginx кодом: 204 (пропустить), 403 (заблокировать) или 401 (показать тихую проверку браузера).
  5. На 401 nginx отдаёт страницу challenge.html. Скрипт на ней незаметно получает у Bot Guard метку-cookie и перезагружает страницу. Человек этого не замечает, простой скрипт-бот проверку не проходит.

Если Bot Guard не ответил за две секунды или ответ непонятен, посетитель пропускается: защита не должна останавливать сайт. Настоящих поисковых роботов (Google, Яндекс и другие) Bot Guard проверяет сам, по обратному DNS, отдельно настраивать их не нужно.

Что понадобится

  • nginx с модулем http_auth_request_module. Он есть в большинстве сборок, проверка: nginx -V 2>&1 | grep auth_request.
  • PHP 7.4 или новее с расширением curl (PHP-FPM).
  • Сайт, добавленный в личном кабинете на bot-guard.ru: оттуда берётся номер сайта.

Установка

1. Скачайте архив bot-guard-nginx-1.0.zip и распакуйте файлы gate.php и challenge.html в каталог /etc/nginx/botguard/.

2. Впишите номер сайта в страницу проверки (замените 123 на свой номер):

sed -i 's/YOUR_SITE_ID/123/g' /etc/nginx/botguard/challenge.html

3. Добавьте блоки в конфиг сайта. Полный пример лежит в архиве (nginx.conf.example), главное:

location = /_botguard_gate {
    internal;
    fastcgi_pass unix:/run/php/php-fpm.sock;
    fastcgi_param SCRIPT_FILENAME /etc/nginx/botguard/gate.php;
    fastcgi_param BOTGUARD_SITE_ID 123;
    fastcgi_param HTTP_X_REAL_IP $remote_addr;
    fastcgi_param HTTP_X_ORIGINAL_URI $request_uri;
    fastcgi_param HTTP_X_ORIGINAL_METHOD $request_method;
    fastcgi_param HTTP_COOKIE $http_cookie;
    include fastcgi_params;
    fastcgi_pass_request_body off;
    fastcgi_param CONTENT_LENGTH "";
}

location @botguard_challenge {
    root /etc/nginx/botguard;
    default_type text/html;
    add_header Cache-Control "no-store" always;
    try_files /challenge.html =500;
}

error_page 401 = @botguard_challenge;

location / {
    auth_request /_botguard_gate;
    # ... ваш обычный location (proxy_pass, try_files или fastcgi_pass) ...
}

Подставьте свой номер сайта и путь к сокету PHP-FPM. Статику (картинки, стили, скрипты) удобно вынести в отдельный location без auth_request: так вы не тратите проверки на файлы.

4. Проверьте и перезагрузите:

nginx -t && systemctl reload nginx

Как проверить, что работает

  • Откройте сайт обычным браузером: он должен открываться как раньше, без задержки и без капчи.
  • В личном кабинете Bot Guard в статистике сайта должны появиться визиты.
  • Проверка скриптом: запрос без User-Agent шлюз пропускает (нет данных для решения), а запрос от известного плохого бота получает 403. Не тестируйте с собственного IP много раз подряд: защита может занести его в список блокировок, это нормально, но неприятно.

Подводные камни

  • Не используйте return и rewrite ... break внутри защищаемого location. Эти директивы выполняются раньше auth_request, и защита молча перестаёт работать. Нужны proxy_pass, try_files или fastcgi_pass.
  • Если PHP-FPM лёг, auth_request отдаст посетителю ошибку. Шлюз сам пропускает посетителя при сбое Bot Guard, но за доступностью PHP-FPM следите отдельно (например, дайте шлюзу свой пул процессов).
  • Реальный IP за прокси или CDN. Если перед nginx стоит балансировщик, настройте модуль realip, иначе шлюз увидит IP балансировщика, а не посетителя.
  • Кэширование. Не включайте кэш ответов шлюза на уровне nginx: решение зависит от посетителя.

Что передаётся в Bot Guard

IP-адрес, User-Agent, метод запроса, referer, язык браузера и адрес запрошенной страницы. Содержимое страниц, формы и пароли не передаются. Сроки хранения и цели описаны в политике конфиденциальности.

Отпечаток TLS: заготовка на будущее

У крупных сервисов защиты есть сигнал, которого нет у плагинов, — отпечаток TLS-соединения (JA3/JA4): скрипт может назваться Chrome, но рукопожатие у него другое. Плагин CMS его не видит, а nginx — может, если собран с нужным модулем. Шлюз уже умеет принимать отпечаток в заголовке X-JA3 (строка в конфиге закомментирована), но пока только пересылает его: на решение он не влияет. Мы добавим его в оценку, когда накопим данные.

Вопросы и ответы

Это платно? На дату публикации Bot Guard бесплатен, условия описаны в условиях использования.

Замедлит ли это сайт? К каждому запросу добавляется один быстрый подзапрос к Bot Guard (ограничение — две секунды, обычно заметно меньше). Статику лучше исключить из проверки.

А если у меня WordPress или Битрикс? Проще поставить плагин или модуль.

Чем это отличается от fail2ban? fail2ban банит по строкам в логе после того, как бот уже отработал; здесь решение принимается до обработки запроса, и учитываются данные всей сети подключённых сайтов. Подробнее про логи и fail2ban: статья.

Если хотите понять, сколько ботов приходит на ваш сайт до подключения, начните с бесплатных инструментов: разбор access-лога или Яндекс.Метрики.

Защитите свой сайт от ботов прямо сейчас

Подключение занимает несколько минут — вставьте один PHP-сниппет, и Bot Guard начнёт фильтровать ботов, скрейперов и попытки SQL-инъекций автоматически.

Зарегистрироваться бесплатно
Заказать звонок

Читайте также

CAPTCHA: что это такое и как защищает сайт от ботов
Узнайте, что такое CAPTCHA, как она появилась и почему это важный барьер для безопасности …
Что такое Zero-Day уязвимость и как защититься от невидимой угрозы
Zero-Day уязвимости — самые опасные киберугрозы без готовой защиты. Узнайте, что такое ата…
Боты на сайте: 21 тип автоматизированных угроз по классификации OWASP
Классификация OWASP Automated Threats на русском: 21 тип атак ботов от скрейпинга и creden…