Атака китайских ботов

Вопросы без привязки к версии. Установлена авточистка (2 года).
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ | Как задавать вопросы | Как устанавливать расширения

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
lexuz
phpBB 1.2.0
Сообщения: 15
Стаж: 7 лет 7 месяцев
Благодарил (а): 1 раз

Re: Атака китайских ботов

Сообщение lexuz »

Kuskow писал(а): 02.06.2026 14:04 Никакой шлагбаум не открывается, поскольку скрипт вылетает с ошибкой, дальше не выполняется, бот получает 500.
тут вы не правы.
Можно использовать консольную команду:

Код: Выделить всё

curl -i -H "User-Agent:" https://forums.test.com
Тогда в логе появится ошибка:

Код: Выделить всё

FastCGI sent in stderr: "PHP message: PHP Warning:  Undefined array key "HTTP_USER_AGENT" in config.php on line 26; PHP message: PHP Warning:  Undefined array key "HTTP_USER_AGENT" in config.php on line 37" while reading response header from upstream, client: x.x.x.x, server: forums.test.com, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/var/run/php/php8.2-fpm.sock:", host: "forums.test.com"
а в access логе мы увидим:

Код: Выделить всё

x.x.x.x - - [15/Jun/2026:22:39:26 +0000] "GET / HTTP/1.1" 200 34276 "-" "-"
при этом curl получит весь текст страницы.

т.е. не работает шлагбаум, при отсутствии useragent, форум отдаёт страницу
Аватара пользователя
Kuskow
phpBB 2.0.4
Сообщения: 403
Стаж: 10 лет
Откуда: 🇰🇿 Караганда
Благодарил (а): 27 раз
Поблагодарили: 38 раз

Re: Атака китайских ботов

Сообщение Kuskow »

Vlad__ писал(а): 14.06.2026 21:52 И еще - условия if в nginx не выполняются все и последовательно как в обычных языках програмирования, поэтому ваш скрипт не рабочий вот в этом месте. В nginx такое кошерно делать с помощью map.
Всё верно, if в location — это известное зло (If Is Evil), оно ломает наследование директив модулей и переключает контекст в nested location.
Но в моём случае этот конфиг подключается на уровне server (через hcp conf_extra). На уровне server директивы if отрабатывают последовательно, как декларативный конвейер, еще до выбора location. Поэтому в данном контексте логика с флагами $bot_check работает стабильно, предсказуемо и ничего не ломает.
В location мы этот код умышленно не пихаем, а если придётся переносить туда — тогда, конечно, перепишем всё на кошерный map.
Аватара пользователя
Kuskow
phpBB 2.0.4
Сообщения: 403
Стаж: 10 лет
Откуда: 🇰🇿 Караганда
Благодарил (а): 27 раз
Поблагодарили: 38 раз

Re: Атака китайских ботов

Сообщение Kuskow »

Vlad__ писал(а): 14.06.2026 1:37 Нужно ли так однозначно? Заголовки запрашивают не только боты.
Спасибо. Замечание переосмысленно и всё переделано заново. Теперь так:

/home/USER/conf/web/DOMAIN.COM/nginx.ssl.conf_extra * У каждого свой путь

Код: Выделить всё

# 1. Легальным, но нежелательным ботам запрещено только сейчас
if ($http_user_agent ~* "Mediapartners") { return 403; }

# 2. Поведенческая блокировка наглых ботов без cookies
# 2a. Помечаем точки входа
set $bot_check "";
if ($http_user_agent ~* "keys-so|python|Firefox/72") { set $bot_check "A"; }
if ($request_uri ~* "/adm/|ucp\.php|author=|posting\.php|profile\.php|\.env|\.git|\.aws|\.terraform") { set $bot_check "A"; }
if ($server_protocol ~ "HTTP/1") { set $bot_check "A"; }
if ($request_method = HEAD) { set $bot_check "A"; }
# 2b. Проверка наличия cookies
if ($http_cookie = "") { set $bot_check "${bot_check}C"; }
# 2c. Исключения (ПС и мессенджеры) — обнуляем всё для своих
if ($http_user_agent ~* "Yandex|Googlebot|Google-|Applebot|bingbot|Baiduspider|GPTBot|whatsapp|telegram|facebook") { set $bot_check ""; }
if ($request_uri ~* "robots\.txt") { set $bot_check ""; }
# 2d. Исполнение приговоров
if ($bot_check = "AC") { return 444; }

# 3. Мягкие ответы
# 3a. Этих страниц уже не существует
if ($request_uri ~* "thankslist|/hostiman/") { return 410; }
# 3b. Системные заглушки
location ^~ /.well-known/acme-challenge/ { allow all; }
location /.well-known/ { log_not_found off; return 204; }
Блок 3а - это чисто моё, так как я удалил у себя это расширение после 10 лет использования.
Блок 1 - тоже только моё, так как вообще никаких рекламных блоков нет на сайте.
К остальному тоже надо подходить вдумчиво, а не пихать сразу в свой сайт.

Настройка fail2ban. В /etc/fail2ban/jail.local добавлен блок:

Код: Выделить всё

[nginx-bot-444]
enabled  = true
#port    = http,https
filter   = nginx-bot-444
action   = hestia[name=WEB]
logpath  = /var/log/nginx/domains/DOMAIN.COM.log
maxretry = 2
findtime = 600
bantime  = 86400
* Вместо /var/log/nginx/domains/DOMAIN.COM.log нужно писать свой путь к логу.

Создан файл /etc/fail2ban/filter.d/nginx-bot-444.conf такого содержания:

Код: Выделить всё

[Definition]
# Ищем IP, получивший код ответа 444 в любой строке лога
failregex = ^<HOST> -.*" (444) .*$
ignoreregex =

Ну и не забываем перезапускать службы nginx и fail2ban после изменений.
Последний раз редактировалось Kuskow 16.06.2026 6:17, всего редактировалось 1 раз.
Аватара пользователя
Kuskow
phpBB 2.0.4
Сообщения: 403
Стаж: 10 лет
Откуда: 🇰🇿 Караганда
Благодарил (а): 27 раз
Поблагодарили: 38 раз

Re: Атака китайских ботов

Сообщение Kuskow »

И вот результат за сутки. Если бы не настроил fail2ban, 444 ответов было бы во много раз больше. * У каждого свой путь к логам сервера

awk '{print $9}' /var/log/nginx/domains/DOMAIN.COM.log | sort | uniq -c | awk '{print $2, $1}' | sort -nr -k2,2

Код: Выделить всё

200 300873
444 17948
308 9497
302 6676
304 2368
403 1258 моя защита
403 662 сам phpBB
301 1801
404 1344
499 650
410 635
425 337
204 238
206 50
307 16
400 2
401 1

fail2ban-client status nginx-bot-444

Код: Выделить всё

Status for the jail: nginx-bot-444
|- Filter
|  |- Currently failed: 33
|  |- Total failed:     20558
|  `- File list:        /var/log/nginx/domains/DOMAIN.COM.log
`- Actions
   |- Currently banned: 557
   |- Total banned:     1560
Аватара пользователя
Nekstati
Поддержка
Поддержка
Сообщения: 3352
Стаж: 17 лет 2 месяца
Благодарил (а): 19 раз
Поблагодарили: 574 раза

Re: Атака китайских ботов

Сообщение Nekstati »

Вариант блокировки ботов с помощью PHP для тех, кто не может менять настройки Nginx/Apache. Или для тех, кто устал писать логику в конфигах, для этого не предназначенных.

Открыть файл
common.php
Найти
if (!defined('IN_PHPBB'))
Добавить перед

Код: Выделить всё

function applyBotProtection() {
	$userAgent = $_SERVER['HTTP_USER_AGENT'] ?? '';
	$userIp = $_SERVER['REMOTE_ADDR'] ?? '';

	// 0. Исключение для ботов, чьи юзерагенты нам неизвестны и могут быть пусты, но известен адрес, по которому они приходят
	if (preg_match('/epayment\/(yoomoney|webmoney)/', $_SERVER['REQUEST_URI'])) {
		return;
	}

	// 1. Блокировка запросов без юзерагента
	if (empty($userAgent)) {
		header($_SERVER["SERVER_PROTOCOL"] . ' 403 Forbidden');
		exit('Access Denied');
	}

	// 2. Исключение для полезных ботов
	if (preg_match('/Googlebot|YandexBot|YandexMobileBot|YandexImages|YandexVideo|YandexNews|YandexMetrika|Bingbot|TelegramBot/i', $userAgent)) {
		return;
	}

	if (session_status() === PHP_SESSION_NONE) {
		session_start();
	}

	// 3. Проверка браузера по куке (защита от простейших автоматических парсеров)
	$secret_salt = "AntiBotWindows2026_Key";
	$cookie_name = "server_validate";
	$expected_cookie_value = md5($userIp . $secret_salt);
	
	if (!isset($_COOKIE[$cookie_name]) || $_COOKIE[$cookie_name] !== $expected_cookie_value) {
		if (isset($_GET['validate_bot']) && $_GET['validate_bot'] === $expected_cookie_value) {
			setcookie($cookie_name, $expected_cookie_value, time() + 86400, "/");
			$clean_url = preg_replace("/[?&]validate_bot=$expected_cookie_value/", '', $_SERVER['REQUEST_URI']);
			header("Location: " . $clean_url);
			exit;
		}
		
		header("Content-Type: text/html; charset=utf-8");
		$redirect_url = $_SERVER['REQUEST_URI'] . (strpos($_SERVER['REQUEST_URI'], '?') === false ? '?' : '&') . 'validate_bot=' . $expected_cookie_value;
		echo '<!DOCTYPE html><html dir="ltr" lang="ru"><head><meta http-equiv="refresh" content="0;url=' . htmlspecialchars($redirect_url) . '"></head>';
		echo '<body><p style="text-align:center;margin-top:100px;font-family:sans-serif;">Проверка браузера... Пожалуйста, подождите.</p></body></html>';
		exit;
	}

	// 4. Вредные боты и IP
	$badBotsPattern = '/facebookexternalhit|BLEXBot|SemrushBot|AhrefsBot|Amazonbot|MJ12bot|Bytespider|claudebot|DataForSeoBot|gptbot|'
		. 'GeedoProductSearch|GeedoBot|SeopultContentAnalyzer|SeekportBot|Barkrowler|DotBot|PetalBot|LinkpadBot|statdom|MegaIndex|'
		. 'WebDataStats|Jooblebot|BackupLand|thesis|fidget|Mediatoolkitbot/i';
	$badIps = [
		// '23.22.35.162',
		// '52.70.240.171',
	];
	
	$isBadBot = preg_match($badBotsPattern, $userAgent) || in_array($userIp, $badIps, true);
	$maxRequestsPerSecond = $isBadBot ? 2 : 5;

	// 5. Исключение: легитимное скачивание файлов с корректным реферером пропускаем без проверки, т.к. на странице м.б. десятки картинок
	$isDownloadFile = (strpos($_SERVER['REQUEST_URI'], 'download/file.php') !== false);

	if ($isDownloadFile
	&& !empty($_SERVER['HTTP_REFERER'])
	&& !empty($_SERVER['SERVER_NAME'])
	&& stripos($_SERVER['HTTP_REFERER'], $_SERVER['SERVER_NAME']) !== false) {
		return;
	}

	// 6. Проверка активного бана
	$currentTime = microtime(true);
	
	if (isset($_SESSION['ban_until']) && $_SESSION['ban_until'] > $currentTime) {
		$remainingBanTime = ceil($_SESSION['ban_until'] - $currentTime);
		header($_SERVER["SERVER_PROTOCOL"] . ' 429 Too Many Requests');
		header('Retry-After: ' . $remainingBanTime);
		exit('Too many requests. Please retry in ' . $remainingBanTime . ' seconds.');
	}

	// 7. Скользящее окно тротлинга (1 секунда)
	if (!isset($_SESSION['request_times']) || !is_array($_SESSION['request_times'])) {
		$_SESSION['request_times'] = [];
	}
	
	// Очищаем метки старше 1 секунды
	$_SESSION['request_times'] = array_values(array_filter(
		$_SESSION['request_times'],
		// fn($t) => ($currentTime - $t) < 1.0
		function($t) use ($currentTime) { return ($currentTime - $t) < 1.0; }
	));
	
	// Проверяем лимит
	if (count($_SESSION['request_times']) >= $maxRequestsPerSecond) {
		// Превышен лимит — ставим бан на 5 секунд
		$_SESSION['ban_until'] = $currentTime + 5.0;
		
		header($_SERVER["SERVER_PROTOCOL"] . ' 429 Too Many Requests');
		header('Retry-After: 5');
		exit('Too many requests. Please retry in 5 seconds.');
	}
	
	// Всё ок — добавляем текущий запрос в счётчик
	$_SESSION['request_times'][] = $currentTime;
}

applyBotProtection();
  
Что делает этот скрипт:
  • простейшая проверка браузера по кукам
  • ограничение 2 запроса в секунду для известных бесполезных ботов
  • ограничение 5 запросов в секунду для прочих клиентов
  • если этот порог превышен, клиент банится на 5 секунд
  • нет ограничений для полезных ботов (Google, Yandex, Bing)
  • нет ограничений для download/file.php при условии правильного реферера (картинок на странице могут быть десятки)
Прежде чем применять скрипт:
  • (важно) замените "download/file.php" на что-то своё, если у вас ссылки на вложения выглядят иначе (напр. установлено расширение SEO Images in attachment)
  • (важно) замените "/epayment\/(yoomoney|webmoney)/" на что-то своё, если ожидаете запросы от полезного бота на конкретный адрес, но юзерагент этого бота вам неизвестен и может быть пуст (напр. запросы от платёжных систем типа ЮMoney)
  • можно добавить юзерагенты полезных ботов в список "/Googlebot"..., если они вам известны
  • можно добавлять какие-то IP по ситуации в список $badIps
Такая блокировка происходит в самом начале работы PHP-скриптов, прежде чем заворочается вся тяжёлая машинерия форума, и поэтому снижает нагрузку многократно. И хотя блокировка с помощью Nginx/Apache эффективнее, такой PHP-блокировки может оказаться вполне достаточно. Пробуйте.
Ne_Guru
phpBB 1.2.0
Сообщения: 12
Стаж: 1 день
Благодарил (а): 3 раза

Re: Атака китайских ботов

Сообщение Ne_Guru »

Спасибо огромное, Nekstati!
Внес этот скрипт в common.php - количество ботов сократилось многократно.

У меня есть еще один форум, там версия 3.2.11.
На радостях я внес этот скрипт и туда: в итоге форум перестал загружаться и от этой вставки пришлось срочно отказываться.
Можно ли как-то решить этот вопрос на более низкой версии форума? (3.2.11)
Был бы вам очень признателен.
Аватара пользователя
Татьяна5
Поддержка
Поддержка
Сообщения: 13107
Стаж: 14 лет 10 месяцев
Благодарил (а): 165 раз
Поблагодарили: 2388 раз

Re: Атака китайских ботов

Сообщение Татьяна5 »

Ne_Guru, версия php, что в логах ошибок на сервере?
Ne_Guru
phpBB 1.2.0
Сообщения: 12
Стаж: 1 день
Благодарил (а): 3 раза

Re: Атака китайских ботов

Сообщение Ne_Guru »

Татьяна5,
Версия PHP - 5.6.40
В админке нашел только Лог ошибок (во вкладке "Обслуживание") - он девственно чист.
Где-то в другом месте можно лог ошибок на сервере посмотреть?
Аватара пользователя
Татьяна5
Поддержка
Поддержка
Сообщения: 13107
Стаж: 14 лет 10 месяцев
Благодарил (а): 165 раз
Поблагодарили: 2388 раз

Re: Атака китайских ботов

Сообщение Татьяна5 »

Ne_Guru писал(а): Сегодня 14:42 Где-то в другом месте можно лог ошибок на сервере посмотреть?
Да, на самом сервере, error.log или что-то похожее (обычно выше папки с форумом находится)

Отправлено спустя 2 минуты 37 секунд:
Ne_Guru писал(а): Сегодня 14:425.6.40
Как минимум:

Код: Выделить всё

	$userAgent = $_SERVER['HTTP_USER_AGENT'] ?? '';
	$userIp = $_SERVER['REMOTE_ADDR'] ?? '';
Заменить на

Код: Выделить всё

	$userAgent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';
	$userIp = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '';
А что дальше вылезет - надо смотреть по логам

Отправлено спустя 1 минуту 46 секунд:
Или поднять версию php. PhpBB 3.2.11 до 7.2 включительно поддерживает
Ne_Guru
phpBB 1.2.0
Сообщения: 12
Стаж: 1 день
Благодарил (а): 3 раза

Re: Атака китайских ботов

Сообщение Ne_Guru »

Татьяна5 писал(а): Сегодня 14:57 на самом сервере, error.log или что-то похожее
Там, похоже, всё запущено.
Заказал логи, при их заказе высветилась ошибка и надпись "обратитесь в техподдержку".

Буду разбираться, напишу по результатам, спасибо!

Отправлено спустя 15 минут 23 секунды:
Внес ваши изменения, форум работает.

Нашел лог ошибок, там была такая надпись:
veterancuba.su [Thu Jun 18 10:50:22 2026] [error] [pid 41503] sapi_apache2.c(325): [client 188.255.140.177:0] PHP Parse error: syntax error, unexpected '?' in /home/v/veterancu/public_html/forum/common.php on line 18

Только мне уже не вспомнить, что было в той 18-й строчке.
Возможно
function applyBotProtection() {
либо
$userAgent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';
$userIp = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '';


Ну, вот я это заменил, форум работает, ошибок сервер не выдал.

Отправлено спустя 5 минут 51 секунду:
Кол-во ботов стремительно снижается, но странное дело.
Когда я внес эти изменения в скрипт своего основного форума, где стоит версия 3.3.13, там сначала он показывал истинное кол-во посетителей, но потом постепенно кол-во ботов стало возрастать.



Желтой линией отмечено время, когда я внес изменения в файл common.php.
Ну, это просто для информации.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Kuskow
phpBB 2.0.4
Сообщения: 403
Стаж: 10 лет
Откуда: 🇰🇿 Караганда
Благодарил (а): 27 раз
Поблагодарили: 38 раз

Re: Атака китайских ботов

Сообщение Kuskow »

Vlad__ писал(а): 14.06.2026 1:37Тоже не совсем понятна логика. 1.0 и 1.1? Зачем 1.1?
Внезапно ощутил прилив жизненных сил от нашей с Google-ai прозорливости, прочитав вот это:
[ВАЖНО] Как избежать взлома на версиях phpBB до 3.3.17
Nekstati писал(а): 13.06.2026 18:40curll
Ne_Guru
phpBB 1.2.0
Сообщения: 12
Стаж: 1 день
Благодарил (а): 3 раза

Re: Атака китайских ботов

Сообщение Ne_Guru »

А количество запросов почему-то увеличилось.
zapros.jpg
А вот напоследок общая нагрузка.
nagruzka_total.jpg
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Nekstati
Поддержка
Поддержка
Сообщения: 3352
Стаж: 17 лет 2 месяца
Благодарил (а): 19 раз
Поблагодарили: 574 раза

Re: Атака китайских ботов

Сообщение Nekstati »

Kuskow, это была просто защита от полного дурака (неполный всегда нагуглит что ему надо).

Ne_Guru, запросы выросли в ~4 раза, а нагрузка не выросла или даже чуть упала. Что и требовалось. Интереснее будет попозже глянуть график за ~двое суток, до и после.
Ne_Guru
phpBB 1.2.0
Сообщения: 12
Стаж: 1 день
Благодарил (а): 3 раза

Re: Атака китайских ботов

Сообщение Ne_Guru »

Nekstati, хорошо, конечно, посмотрю!
Еще раз лично выражаю Вам огромную признательность за помощь!
Просто самоотверженный труд!
Горжусь Вами, Татьяной5, и всеми phpGuru!
Аватара пользователя
southklad
phpBB 3.1.0 RC4
Сообщения: 3453
Стаж: 14 лет 5 месяцев
Благодарил (а): 707 раз
Поблагодарили: 173 раза

Re: Атака китайских ботов

Сообщение southklad »

Nekstati писал(а): Вчера 20:09 (важно) замените "download/file.php" на что-то своё, если у вас ссылки на вложения выглядят иначе (напр. установлено расширение SEO Images in attachment)
А на что заменить, если стоит SEO Images in attachment?
Изображение

Вернуться в «phpBB-пространство»