
Привет, веб-воин! 🛡️ Твой сайт — это твоя крепость, а плохие боты — это орды варваров у ворот, жаждущих украсть твой контент, сожрать трафик и оставить после себя только ошибки 500. Но не переживай! Сегодня мы разберём два способа защиты от плохих ботов: для скромных обитателей шаред-хостингов и для повелителей своих серверов.
Способ 1. PHP + Плагины: Защита для бедных (но гордых) 🧙♂️
Для кого: Если твой хостинг даёт тебе доступ только к functions.php, а о конфигах Nginx ты только мечтаешь.
Шаг 1. Код в functions.php — наш «кирпичный забор»
Вставь этот код в тему (желательно в дочернюю, чтобы не потерять при обновлении):
1 2 3 4 5 6 7 8 9 10 11 12 13 |
function log_and_block_bad_bots() { $log_file = ABSPATH . '/bot-log.txt'; $ua = $_SERVER['HTTP_USER_AGENT'] ?? ''; // Если бот — Python, curl или ещё какая-то нечисть if (empty($ua) || preg_match('/(python|scrapy|curl|wget|aiohttp|httpx|libwww-perl|go-http-client)/i', $ua)) { $log = date('Y-m-d H:i:s') . " - " . $_SERVER['REMOTE_ADDR'] . " - $ua\n"; @file_put_contents($log_file, $log, FILE_APPEND); header('HTTP/1.1 403 Forbidden'); exit('Пошёл вон, бот! 🚫'); } } add_action('init', 'log_and_block_bad_bots'); |
Что делает:
- Ловит ботов по User-Agent.
- Пишет их в лог (чтобы ты знал, кто пытался вломиться).
- Выдаёт 403 — как подзатыльник непрошеному гостю.
Шаг 2. Плагин-помощник: Blackhole for Bad Bots
Установи этот плагин — он добавит «чёрную дыру» для ботов. Любой запрос с подозрительным User-Agent будет падать в никуда.
👉 Минус: Плагины — это как костыли. Работает, но не идеально.
Способ 2. Nginx: Банхаммер для админов 🏴☠️
Для кого: Если у тебя есть доступ к серверу и ты не боишься конфигов.
Шаг 1. Редактируем конфиг Nginx
Открываем терминал и вводим:
1 |
sudo nano /etc/nginx/sites-available/your-site.conf |
Добавляем блокировку для плохих ботов в начало блока server {…}:
1 2 3 4 5 6 7 8 9 10 11 12 |
# Блокировка ботов (с исключениями для поисковиков и соцсетей) set $is_bad_bot 0; if ($http_user_agent ~* (python|wget|curl|scrapy|httrack|python-requests|bot|spider|crawler|archive|semrush|aiohttp|mj12bot|ahrefsbot|dotbot|petalbot|uptimerobot|sitechecker|blexbot|barkrowler|megaindex|seopowersuite)) { set $is_bad_bot 1; } # Исключения для "хороших" ботов if ($http_user_agent ~* (Googlebot|Yandex|Bingbot|adidxbot|BingPreview|facebookexternalhit|Twitterbot|WhatsApp|TelegramBot|Discordbot)) { set $is_bad_bot 0; } if ($is_bad_bot = 1) { return 403; } |
А также такие строки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# Security headers add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Content-Type-Options "nosniff" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always; add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; # Защита админки от перебора location ~* /(wp-login.php|xmlrpc.php) { limit_req zone=bruteforce burst=10 nodelay; include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.1-fpm.sock; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; include fastcgi_params; fastcgi_param HTTP_PROXY ""; fastcgi_intercept_errors on; } |
И вот это:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
location = /robots.txt { allow all; set $is_bad_bot 0; log_not_found off; access_log off; try_files $uri $uri/ /index.php?$args; } # Основные правила location / { limit_req zone=antiscrape burst=20 nodelay; limit_conn conn_limit 10; try_files $uri $uri/ /index.php?$args; add_header X-Debug "Main location block"; } # Запрет доступа к敏感 файлам WordPress location ~* /(wp-config\.php|readme\.html|license\.txt|wp-includes|wp-admin/install\.php) { deny all; } |
Теперь откроем основной конфиг сервера:
1 |
sudo nano /etc/nginx/nginx.conf |
Добавим такие строки:
1 2 3 4 5 6 7 |
# Защита от брутфорса # Зона для брутфорса limit_req_zone $binary_remote_addr zone=bruteforce:10m rate=5r/m; # Зона для общей защиты limit_req_zone $binary_remote_addr zone=antiscrape:10m rate=30r/m; limit_conn_zone $binary_remote_addr zone=conn_limit:10m; limit_req_status 429; |
Проверяем и перезагружаем:
1 |
sudo nginx -t && sudo systemctl reload nginx |
Иногда Nginx ругается на if. Тогда добавляем в конфиг сайта «антибот-фильтр»:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
map $http_user_agent $is_bad_bot { default 0; "~*(wget|curl|python|scrapy|bot|crawler|spider)" 1; "~*(Googlebot|Bingbot|YandexBot)" 0; # Исключаем хороших ботов } server { listen 443 ssl; server_name your-site.com; if ($is_bad_bot) { return 403; # Боты получат "дырку от бублика" } } |
Проверяем и перезагружаем:
1 |
sudo nginx -t && sudo systemctl reload nginx |
🔥 Что даёт:
- Блокировка на уровне сервера — боты даже не доходят до PHP.
- Скорость: Nginx отрабатывает быстрее, чем WordPress.
- Гибкость: Можно добавить свои правила (например, для соцсетей).
Можно добавить простое логирование в functions.php (чтобы мониторить атаки):
1 2 3 4 5 6 7 8 9 10 11 |
function log_bad_bots() { $log_file = ABSPATH . '/bot-log.txt'; $ua = $_SERVER['HTTP_USER_AGENT'] ?? ''; $ip = $_SERVER['REMOTE_ADDR'] ?? ''; if (empty($ua) || preg_match('/(python|scrapy|curl|wget|aiohttp)/i', $ua)) { $log = date('Y-m-d H:i:s') . " - $ip - $ua - " . $_SERVER['REQUEST_URI'] . "\n"; @file_put_contents($log_file, $log, FILE_APPEND); } } add_action('init', 'log_bad_bots'); |
Как проверить, что защита работает? 🕵️♂️
1. Тест через curl:
1 |
curl -A "EvilBot" https://your-site.com |
→ Должен вернуть **403**.
2. Проверка логов:
— Для PHP: смотри bot-log.txt в корне сайта.
— Для Nginx:
1 |
sudo tail -f /var/log/nginx/access.log | grep 403 |
При вводе команды, вывод в терминале будет выглядеть примерно так (если защита от ботов работает):
1 2 |
123.45.67.89 - - [23/Jun/2025:14:30:15 +0300] "GET /image.jpg HTTP/1.1" 403 162 "-" "EvilBot/1.0" 87.65.43.21 - - [23/Jun/2025:14:31:22 +0300] "GET /wp-admin/admin-ajax.php HTTP/1.1" 403 162 "-" "python-requests/2.28.1" |
Как читать эти строки?
- 123.45.67.89 — IP злоумышленника/бота.
- [23/Jun/2025:14:30:15 +0300] — дата и время запроса.
- GET /image.jpg HTTP/1.1 — что запрашивали.
- 403 — код ошибки (доступ запрещён).
- «EvilBot/1.0» — User-Agent, который мы заблокировали.
Что должно насторожить?
- Много запросов с одного IP — возможно, DDoS или сканирование уязвимостей.
- Знакомые User-Agent (например, Googlebot), но с кодом 403 — значит, случайно заблокировали хорошего бота.
Как проверить работу защиты?
Сымитируй бота:
1 |
curl -A "python-requests" https://ваш-сайт.ru |
В логах сразу появится новая строка с 403. Для остановки просмотра логов нажми Ctrl+C.
(P.S. Если вывод пустой — либо боты не атакуют, либо защита не настроена. Проверь конфиг Nginx!) 😼
3. Шеринг в соцсетях:
Проверь, открываются ли превью в Facebook/VK. Если да — значит, хорошие боты не заблокированы.
Как ещё проверить работу защиты? В терминале введите:
1 2 3 4 5 6 7 8 |
# Тест с поддельными IP for i in {1..100}; do curl -s -o /dev/null -w "%{http_code}\n" -A "Mozilla/5.0" -H "X-Forwarded-For: 1.2.3.$i" https://hoboweb.ru/ done | sort | uniq -c # Ожидаемый результат: # 26 200 # Первые 60 запросов (rate=5r/s * 12 сек теста) # 74 429 # Остальные заблокированы |
Дополнительные улучшения:
Настройте кеширование (уменьшит нагрузку на PHP):
1 2 3 4 |
location ~ \.php$ { fastcgi_cache zone_name; fastcgi_cache_valid 200 10m; } |
Логирование limit_req:
1 2 |
log_format limiter '$remote_addr - $limit_req_status - $http_user_agent'; access_log /var/log/nginx/limiter.log limiter; |
Оптимизируйте PHP-FPM:
1 2 3 4 5 6 |
; /etc/php/8.1/fpm/pool.d/www.conf pm = dynamic pm.max_children = 30 pm.start_servers = 5 pm.min_spare_servers = 3 pm.max_spare_servers = 10 |
После всех изменений ваш сервер будет:
✅ Корректно ограничивать запросы.
✅ Возвращать 429 вместо 503 при перегрузке.
✅ Логировать все блокировки.
Как не забить диск логами? 📦
1. Для PHP:
Настрой logrotate (если есть доступ):
1 |
sudo nano /etc/logrotate.d/php-bot-log |
Добавь:
1 2 3 4 5 6 |
/path/to/bot-log.txt { daily rotate 7 compress missingok } |
2. Для Nginx:
Логи и так ротируются, но можно настроить их очистку:
1 |
sudo nano /etc/logrotate.d/nginx |
Убедись, что есть строки:
1 2 3 |
rotate 30 daily compress |
Вывод: Какой способ лучше?
- Шаред-хостинг? PHP + плагин (но это «костыль»).
- Свой сервер? Nginx — это «бронедверь» против ботов.
💡 Совет: Если можешь — используй оба метода (Nginx + логирование в PHP). Так ты получишь максимум защиты и сможешь анализировать атаки.
P.S. Если после этих настроек боты всё ещё лезут — значит, они прочитали эту статью и нашли лазейку. 😈 Будь готов к апгрейду!

Спасибо за материал, было полезно узнать про защиту от плохих ботов. Попробую внедрить на своем сайте.
Конечно, попробуйте. Лишним точно не будет!