Выберите продукт

WordPress security: отключаем XML-RPC и добавляем WAF-правила без боли

XML-RPC в WordPress часто используют для брутфорса и усиления DDoS через pingback. Покажу, как проверить реальную нагрузку, выбрать стратегию (выключить, ограничить методы или IP) и внедрить защиту на Nginx/Apache и через WAF без поломки нужных интеграций.
WordPress security: отключаем XML-RPC и добавляем WAF-правила без боли

Почему XML-RPC — частая причина инцидентов в WordPress

XML-RPC — это интерфейс удалённых вызовов WordPress. Он нужен для части сценариев: мобильные приложения WordPress, Jetpack, старые интеграции публикации и методы вроде pingback.ping.

На практике XML-RPC часто не используется, но остаётся включённым по умолчанию. И именно /xmlrpc.php регулярно всплывает в логах как источник:

  • брутфорса (включая system.multicall, когда десятки попыток авторизации упаковывают в один запрос);
  • паразитного трафика и «разогрева» CPU на PHP-FPM;
  • pingback-атак, когда ваш сайт используют как отражатель для DDoS или пытаются «простучать» внутренние ресурсы.

С точки зрения админа это классический быстрый выигрыш: убираете ненужную поверхность атаки — и сразу видите эффект по нагрузке и стабильности.

Как понять, используется ли XML-RPC именно у вас

Перед тем как делать xmlrpc disable, стоит за 10 минут проверить зависимости и реальный профиль трафика.

1) Проверьте логи веб-сервера

Ищите обращения к /xmlrpc.php в access log (подставьте свой путь):

grep "xmlrpc.php" /var/log/nginx/access.log | tail -n 50

Если видите постоянный поток запросов с повторяющимися IP/UA и высокой частотой, почти всегда это брут или pingback-активность.

2) Быстрый тест доступности endpoint

Проверьте, что endpoint вообще доступен снаружи:

curl -I https://example.com/xmlrpc.php

Часто вернётся 200 или 405. Важен сам факт: endpoint доступен — значит, по нему будут «стучать».

3) Уточните зависимости

Если вы используете Jetpack, мобильное приложение WordPress или внешние системы публикации «в блог», полная блокировка XML-RPC может сломать процессы.

Практическое правило: если вы не уверены, что XML-RPC нужен, в большинстве случаев он не нужен. Но безопаснее начать с ограничения опасных методов и rate limit, а уже потом отключать полностью.

Фрагмент конфигурации Nginx для блокировки /xmlrpc.php

Стратегия защиты: отключить полностью или ограничить доступ

Выберите подход, исходя из того, как вы администрируете сайт и какие интеграции реально работают.

Вариант A: полностью отключить XML-RPC

Оптимально для WordPress-сайтов без Jetpack/мобильных клиентов и без старых интеграций. Плюс в том, что запрос не дойдёт до PHP и не будет греть CPU.

Вариант B: оставить XML-RPC, но запретить pingback и ограничить частоту

Компромисс, если XML-RPC нужен для публикаций/приложений, но pingback вы не используете. Обычно этого достаточно, чтобы сильно снизить риск и нагрузку.

Вариант C: разрешить XML-RPC только доверенным IP

Самый строгий вариант: когда XML-RPC использует одна интеграция (например, корпоративный сервис публикации). Требует стабильных IP и дисциплины в их обновлении.

FastFox VDS
Облачный VDS-сервер в России
Аренда виртуальных серверов с моментальным развертыванием инфраструктуры от 195₽ / мес

Отключаем XML-RPC на Nginx (запрос не доходит до PHP)

Если Nginx стоит фронтом, закрывать /xmlrpc.php лучше здесь: это быстрее и надёжнее, чем фильтровать внутри WordPress.

Полная блокировка /xmlrpc.php

location = /xmlrpc.php {
    return 403;
}

Если хотите «мягче» (иногда так проще уменьшить шум от сканеров), верните 404:

location = /xmlrpc.php {
    return 404;
}

Разрешить только доверенным IP

Если endpoint нужен, но только для конкретной интеграции, включите allowlist. Важно: обработку PHP оставьте такой же, как в вашей рабочей конфигурации.

location = /xmlrpc.php {
    allow 203.0.113.10;
    allow 203.0.113.11;
    deny all;
    include fastcgi_params;
    fastcgi_pass php-fpm;
}

Rate limit для /xmlrpc.php (если оставляете доступ)

Ограничение частоты резко снижает эффективность брутфорса и «мультизапросов». Пример схемы для Nginx:

limit_req_zone $binary_remote_addr zone=xmlrpc:10m rate=5r/m;

location = /xmlrpc.php {
    limit_req zone=xmlrpc burst=10 nodelay;
    include fastcgi_params;
    fastcgi_pass php-fpm;
}

Числа подбирайте по логам. Для большинства сайтов 5 запросов в минуту на IP для XML-RPC более чем достаточно. Если у вас WordPress крутится на VDS, полезно посмотреть метрики PHP-FPM до и после включения лимитов: эффект обычно виден сразу.

Отключаем XML-RPC на Apache и в .htaccess

На Apache логика та же: проще закрыть файл на уровне веб-сервера, чем отдавать запрос внутрь PHP.

Полная блокировка

<Files "xmlrpc.php">
    Require all denied
</Files>

Разрешить только доверенным IP

<Files "xmlrpc.php">
    Require ip 203.0.113.10 203.0.113.11
</Files>

Панель WAF с событиями блокировки запросов к /xmlrpc.php

Отключение XML-RPC на уровне WordPress (когда нет доступа к конфигам)

На типовом виртуальном хостинге или в условиях, когда вы не можете менять конфиги Nginx/Apache, можно отключить XML-RPC через WordPress. Это менее эффективно (запрос всё равно попадёт в PHP), но как быстрый «пластырь» работает.

Полностью отключить XML-RPC

Добавьте фильтр в functions.php темы или в мини-плагин:

add_filter('xmlrpc_enabled', '__return_false');

Отключить только pingback

Если вам нужен XML-RPC для приложений/публикации, но pingback не нужен:

add_filter('xmlrpc_methods', function($methods) {
    unset($methods['pingback.ping']);
    unset($methods['pingback.extensions.getPingbacks']);
    return $methods;
});

На практике лучше комбинировать: отключить/ограничить на веб-сервере и оставить фильтры в WordPress как дополнительную страховку.

WAF rules для WordPress: что реально помогает против /xmlrpc.php

Если XML-RPC включён (или вы не можете отключить его полностью), WAF — второй слой. Важно: начинайте с режима логирования и смотрите, что реально срабатывает, иначе легко «подстрелить» легитимные интеграции.

Если вы используете WAF на базе OWASP CRS, сначала включите режим DetectionOnly, изучите события, затем переводите конкретные правила в блокировку. Так меньше шансов сломать Jetpack или корпоративные публикации.

1) Блокировать pingback по содержимому запроса

В типичных атаках в теле запроса встречается строка pingback.ping. Универсальная логика правила: если URI равен /xmlrpc.php и тело содержит pingback.ping — блокировать.

2) Ограничивать частоту и «всплески» multicall

Метод system.multicall не «уязвимость», но ускоритель перебора паролей. Если WAF умеет детектировать частые запросы к /xmlrpc.php и/или сигнатуры multicall — используйте это. Если не умеет, делайте rate limit на Nginx/Apache (пример выше).

3) Фильтровать явный мусор по UA/гео/подсетям (аккуратно)

Если видите сотни запросов с одинаковыми User-Agent или из географий, где у вас нет аудитории, можно добавить мягкие ограничения. Не делайте агрессивных банов «наугад»: корпоративный NAT и мобильные сети легко попадают под раздачу.

FastFox SSL
Надежные SSL-сертификаты
Мы предлагаем широкий спектр SSL-сертификатов от GlobalSign по самым низким ценам. Поможем с покупкой и установкой SSL бесплатно!

Проверка, что защита работает: короткий чек-лист

1) Проверяем ответы сервера

После внедрения правил убедитесь, что endpoint реально закрыт:

curl -I https://example.com/xmlrpc.php

Ожидаемо увидеть 403 или 404 (в зависимости от выбранного варианта). Если у вас allowlist, проверьте и с доверенного IP, и с обычного.

2) Проверяем, что не сломали нужные сценарии

  • Jetpack: синхронизация, публикации, статистика.
  • Мобильное приложение WordPress: авторизация и публикации.
  • Внешние интеграции: импорт, кросспостинг, публикации.

3) Смотрим логи и нагрузку

После отключения или ограничения /xmlrpc.php обычно заметно падают:

  • количество запросов к /xmlrpc.php;
  • пики CPU у PHP-FPM;
  • ошибки 499/504 на фронте (если воркеры были забиты).

Если параллельно вы настраиваете HTTPS и HSTS, полезно держать миграцию под контролем: пригодится материал про 301, HSTS и SSL при переносе домена.

Типовые ошибки и как их избежать

Ошибка 1: закрыть XML-RPC на backend, но оставить доступ через фронт/балансировщик

Если перед сайтом стоит CDN или балансировщик, убедитесь, что правило применяется на самом «входе». Иначе фронт продолжит проксировать запросы, а инфраструктура будет тратить ресурсы на повторные попытки и таймауты.

Ошибка 2: полная блокировка при активном Jetpack

Если Jetpack действительно нужен, начните с блокировки pingback и rate limit. Потом решайте, можно ли отключить XML-RPC целиком.

Ошибка 3: надеяться только на WAF

WAF — отличный слой, но самая дешёвая защита — не принимать запрос вообще. Для WordPress это особенно заметно на небольших серверах: лишние запросы к PHP стоят дорого.

Минимальный «золотой набор» для WordPress security вокруг XML-RPC

  1. Если XML-RPC не нужен — закрыть /xmlrpc.php на Nginx/Apache.
  2. Если нужен — отключить pingback и поставить rate limit на endpoint.
  3. Добавить WAF-правила: блок pingback.ping, контроль всплесков system.multicall, базовую антибрут-логику.
  4. Регулярно просматривать логи по /xmlrpc.php и метрики PHP-FPM.

Итог

XML-RPC в WordPress — не «зло» само по себе, но это типичный пример функции, которая часто включена без необходимости. Практичная стратегия простая: выключаем всё, что не используем; всё, что используем — ограничиваем и защищаем. Такой подход почти всегда даёт быстрый выигрыш и по безопасности, и по стабильности.

Если хотите двигаться дальше, по похожей схеме имеет смысл «укреплять» и другие точки входа WordPress: /wp-login.php, wp-admin/admin-ajax.php, REST API.

Поделиться статьей

Вам будет интересно

Debian/Ubuntu: конфликт systemd-resolved DNSStubListener на 127.0.0.53 с dnsmasq, Unbound и BIND OpenAI Статья написана AI (GPT 5)

Debian/Ubuntu: конфликт systemd-resolved DNSStubListener на 127.0.0.53 с dnsmasq, Unbound и BIND

Если локальный DNS в Debian или Ubuntu не стартует с ошибкой address already in use, причина часто в systemd-resolved и DNSStubLis ...
Debian/Ubuntu: как исправить NFS mount.nfs: access denied by server while mounting OpenAI Статья написана AI (GPT 5)

Debian/Ubuntu: как исправить NFS mount.nfs: access denied by server while mounting

Ошибка mount.nfs: access denied by server while mounting в Debian и Ubuntu обычно указывает на проблему на стороне NFS-сервера: не ...
Debian/Ubuntu: как устранить конфликт systemd-resolved DNSStubListener с BIND9, dnsmasq и AdGuard Home OpenAI Статья написана AI (GPT 5)

Debian/Ubuntu: как устранить конфликт systemd-resolved DNSStubListener с BIND9, dnsmasq и AdGuard Home

Если в Debian или Ubuntu DNS-сервер не стартует из-за ошибки port 53 busy, часто причина в systemd-resolved с локальным слушателем ...