Атака китайских ботов
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ | Как задавать вопросы | Как устанавливать расширения
Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение
).
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ | Как задавать вопросы | Как устанавливать расширения
Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение
-
hd321kbps
- phpBB 2.0.3
- Сообщения: 366
- Стаж: 14 лет 3 месяца
- Откуда: Россия, Крым, Армянск
- Благодарил (а): 191 раз
- Поблагодарили: 346 раз
Атака китайских ботов
Сегодня заметил на нескольких форумах наплыв ботов из китая от 100-300 одновременно, которые создают нагрузку на хостинг.
Все заходят с телефона Android и iphone Os.
Адреса ботов:
54.222.*.*
54.223.*.*
52.80.*.*
52.81.*.*
52.82.*.*
52.83.*.*
220.243.*.*
139.217.*.*
139.219.*.*
У кого наблюдается такое-же отпишитесь)
---------------------------
Варианты блокировки ботов:
Re: Атака китайских ботов - от Nekstati
Re: Атака китайских ботов - от Kuskow, php
Re: Атака китайских ботов - от Kuskow, nginx
Все заходят с телефона Android и iphone Os.
Адреса ботов:
54.222.*.*
54.223.*.*
52.80.*.*
52.81.*.*
52.82.*.*
52.83.*.*
220.243.*.*
139.217.*.*
139.219.*.*
У кого наблюдается такое-же отпишитесь)
---------------------------
Варианты блокировки ботов:
Re: Атака китайских ботов - от Nekstati
Re: Атака китайских ботов - от Kuskow, php
Re: Атака китайских ботов - от Kuskow, nginx
Последний раз редактировалось Татьяна5 17.07.2026 15:10, всего редактировалось 1 раз.
-
Kuskow
- phpBB 2.0.5
- Сообщения: 462
- Стаж: 10 лет 1 месяц
- Откуда: 🇰🇿 Караганда
- Благодарил (а): 29 раз
- Поблагодарили: 46 раз
Re: Атака китайских ботов
Perfecthus, сейчас реализованы все идеи, некоторые из них ждали 7 лет. Только 2 недели назад я понял, что людей не надо переадресовывать с p= на t=&start=. А потом увидел, как криво это работает на другом популярном форуме и убедился в своём выводе.
Пока нет нереализованных идей. Хорошо бы накопить практическую базу, услышать, у кого что не так. Тогда придёт что-то ещё, наверное.
Ну и результат настолько поражает, что хочется погордиться собой хоть какое-то время.
Пока нет нереализованных идей. Хорошо бы накопить практическую базу, услышать, у кого что не так. Тогда придёт что-то ещё, наверное.
Ну и результат настолько поражает, что хочется погордиться собой хоть какое-то время.
-
Kuskow
- phpBB 2.0.5
- Сообщения: 462
- Стаж: 10 лет 1 месяц
- Откуда: 🇰🇿 Караганда
- Благодарил (а): 29 раз
- Поблагодарили: 46 раз
Re: Атака китайских ботов
Интересно, что день ото дня отличается. Вчера было 780 подсетей вбане, сегодня только 170. То есть, позавчера была атака, а вчера боты взяли выходной или в отпуск ушли, или направились на другие сервера.Kuskow писал(а): 27.06.2026 16:27 Я теперь сделал так. Когда fail2ban обнаруживает 2x444 за две минуты, он банит на сутки не один конкретный адрес, а всю подсеть класса C, то есть, 1.2.3.x. Так что, соседние адреса забанены заранее ещё до того, как начнут лезть на кактус. В бане постоянно около 400 таких подсетей.
-
Shredder
- Former team member
- Сообщения: 2264
- Стаж: 17 лет 7 месяцев
- Благодарил (а): 165 раз
- Поблагодарили: 159 раз
Re: Атака китайских ботов
На PHP 7.4:
parse error syntax error на линии:
Код: Выделить всё
if ((int)@$_GET['start'] % match(basename($_SERVER['SCRIPT_NAME'],'.php')) { 'viewtopic' => $ppp, 'viewforum' => $tpf, default => 1 }) {-
Kuskow
- phpBB 2.0.5
- Сообщения: 462
- Стаж: 10 лет 1 месяц
- Откуда: 🇰🇿 Караганда
- Благодарил (а): 29 раз
- Поблагодарили: 46 раз
Re: Атака китайских ботов
Shredder, Да, пардон, для 7.4 нужно переписать этот блок:
Вот так правильно:
И поскольку это исправление критическое, сейчас выложу следующую версию с накопленными другими исправлениями и дополнениями.
Код: Выделить всё
# Неправильная пагинация
if ((int)@$_GET['start'] % match(basename($_SERVER['SCRIPT_NAME'],'.php')) { 'viewtopic' => $ppp, 'viewforum' => $tpf, default => 1 }) {
http_response_code(410); die; }
Вот так правильно:
Код: Выделить всё
# Неправильная пагинация
if ((int)@$_GET['start'] % (@$_GET['t'] ? $ppp : (@$_GET['f'] ? $tpf : 1))) { http_response_code(410); die; }
И поскольку это исправление критическое, сейчас выложу следующую версию с накопленными другими исправлениями и дополнениями.
-
Kuskow
- phpBB 2.0.5
- Сообщения: 462
- Стаж: 10 лет 1 месяц
- Откуда: 🇰🇿 Караганда
- Благодарил (а): 29 раз
- Поблагодарили: 46 раз
Re: Атака китайских ботов
Новая версия 5.1 антибота для тех, у кого нет доступа к настройкам Apache/Nginx. Отсекаются зловредные боты, оптимизируется нагрузка на базу данных за счёт исправления запросов. Проверено и работает на своём форуме (в профиле есть ссылка). Совместимо с PHP 7.4 и 8.x. Если раньше устанавливали этот скрипт, теперь нужно выполнить только пункт 2. Основные отличия от предыдущей версии:
В самое начало файла
* Обязательно повторить это исправление после каждого обновления версии движка, иначе ни один человек на новом устройстве не сможет зайти или зарегистрироваться на форуме.
В конец файла
** Перед сохранением файла исправить в тексте значения параметров
*** Если у вас страница /index.php отличается от / и это важно - исключите из кода блок "Корень форума" или закомментируйте его.
Заходим в админку своего phpBB:
3.1. ОБЩИЕ -> Очистить кэш.
3.2. ОБЩИЕ -> Сброс рекорда посещаемости.
- исправлен блок неправильной пагинации для совместимости с PHP 7.4
- введена обработка корня форума / и переадресация /index.php на корень
- блоки расставлены в логическом эффективном порядке
/assets/javascript/core.js добавляем следующий код (прям первой строкой).* Обязательно повторить это исправление после каждого обновления версии движка, иначе ни один человек на новом устройстве не сможет зайти или зарегистрироваться на форуме.
Код: Выделить всё
document.cookie = "checked=1; path=/; max-age=31104000; SameSite=Lax";config.php добавляем (у кого уже есть, заменяем) следующий код.** Перед сохранением файла исправить в тексте значения параметров
$ppp = 20 и $tpf = 100 на свои. Где их взять - написано там же в тексте. *** Если у вас страница /index.php отличается от / и это важно - исключите из кода блок "Корень форума" или закомментируйте его.
Код: Выделить всё
### Барьер для ботов phpBB, версия 5.1. Авторы: Kuskow & AI on Google Search
if ($uri = (string)@$_SERVER['REQUEST_URI']) { # не cli
if (!@$_COOKIE['checked']) { # не человек в браузере
$ua = $_SERVER['HTTP_USER_AGENT'] ?? 'python';
# Невозможный адрес страницы или заведомо плохой бот
if (preg_match('#sid=|=print|\?start=|(posting|search|memberlist|[um]cp|config|profile)\.php|/adm/#', $uri)
or preg_match('#ChatGPT|meta-|keys-so|python|Firefox/72#i', $ua)
or strpos($_SERVER['HTTP_REFERER'] ?? '', '#')) {
http_response_code(410); die; }
# Корень форума
if (substr($_SERVER['SCRIPT_NAME'], -10) === '/index.php') {
if ($_GET) { http_response_code(410); die; }
if ($uri[-1] !== '/') { header('Location: ./', true, 301); die; }}
# Параметры взять из админки: Общие -> Конфигурация -> Размещение сообщений
$ppp = 20; # количество сообщений на странице темы
$tpf = 100; # количество тем на странице форума
# Неправильная пагинация
if ((int)@$_GET['start'] % (@$_GET['t'] ? $ppp : (@$_GET['f'] ? $tpf : 1))) { http_response_code(410); die; }
# p= заменяем на t=&start=
if (($post_id = (int)@$_GET['p'])
and ($conn = @mysqli_connect($dbhost, $dbuser, $dbpasswd, $dbname, $dbport))) {
$t_posts = $table_prefix . 'posts';
$res = mysqli_query($conn, "SELECT p1.topic_id, COUNT(p2.post_id) AS older_posts
FROM {$t_posts} p1
LEFT JOIN {$t_posts} p2 ON p2.topic_id = p1.topic_id AND p2.post_time < p1.post_time AND p2.post_visibility = 1
WHERE p1.post_id = {$post_id} AND p1.post_visibility = 1
GROUP BY p1.topic_id");
if ($data = mysqli_fetch_assoc($res)) {
$start = intdiv($data['older_posts'], $ppp) * $ppp;
$url = 'viewtopic.php?t=' . $data['topic_id'] . ($start ? '&start=' . $start : '');
header('Location: ' . $url, true, 301); die; }
http_response_code(410); die; }
# Хороших ботов и новых посетителей объединяем в одном аккаунте без сессии
$_SERVER['HTTP_USER_AGENT'] = 'Googlebot/'; }
# Избавляемся от сорных параметров
if (preg_match('#view(topic|forum)\.php|search\.php|/\?#', $uri)
and ($newuri = rtrim(str_replace('?&', '?', preg_replace('#&(sid|hilit|[fgy][bcs]+lid|utm_\w+)=[^&]*#', '', str_replace('?', '?&', $uri))), '?&')) !== $uri) {
header('Location: ' . $newuri, true, 308); die; }
}
3.1. ОБЩИЕ -> Очистить кэш.
3.2. ОБЩИЕ -> Сброс рекорда посещаемости.
-
angst66
- phpBB 3.0.0 RC3
- Сообщения: 1581
- Стаж: 14 лет 6 месяцев
- Благодарил (а): 50 раз
- Поблагодарили: 81 раз
Re: Атака китайских ботов
Опять ошибка при открытии поиска в админке
Illegal use of $_SERVER. You must use the request class to access input data. Found in тут вторая строчка кодаThis error message was generated by deactivated_super_global Изменил ее на if ($uri = (string)@$request->server['REQUEST_URI']) { Ошибка пропала. Не знаю правильно или нет-
Kuskow
- phpBB 2.0.5
- Сообщения: 462
- Стаж: 10 лет 1 месяц
- Откуда: 🇰🇿 Караганда
- Благодарил (а): 29 раз
- Поблагодарили: 46 раз
Re: Атака китайских ботов
Это из-за того, что при настройках поиска Sphinx (только)
Пока временно можно сделать так, а потом что-нибудь придумаем ещё. Замените первую строку:
Отправлено спустя 53 минуты 57 секунд:
Нужно ли загромождать этой проверкой основной код? Думаю, что нет. Ведь этот барьер придуман для тех, у кого нет доступа к Apache/Nginx, а если стоит поиск Sphinx, значит и есть доступ к серверу, и можно соорудить что-то посерьёзней. К тому же, чего там делать в настройке поиска ? Один раз настроил - и пусть себе работает. Если даже надо зайти, можно на пару минут и отключить барьер совсем (удалить скрипт из config.php).
config.php вызывается повторно, а мы на это не рассчитывали. Сейчас напряжём ИИ, пусть думает. Не хочется из-за этого усложнять конструкцию.Пока временно можно сделать так, а потом что-нибудь придумаем ещё. Замените первую строку:
Код: Выделить всё
if (is_array($_SERVER) and $uri = (string)@$_SERVER['REQUEST_URI']) { # не cliНужно ли загромождать этой проверкой основной код? Думаю, что нет. Ведь этот барьер придуман для тех, у кого нет доступа к Apache/Nginx, а если стоит поиск Sphinx, значит и есть доступ к серверу, и можно соорудить что-то посерьёзней. К тому же, чего там делать в настройке поиска ? Один раз настроил - и пусть себе работает. Если даже надо зайти, можно на пару минут и отключить барьер совсем (удалить скрипт из config.php).
-
Shredder
- Former team member
- Сообщения: 2264
- Стаж: 17 лет 7 месяцев
- Благодарил (а): 165 раз
- Поблагодарили: 159 раз
Re: Атака китайских ботов
Поставили на один форум, вердикт такой:Kuskow писал(а): Вчера 5:07 Новая версия 5.1 антибота для тех, у кого нет доступа к настройкам Apache/Nginx.
Боюсь, что ИИ - плохой советчик. Недавно пробовал у него выпытать, как убрать артефактную полоску сбоку в игре Guardian Legend на Денди, предварительно погуглив и дав ему все наводящие и другие необходимые данные, из-за чего, вероятно, этот баг. Дендю программирую давно, и разбираюсь, в принципе, неплохо) Так он меня несколько часов гонял, каждый раз написывая одно и то же: "отличная находка! значит, остаётся один единственный вариант, из-за чего происходит баг", и далее "делай то-то и то-то". Что бы я ни делал по его совету - естественно, это не помогало. А главное, что каждый раз "оставался единственный (!) вариант". В результате, пользуясь поиском обычного гугла, сам допёр, что баг - неустранимое следствие метода синхронизации статус-бара игры с остальной частью экрана на выбранном маппере игры, и что единственный способ его устранить - перевести игру на другой маппер и переписать код синхронизации, используя возможности нового маппера. Был бы чайником, этот ИИ гонял бы меня по кругу до бесконечностиНа форум запускает, не работает админка и часть функционала "новые сообщения", "непрочитанные", "активные", не открывает "администрировать" и "модерировать", и нельзя ответить в теме.
-
Kuskow
- phpBB 2.0.5
- Сообщения: 462
- Стаж: 10 лет 1 месяц
- Откуда: 🇰🇿 Караганда
- Благодарил (а): 29 раз
- Поблагодарили: 46 раз
Re: Атака китайских ботов
Это очень странно, поскольку я с ним живу практически, у себя не отключаю, хоть у меня и Nginx, и кэш настроены. Я ж у себя администратор и модератор прям вот активный. Постоянно пользуюсь именно этими функциями, они у меня в закладках. А форум в подпапке или в корне сайта? Хотя это влиять не должно, но чтобы понять, в чём отличие от моего сайта. Все ли пункты сделаны? Очищен ли кэш?Shredder писал(а): Вчера 14:06 На форум запускает, не работает админка и часть функционала "новые сообщения", "непрочитанные", "активные", не открывает "администрировать" и "модерировать", и нельзя ответить в теме.
А ещё попробуйте выйти и зайти.
-
Kuskow
- phpBB 2.0.5
- Сообщения: 462
- Стаж: 10 лет 1 месяц
- Откуда: 🇰🇿 Караганда
- Благодарил (а): 29 раз
- Поблагодарили: 46 раз
Re: Атака китайских ботов
Пропала не ошибка, а вообще всё. Вы выключили этот скрипт полностью, поскольку при первом (основном) выполнении config.php этого метода $request не существует. То есть, Вы поставили заглушку, чтобы он не работал.angst66 писал(а): Вчера 12:22 Изменил ее на
if ($uri = (string)@$request->server['REQUEST_URI']) {
Ошибка пропала. Не знаю правильно или нет
-
Shredder
- Former team member
- Сообщения: 2264
- Стаж: 17 лет 7 месяцев
- Благодарил (а): 165 раз
- Поблагодарили: 159 раз
Re: Атака китайских ботов
Kuskow
Да пробовали по-разному, конечно же по порядку и по инструкции, вчера и вариант Nekstati ставили - результат примерно тот же. Хотел ещё серверный вариант попробовать, но не успели пока
Отправлено спустя 1 минуту 1 секунду:
Ещё ранее ставил вариант Nekstati на пару своих сайтов, один в корне и один в подпапке, тестировал один, проблем замечено не было. Но потом убрал из расчета, чтобы в выдаче ИИ сайты были:
Да пробовали по-разному, конечно же по порядку и по инструкции, вчера и вариант Nekstati ставили - результат примерно тот же. Хотел ещё серверный вариант попробовать, но не успели пока
Отправлено спустя 1 минуту 1 секунду:
В корне.
Ещё ранее ставил вариант Nekstati на пару своих сайтов, один в корне и один в подпапке, тестировал один, проблем замечено не было. Но потом убрал из расчета, чтобы в выдаче ИИ сайты были:
Nekstati писал(а): 02.07.2026 14:56 отсечение "вредных" ботов в ближайшем будущем приводит к тому, что наши сайты и наш контент отсутствует в памяти LLM, то есть в поисковой выдаче и ИИшных диалогах
-
Leo Angel
- phpBB 2.0.10
- Сообщения: 782
- Стаж: 8 лет 5 месяцев
- Откуда: Израиль
- Благодарил (а): 254 раза
- Поблагодарили: 95 раз
Re: Атака китайских ботов
Обнаружил проблему при использовании метода Nekstati, описанного тут: Re: Атака китайских ботов.
Если на форуме установлено расширение AI Labs, то вставка от Nekstati мешает нормальной работе этого расширения. При попытке публикации новой темы с вопросом к AI форум падает с ошибкой 504. Тема публикуется, но ответа от AI нет.
Если говорить коротко, то....
Причина — нативная PHP-сессия в защите.
Итак, если у вас на форуме используется расширение AI Labs, то нужно открыть файл
Найти
Добавить перед
В добавленном пункте 0.0 вместо xxx.xxx.xxx.xxx нужно вставить IP своего сервера.
Я бился с проблемой неработающего AI Labs целый день, перепробовал множество решений, пока не вспомнил про эту вставку.
Внёс исправления в код и всё заработало.
Опять же...
Может, что накуролесил по незнанию, не бейте сильно.
Наверняка, гуру проверят и, если что, подправят.
Если на форуме установлено расширение AI Labs, то вставка от Nekstati мешает нормальной работе этого расширения. При попытке публикации новой темы с вопросом к AI форум падает с ошибкой 504. Тема публикуется, но ответа от AI нет.
Если говорить коротко, то....
Причина — нативная PHP-сессия в защите.
- Вставка вызывала session_start() и держала PHPSESSID заблокированной до конца запроса.
- При публикации поста AI Labs дергает форум сам: делает внутренний запрос HEAD с теми же cookies, то есть с той же сессией.
- Возникал тупик: публикация не отпускала сессию, пока не завершится, а внутренний запрос не мог начаться, пока сессия занята. Оба висели до таймаута nginx → 504.
- Плюс антибот проверял cookie по IP. Внутренний вызов шёл с IP сервера, cookie под него не было — защита отбивала callback ещё и по этой причине. Бот не отрабатывал, задания оставались в статусе NULL.
Итак, если у вас на форуме используется расширение AI Labs, то нужно открыть файл
common.phpНайти
if (!defined('IN_PHPBB'))Добавить перед
Код: Выделить всё
function applyBotProtection() {
$userAgent = $_SERVER['HTTP_USER_AGENT'] ?? '';
$userIp = $_SERVER['REMOTE_ADDR'] ?? '';
// 0.0. Внутренний серверный вызов AI Labs (callback /ailabs/*).
// Форум обращается сам к себе, чтобы бот обработал задание. Такой запрос
// приходит с IP самого сервера и НЕ должен проходить антибот-проверку —
// иначе блокировка PHP-сессии приводит к взаимной блокировке и ошибке 504.
$reqPath = parse_url($_SERVER['REQUEST_URI'] ?? '/', PHP_URL_PATH);
$trustedInternalIps = ['127.0.0.1', '::1', 'xxx.xxx.xxx.xxx'];
if (
is_string($reqPath)
&& preg_match('#^/(?:app\.php/)?ailabs(?:/|$)#', $reqPath)
&& in_array($userIp, $trustedInternalIps, true)
) {
return;
}
// 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;
}
*/
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 charset="utf-8">'
. '<meta name="viewport" content="width=device-width, initial-scale=1">'
. '<meta http-equiv="refresh" content="0;url=' . htmlspecialchars($redirect_url) . '">'
. '<style>'
. 'html,body{height:100%;margin:0;}'
. 'body{display:flex;align-items:center;justify-content:center;padding:16px;box-sizing:border-box;'
. 'font-family:sans-serif;font-size:16px;line-height:1.5;text-align:center;color:#333;}'
. 'p{margin:0;max-width:100%;word-wrap:break-word;}'
. '</style></head>';
echo '<body><p>Проверка браузера... Пожалуйста, подождите.</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;
// Освобождаем блокировку PHP-сессии сразу после проверки.
// Без этого нативная session_start() держит PHPSESSID заблокированной
// на всё время запроса, из-за чего вложенные запросы (напр. callback
// AI Labs) зависают в ожидании сессии → 504 при публикации.
session_write_close();
}
applyBotProtection();В добавленном пункте 0.0 вместо xxx.xxx.xxx.xxx нужно вставить IP своего сервера.
Я бился с проблемой неработающего AI Labs целый день, перепробовал множество решений, пока не вспомнил про эту вставку.
Внёс исправления в код и всё заработало.
Опять же...
Может, что накуролесил по незнанию, не бейте сильно.
Наверняка, гуру проверят и, если что, подправят.


