Системы управления контентом (CMS) - WordPress, Joomla, Drupal, 1C-Битрикс, OpenCart, ModX - стали основой современного веба. По разным оценкам, от 40% до 60% всех сайтов работают на той или иной CMS. Однако вместе с удобством быстрого запуска сайта владельцы получают и серьёзные риски. Статистика неумолима: более 80% успешных взломов веб-сайтов связаны с уязвимостями в ядре CMS, её плагинах или темах. Причём львиная доля атак - автоматизированные сканеры, которые даже не требуют участия человека. Цель этой статьи - не просто перечислить "очевидные советы" (меняй пароли, обновляйся), а показать системные архитектурные причины, почему CMS уязвимы по своей природе, и предложить многоуровневую стратегию защиты, которая работает на практике.
Чтобы защищать сайт, нужно понять, откуда берутся дыры в защите. Корень проблем лежит не в "неаккуратности" администратора, а в самой модели, по которой устроены современные CMS.
Архитектурные особенности CMS
Модульность и расширяемость - главное преимущество CMS, которое одновременно является их главным недостатком, уязвимостью. Любой плагин или тема, написанные даже известным разработчиком, содержат сотни или тысячи строк кода. В экосистеме WordPress, например, зарегистрировано более 60 тысяч бесплатных плагинов в официальном репозитории - и это не считая премиум-решений и самодельных решений. Каждый из них потенциально может иметь SQL-инъекцию, XSS или уязвимость загрузки файлов.
При этом злоумышленник изучает один популярный плагин с ошибкой - и получает возможность атаковать все сайты, где этот плагин установлен.
Общая кодовая база - у каждого сайта на CMS одинаковые имена файлов, одинаковые маршруты и одинаковые точки входа. Например, для WordPress это wp-login.php, xmlrpc.php, wp-admin/admin-ajax.php. Для Joomla - /administrator. Это идеальная мишень для автоматических ботов: они не гадают, где находится админка - они точно знают.
Динамическая генерация страниц означает, что CMS постоянно взаимодействует с базой данных, передавая в SQL-запросы параметры из URL, форм и даже из cookie. Если разработчик не использовал подготовленные выражения или не экранировал данные, злоумышленник может "вставить" свой SQL-код и выполнить его на сервере. Кроме того, XSS-атаки (внедрение JavaScript) становятся возможными там, где CMS выводит пользовательский контент без санитизации - например, в комментариях, которые видят все.
Наследственный код и legacy-функции - многие CMS живут годами, обрастая обратной совместимостью. В WordPress до сих пор поддерживаются функции, которые были объявлены устаревшими несколько лет назад (например, magic_quotes или старые способы обработки загрузки файлов). Наличие такого кода увеличивает возможность атаки.
Человеческий фактор и практики эксплуатации
Даже если CMS идеальна, владелец сайта часто становится слабым звеном.
Несвоевременное обновление - многие ждут, когда "что-то сломается", и месяцами не ставят патчи. А злоумышленники начинают эксплуатировать уязвимость уже через несколько часов после её публикации.
Использование заброшенных плагинов - разработчик мог прекратить поддержку, но сайт всё ещё содержит этот плагин. Со временем в нём находят уязвимость, а обновления безопасности больше не выходят.
Слабые пароли - пароль "admin123" или "qwerty" для учётной записи администратора - до сих пор одна из главных причин взлома.
Отсутствие бэкапов - после взлома сайт невозможно откатить к чистому состоянию, и владельцу приходится платить выкуп или пересобирать всё с нуля.
Специфика хостинга и окружения
Shared-хостинг - это когда сотни сайтов живут на одном сервере, плохая конфигурация или взлом одного соседа может привести к компрометации всех остальных через уязвимости в виртуализации или неправильные права на файлы.
Небезопасные настройки PHP - функции вроде exec(), shell_exec(), system() позволяют злоумышленнику, получившему возможность выполнить код, фактически получить полный контроль над сервером. Многие хостинги оставляют их включёнными по умолчанию.
Устаревшее ПО - старые версии PHP (например, 5.x или 7.0) имеют известные уязвимости, которые не патчатся, но CMS на них всё ещё работает. Злоумышленнику достаточно просто отправить специально сформированный запрос.
Атаки нулевого дня и автоматизированные сканеры
Атаки нулевого дня - уязвимость, о которой разработчики ещё не знают. Хакеры могут продавать её на чёрных рынках или использовать в целевых атаках. Когда такой эксплойт попадает в открытый доступ - начинается лавинообразное сканирование миллионов сайтов.
Автоматизированные сканеры - инструменты вроде WPScan, Joomscan или более продвинутые фреймворки (Nuclei, Metasploit) ежесекундно обходят интернет в поисках сайтов с известными уязвимостями. Сканирование одного сайта занимает секунды, а масштабная бот-сеть может проверить весь IPv4-диапазон за несколько часов.
Знание врага в лицо позволяет правильно выбирать средства защиты.
Вход через уязвимости плагинов и тем
SQL-инъекции - самый популярный вектор. Уязвимый плагин не экранирует параметр из $_GET или $_POST. Злоумышленник добавляет в URL конструкцию вроде ' OR 1=1 -- и получает доступ к базе данных: может вытащить хеши паролей, подменить содержимое, добавить пользователя-администратора.
RCE (Remote Code Execution) - ещё опаснее. Например, уязвимость в загрузчике файлов позволяет загрузить на сервер не картинку, а PHP-скрипт, после чего злоумышленник выполняет произвольные команды на сервере.
LFI / RFI (локальное/удалённое включение файлов) - если плагин подставляет имя файла в include($param) без проверки, хакер может подставить ../../../../wp-config.php и прочитать пароли от базы данных.
Брутфорс и сниффинг
Брутфорс административной панели - боты перебирают логины и пароли, особенно популярные комбинации. Наличие wp-login.php или /administrator/index.php делает атаку очень эффективной. При этом боты используют распределённые IP-адреса, чтобы не срабатывали простые лимиты.
Перехват сессий - если сайт не использует HTTPS, сессионная cookie передаётся в открытом виде, что открывает широкие возможности по ее перехвату и использованию злоумышленниками.
Подбор паролей к FTP / cPanel - часто доступ к файловой системе сайта защищён не лучше, чем админка, что дает возможность получить полный доступ к необходимым данным путем перебора известных паролей, либо на основе различных баз скомпрометированных данных.
Атаки на базу данных и файловую систему
Инъекции через неэкранированные параметры - особенно опасны в поисковых формах, кастомных полях. Одна SQL-инъекция может уничтожить таблицы или изменить содержимое всего сайта.
Доступ к файлам конфигурации - wp-config.php (WordPress), configuration.php (Joomla) содержат пароль от базы данных, соли и ключи шифрования. Если веб-сервер неправильно настроен, эти файлы могут быть прочитаны удалённо через path traversal или даже просто по прямому URL (в редких случаях).
Атаки через посредников (XSS, CSRF, Clickjacking)
XSS (межсайтовый скриптинг) - злоумышленник внедряет JavaScript в комментарий или в профиль. Когда администратор заходит на страницу, скрипт крадёт его cookie или делает запрос на добавление нового пользователя от его имени.
CSRF (подделка межсайтовых запросов) - если в CMS нет защиты (nonce или кастомного заголовка), хакер может разместить на другом сайте форму, которая отправляет запрос на wp-admin/post.php?action=delete и администратор, будучи залогиненным, может случайно выполнить это действие.
Почему традиционных методов (антивирусы, пароли) - недостаточно
Многие владельцы сайтов уверены, что достаточно поставить "антивирус для сайта" или сложный пароль. Однако это заблуждение.
Симптоматическое лечение не устраняет корень проблемы. Антивирусный плагин проверяет файлы после того, как взлом уже произошёл, и не может предотвратить атаку нулевого дня. Он реагирует уже после того, как злоумышленник получил доступ.
Баланс между удобством и безопасностью. Сайт часто ведут несколько человек, у всех разные уровни технической подготовки. Сложные пароли забываются, 2FA воспринимается как помеха, а обновление плагинов откладывается, потому что "клиент боится, что что-то сломается". В итоге владелец сам блокирует внедрение надёжных методов.
Автоматизированные атаки не знают жалости. Даже если у вас пароль «djf43%!Df9_», брутфорс-бот не остановится, если у вас нет лимита попыток входа или защиты от подбора по словарю. А современные атаки используют миллионы комбинаций и распределённые сети.
Человеческий фактор остаётся главной проблемой. Администратор может установить надёжную защиту на сервере, но если один из авторов сайта скачает "бесплатную тему" с модного форума, в которой зашита дверь для хакера, - вся защита рухнет.
Комплексная многоуровневая защита сайта на CMS
Ниже приведены конкретные меры, расположенные по уровням - от архитектуры до мониторинга.
Уровень архитектуры и развёртывания
Разделение сред: держите три независимых окружения - разработка (dev), тестирование (staging), боевое (production). Никогда не тестируйте обновления или новые плагины на живом сайте. Это позволяет отловить конфликты и уязвимости до того, как они навредят реальным пользователям.
Контроль версий и репозиторий: храните код сайта в Git (приватный репозиторий, например, на GitLab или Bitbucket). В репозиторий не должны попадать файлы с паролями (wp-config.php используют переменные окружения). Это даёт возможность откатиться к любой предыдущей версии и отследить, кто и когда менял файлы.
Использование Docker или изолированного VPS: откажитесь от shared-хостинга в пользу VPS или контейнеров. Так вы исключаете влияние соседей по серверу. Docker позволяет запускать каждый сайт в своей изолированной среде с собственными версиями PHP и модулями.
Настройка прав на файлы и папки: минимально необходимые права - 755 для папок, 644 для файлов. Никогда не ставьте 777. Для особо критичных файлов (wp-config.php) можно выставить 400 или 440 с владельцем, отличным от пользователя веб-сервера.
Запрет выполнения PHP в каталогах загрузок: создайте файл .htaccess (Apache) или правило в nginx, которое отключает выполнение скриптов в папках uploads, cache, tmp. Если злоумышленник загрузит туда shell-скрипт, - он просто не выполнится.
Уровень ядра CMS и расширений
Жёсткая политика обновлений: каждую неделю проверяйте наличие обновлений ядра, плагинов, тем. Настройте автоматические уведомления. В WordPress это можно делать через плагин Easy Updates Manager или через wp-cli. Для критических (security) обновлений разумно включить автоматические патчи - риск поломки ниже, чем риск взлома.
Минимизация количества активных плагинов: каждый плагин - дополнительный код, который может содержать уязвимость. Удаляйте неиспользуемые, даже если они деактивированы. Файлы таких плагинов всё ещё лежат на сервере и могут быть вызваны напрямую.
Мониторинг уязвимостей: подпишитесь на базы уязвимостей (WPScan Vulnerability Database, Patchstack). Интегрируйте их с системой оповещений. При появлении новой уязвимости для установленного у вас плагина вы должны узнать об этом в тот же день.
Использование только проверенных репозиториев: никогда не скачивайте "премиум-темы" с торрентов или бесплатных сайтов. В них почти гарантированно есть закладки (бэкдоры).
Двухфакторная аутентификация (2FA) обязательна для всех пользователей с правами редактора и выше. Используйте Google Authenticator, TOTP через плагин (например, WP 2FA) или аппаратные ключи (WebAuthn). Даже если пароль украдут, без одноразового кода войти не получится.
Защита административной папки:
- Измените стандартный URL входа. Для WordPress используйте плагин WPS Hide Login или настройте перезапись через .htaccess: перенаправление с /wp-admin на /secret-folder. Для Joomla — параметр в конфигурации
- Ограничьте доступ по IP-адресам (если у вас статический IP). В .htaccess добавьте Require ip 123.123.123.123 (для Apache 2.4) или используйте блокировки на уровне Nginx. Если у вас динамический IP, используйте диапазоны IP своего провайдера.
- Блокируйте запросы к административной папке с пустым Referer или нестандартным User-Agent - это отсекает большинство ботов.
Отключение XML-RPC, REST API (если не используется): XML-RPC в WordPress используется для удалённых публикаций и мобильных приложений, но также служит для DDoS-амплификации и брутфорса. Полностью отключите его через плагин или правило веб-сервера. REST API оставьте только для нужных эндпоинтов или защитите с помощью nonce.
Лимит попыток входа: установите плагин (Limit Login Attempts Reloaded, Loginizer), который блокирует IP после 3-5 неудачных попыток. Настройте время блокировки (например, 15 минут) и белый список своих IP.
Уровень веб-сервера и окружения
Настройка HTTPS (HSTS): получите бесплатный сертификат от Let's Encrypt и принудительно перенаправляйте весь трафик на HTTPS. Добавьте заголовок Strict-Transport-Security с длительным сроком действия (например, 6 месяцев). Это исключит перехват сессий в открытых сетях.
Защита от DDoS и брутфорса через модули веб-сервера:
- Apache: mod_evasive отслеживает частоту запросов с одного IP и временно блокирует при превышении лимита.
- Nginx: limit_req позволяет задать зону, где обрабатывается не более, скажем, 10 запросов в секунду на каждый IP.
Блокировка выполнения скриптов в папках uploads и cache:
- Apache: .htaccess внутри wp-content/uploads с содержимым php_flag engine off.
- Nginx: в location для этих папок запретить обработку PHP, возвращая 403.
Отключение опасных функций PHP: в php.ini установите disable_functions = exec, shell_exec, system, passthru, popen, proc_open, а также allow_url_fopen = Off. Это не позволит злоумышленнику выполнять команды ОС даже если он получит возможность запустить PHP-код.
Уровень CDN и WAF (Cloudflare, Sucuri, Qrator)
Фильтрация входящих запросов по сигнатурам: WAF (Web Application Firewall) анализирует каждый запрос к сайту и сопоставляет с базой известных атак (SQLi, XSS, LFI, RCE). Cloudflare имеет бесплатный набор правил, Sucuri и Qrator предлагают более продвинутые кастомные правила.
Rate limiting для форм, админки, API: создайте в CDN правило, которое разрешает не более 5 POST-запросов в минуту к wp-comments-post.php или к /wp-admin/admin-ajax.php. Остальные блокируются с предложением пройти капчу.
Защита от ботов и спама: используйте Cloudflare Turnstile (бесплатная альтернатива reCAPTCHA, без сбора личных данных) или Google reCAPTCHA v3. Они работают в фоне, показывая вызов только при подозрительном поведении.
Размещение сайта "за прокси": когда DNS сайта указывает на Cloudflare, реальный IP сервера скрыт. Злоумышленник не может атаковать сервер напрямую, минуя защиту CDN. Важно: не указывайте настоящий IP в поддоменах (например, server.mydomain.com).
Уровень мониторинга и реагирования
Логирование запросов и уведомление о подозрительных: настройте сбор логов доступа, ошибок, неудачных логинов, изменений файлов. Отправляйте их в централизованную систему (хотя бы Telegram-бот через скрипт). Это позволит обнаружить атаку на ранней стадии - например, сотни 403 ошибок за минуту.
Ежедневное сканирование файлов на предмет изменений: используйте плагин-сканер (наподобие Wordfence, Sucuri Security). Сверяйте текущие хэши с эталонными. Любое изменение файлов ядра, которого вы не делали, должно быть тревожным сигналом.
Резервное копирование с автоматическим восстановлением: делайте бэкапы всей файловой системы и базы данных ежедневно. Храните их на удалённом сервере (не на том же хостинге). Настройте скрипт, который автоматически разворачивает последнюю рабочую версию при обнаружении подозрительных изменений.
Оповещения в реальном времени: настройте уведомления в Telegram при критических событиях: более 10 неудачных логинов за 5 минут, появление нового файла с расширением .php в папке uploads, изменение файла .htaccess.
Роль антибот-систем и защита от автоматизированных атак
Используйте специализированные антибот системы с проксированием запросов.
Почему боты - главная проблема CMS
Современные CMS атакуются ботами в 95% случаев. Брутфорс админки, SQL-инъекции через поисковые формы, спам в комментариях, DDoS на CMS-эндпоинты - всё это автоматизировано. Боты распределены по тысячам IP (ботнет), умеют подменять User-Agent, задерживаться между запросами и даже эмулировать движения мыши (headless браузеры). Поэтому традиционная защита только по IP или по заголовкам перестаёт работать.
Как антибот-системы (KillBot, CleanTalk Bot Protection, OOPSpam) дополняют WAF
WAF отлавливает известные сигнатуры атак, а антибот-системы анализируют поведение:
Поведенческий анализ: система смотрит на время между нажатием клавиш, траекторию движения мыши, скроллинг. Бот либо делает всё мгновенно, либо с идеально равными паузами.
Fingerprint браузера: собираются десятки параметров - версия WebGL, список шрифтов, разрешение экрана, установленные плагины. У ботов эти параметры либо отсутствуют, либо выдают эмуляцию.
Проверка на headless: такие браузеры, как Puppeteer, Playwright, оставляют следы (navigator.webdriver = true). Антибот-система это обнаруживает.
Реферальная проверка, honeypot, токены: скрытые поля в формах, которые не видит человек, но заполняет бот. Если поле заполнено - запрос отбрасывается.
Капча "на лету" только для подозрительного трафика: легитимный пользователь даже не видит проверки, а боту предлагается решить задачу, которую он не может пройти автоматически.
Антибот-системы интегрируются на уровне DNS или через JS-скрипт. Они фильтруют запросы ещё до того, как они достигнут вашего сервера, либо на раннем этапе обработки в CMS.
Практические чек-листы для разных ролей
Практические советы по фильтрации ботов, в зависимости от вашего уровня технических знаний.
Для владельца сайта (не программиста)
Выбирайте хостинг с изоляцией - VPS или shared хостинг, где аккаунты клиентов в рамках одного сервера изолированы руг от друга. Избегайте дешёвых shared-хостингов.
Включите автоматические обновления ядра и критических плагинов в панели CMS.
Раз в неделю заходите в админку и проверяйте, нет ли уведомлений об устаревших расширениях, плагинах.
Перед установкой любого нового плагина читайте отзывы и смотрите дату последнего обновления (не старше 3 месяцев).
Обязательно настройте 2FA через приложение-аутентификатор.
Сделайте резервную копию всего сайта перед любым серьёзным изменением (настройка тем, обновление плагинов).
Храните пароли от админки, FTP и хостинга в менеджере паролей и не используйте один пароль везде.
Для разработчика
При написании собственных плагинов или тем всегда используйте подготовленные запросы (WP_Query с параметрами, $wpdb->prepare) и экранируйте вывод (esc_html, esc_attr, wp_kses).
Не доверяйте пользовательским данным (GET,GET,_POST, COOKIE,COOKIE,_SERVER без фильтрации). Валидируйте и санитизируйте всё.
Используйте Nonce-поля для каждой формы, которая изменяет данные, - это защита от CSRF (межсайтовая подделка запросов).
Соблюдайте стандарты кодирования CMS (WordPress Coding Standards, PSR для Symfony и т.д.) и проводите статический анализ с помощью Psalm, PHPStan.
Интегрируйте в CI/CD автоматическое сканирование зависимостей на уязвимости (например, через composer audit или плагины для GitHub).
Не храните секреты (API-ключи, пароли БД) в файлах - используйте переменные окружения (getenv() в PHP).
Для администратора сервера
Настройте Fail2Ban с джейлами для CMS: мониторьте логи wp-login.php, xmlrpc.php, административных панелей. При 5 неудачных попытках с одного IP - бан на сутки.
Регулярно обновляйте стек: PHP до последней стабильной версии (с поддержкой, а не EOL), MySQL/MariaDB, Nginx/Apache.
Настройте отдельного пользователя для каждого сайта (в режиме chroot или через PHP-FPM пулы). Это изолирует сайты друг от друга.
Подключите мониторинг ресурсов и оповещения при аномальном росте CPU или сетевого трафика.
Настройте бэкап на уровне системы - снапшоты VPS каждые 6 часов, хранение 30 дней.
Экстренные меры при взломе
Если вы обнаружили, что сайт взломан (странный контент, перенаправления, всплывающие окна, сообщения хостинга о вредоносном коде):
Определите факт и источник: посмотрите даты последних изменений файлов через find . -mtime -1 -type f. Ищите неизвестные PHP-файлы (особенно в uploads, tmp, cache). Проверьте cron-задачи (в панели хостинга или через crontab -l).
Смените все пароли: администратор CMS, база данных, FTP/SFTP, хостинг-панель, API-ключи.
Восстановите из последнего заведомо чистого бэкапа. Если бэкапа нет - скачайте текущие файлы и базу, но будьте готовы к тому, что бэкдоры останутся.
Запустите сканер вредоносного кода: для WordPress подойдут Wordfence, для общего сервера - maldet (Linux Malware Detect) или ClamAV.
Проверьте скрытые пользователи в CMS (особенно с правами администратора, которых вы не создавали).
После зачистки установите все обновления и замените секреты (соли, ключи шифрования). В WordPress для этого достаточно сгенерировать новые соли в wp-config.php.
Настройте усиленную защиту по чек-листу из предыдущего раздела, чтобы взлом не повторился.
Заключение
Безопасность сайта на CMS - это не разовая акция ("поставил плагин и забыл"), а непрерывный процесс. Ни одна мера не даёт 100% гарантии, но их комбинация уменьшает риски на порядки. Ключевые выводы, которые предотвратят 90% взломов:
Обновляйте всё и сразу, как только выходит патч.
Включите 2FA и смените стандартный URL админки.
Используйте антибот-систему.
Делайте автоматические бэкапы и храните их отдельно от текущего хостинга (физически на другом хостинге, у многих хостеров есть отдельная услуга бэкап-хостинга).
Запретите выполнение PHP в папках загрузок.
Проинспектируйте свой сайт по чек-листу из этой статьи прямо сейчас - возможно, это спасёт его от завтрашней атаки.
Cloudflare окончательно заблокирован в РФ ещё летом 2025 года. Функцию фильтрации ботов Cloudflare взял на себя российский антибот Killbot. Принцип работы отличается от привычного, отслеживаются не знакомые всем при настройке других антибот решений параметры (входящие IP адреса, AS подсети ботов, User Agent и прочее, всё это легко подделывается), а уникальные для каждого набора браузеров слепки. По отличию оригинального браузера от модифицированного, тот или иной заход определяется либо как заход реального посетителя, либо как заход бота.
Чтобы не повторяться - расписывал более подробно в статьях:
Попробовать бесплатно. При регистрации в Killbot введите промокод promo13 и получите месяц тестирования платного тарифа Killbot (фильтрация трафика, 1000 руб) и Ads (отключение показа рекламы поведенческим ботам, 1000 руб) в качестве бонуса. Этого вам хватит на то, чтобы понять, подходит вам данное решение, или нет. На данный момент - в Рунете нет более достойной альтернативы, по соотношению цена-качество. Срок действия промокода ограничен по времени, куда-то записывать его нет смысла. В следующий раз промокод уже будет другой, поэтому использовать его нужно сейчас, когда вы читаете этот текст. Промокод действует только в форме регистрации. Если аккаунт уже создан - создайте новый, на другой почте, и при регистрации в последнем поле введите промокод.
Подпишитесь на Telegram канал / MAX для того, чтобы всегда быть в курсе последних новостей и обновленных настроек для защиты от ботов, а также оперативно получать новые материалы, выходящие на antibot24.ru
Автор статей: Сергей (AntiBot24). Эксперт в области фильтрации поведенческого трафика, настройки антибот систем. Высший рейтинг на Kwork, более 680 отзывов, 100% заказов успешно сдано, 56% повторных заказов. Пишу подробные статьи, инструкции по фильтрации ботов в своем блоге antibot24.ru
Всегда нужно иметь в виду, что те советы, которые вы прочли в статьях - это лишь часть настроек, которые я делаю при профессиональной экспертной настройке фильтрации поведенческих ботов. Все остальное - это непубличные профессиональные секреты. Любая информация, становящаяся общедоступной - достаточно быстро устаревает и перестает быть эффективной. Если вы столкнулись с повышенной роботностью в Яндекс метрике, увеличением числа прямых заходов, увеличением количества отказов - вы всегда можете заказать у меня настройку Killbot.