Как отключить XML-RPC и защитить WordPress от брутфорса

Если на сайте не используются мобильное приложение WordPress, внешние сервисы публикации и старые интеграции, XML-RPC чаще всего только расширяет поверхность атаки. Самый частый сценарий — массовые попытки подбора паролей через /xmlrpc.php, которые в логах выглядят как поток запросов с методом system.multicall или обычным wp.getUsersBlogs.

Отключать XML-RPC имеет смысл не «на всякий случай», а когда вы понимаете, что он не нужен. Если нужен Jetpack, удалённая публикация или синхронизация через сторонний софт, сначала проверьте зависимости. В остальных случаях endpoint можно закрыть без заметного влияния на обычную работу сайта.

Когда XML-RPC действительно мешает

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

  • в логах много POST-запросов к xmlrpc.php;
  • идут попытки перебора логина и пароля без перехода на wp-login.php;
  • нагрузка растёт из-за повторяющихся запросов с system.multicall;
  • WAF или модуль защиты уже блокирует часть запросов, но трафик всё равно идёт;
  • некоторые хостинги помечают сайт как атакуемый и включают дополнительные ограничения.

Что проверить до отключения

Сначала убедитесь, что XML-RPC не используется в рабочих сценариях. Проверьте:

  • подключён ли Jetpack;
  • есть ли мобильное приложение WordPress у редакторов;
  • используются ли внешние сервисы автопостинга или мониторинга, которым нужен XML-RPC;
  • нет ли старых интеграций, завязанных на xmlrpc.php.

Если сомневаетесь, временно ограничьте доступ к endpoint на уровне сервера и посмотрите, не появятся ли ошибки в рабочих процессах. Это безопаснее, чем сразу ломать функциональность на продакшене.

Диагностика: как понять, что атака идёт через xmlrpc.php

В access log обычно видно повторяющиеся POST-запросы к одному и тому же файлу. Примерно так это выглядит в логах Nginx:

203.0.113.10 - - [21/Aug/2026:10:12:44 +0000] "POST /xmlrpc.php HTTP/1.1" 200 182 "-" "Mozilla/5.0"
203.0.113.10 - - [21/Aug/2026:10:12:45 +0000] "POST /xmlrpc.php HTTP/1.1" 200 182 "-" "Mozilla/5.0"
198.51.100.24 - - [21/Aug/2026:10:12:47 +0000] "POST /xmlrpc.php HTTP/1.1" 200 182 "-" "Mozilla/5.0"

Если у вас есть SSH-доступ, можно быстро отфильтровать такие запросы:

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

На shared-хостинге обычно достаточно панели логов или отчёта модуля безопасности. Важен не только факт обращений, но и их частота: единичный запрос — это нормально, поток однотипных POST — уже повод закрывать endpoint.

Пошаговое решение: как отключить XML-RPC без плагина

Самый надёжный способ — запретить обработку XML-RPC на уровне WordPress. Для этого добавьте код в functions.php дочерней темы или в собственный мини-плагин. Вариант через дочернюю тему подходит для небольших сайтов, но для постоянной защиты лучше отдельный mu-plugin.

Вариант 1. Отключить XML-RPC через фильтр

<?php
add_filter( 'xmlrpc_enabled', '__return_false' );

Это простой и рабочий способ: WordPress перестанет принимать XML-RPC-запросы, а обычная работа сайта не изменится. Но если сервер всё равно отдаёт xmlrpc.php с кодом 200, атакующий будет продолжать стучаться в endpoint, просто без доступа к функциональности. Поэтому лучше дополнить это блокировкой на уровне веб-сервера.

Вариант 2. Закрыть xmlrpc.php на уровне Nginx

Если сайт работает на Nginx, добавьте отдельное правило в конфигурацию сайта:

location = /xmlrpc.php {
    deny all;
    access_log off;
    log_not_found off;
    return 444;
}

Такой вариант обрывает запрос ещё до PHP. Это полезно, если атака идёт массово и вы хотите снизить нагрузку на PHP-FPM. После изменения конфигурации не забудьте проверить синтаксис и перезагрузить Nginx.

nginx -t
systemctl reload nginx

Вариант 3. Ограничить доступ через Apache

Если сайт работает на Apache, правило можно добавить в .htaccess или конфигурацию виртуального хоста:

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

Этот вариант тоже блокирует прямой доступ к файлу. Если у вас смешанная инфраструктура или прокси перед Apache, проверьте, что правило применяется именно на том уровне, где запросы реально доходят до сайта.

Что выбрать: код WordPress, сервер или плагин

СпособПлюсыМинусыКогда использовать
Фильтр xmlrpc_enabledБыстро, без правок сервераЗапросы всё ещё доходят до PHPЕсли нет доступа к конфигу веб-сервера
Nginx/ApacheСнимает нагрузку раньше PHPНужен доступ к конфигуДля продакшена и защиты от брутфорса
Плагин безопасностиУдобно для админов без доступа к серверуДополнительный код и зависимостиЕсли уже используете security-плагин

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

Проверка результата после внедрения

После отключения важно не ограничиться «вроде работает». Проверьте несколько вещей:

  • открывается ли /xmlrpc.php напрямую в браузере или через curl;
  • нет ли ошибок у интеграций, которые вы считали неиспользуемыми;
  • снизилось ли число POST-запросов к endpoint в логах;
  • не появились ли новые ошибки в журнале PHP или веб-сервера.

Проверка через curl выглядит так:

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

Ожидаемый результат зависит от способа блокировки. При серверном запрете это может быть 403 или нестандартное закрытие соединения. При отключении через WordPress запрос может доходить до PHP, но endpoint не должен выполнять XML-RPC-методы.

Если вы хотите проверить именно функциональную блокировку, отправьте тестовый XML-RPC-запрос и убедитесь, что он не проходит. Для большинства сайтов достаточно уже того, что endpoint перестал отвечать как рабочий интерфейс.

Частые ошибки и как их исправить

Отключили XML-RPC, но атаки в логах остались

Это нормально, если вы закрыли только WordPress-слой. Запросы всё ещё приходят, но уже не обрабатываются. Если хотите убрать и сам трафик на PHP, блокируйте xmlrpc.php на уровне Nginx или Apache.

Сломался Jetpack или мобильное приложение

Значит, XML-RPC был нужен. В таком случае не отключайте его полностью. Лучше ограничьте доступ по IP, если это возможно, или используйте более узкую серверную защиту против брутфорса.

Добавили правило в .htaccess, но оно не сработало

Частая причина — сайт работает не на Apache, а на Nginx, либо .htaccess не читается из-за настроек хостинга. Проверьте стек сервера и применяйте правило на том уровне, который реально обрабатывает запрос.

После правок появилась ошибка 500

Обычно это синтаксическая ошибка в конфиге или неверно вставленный PHP-код. Для PHP-фильтра проверьте файл на лишние символы, а для Nginx — прогоните nginx -t перед перезагрузкой.

Практика безопасности: что ещё стоит сделать рядом с XML-RPC

Отключение XML-RPC полезно, но не заменяет базовую защиту входа. Если на сайте идёт брутфорс, имеет смысл дополнительно:

  • ограничить число попыток входа в админку;
  • включить двухфакторную авторизацию для администраторов;
  • использовать сложные уникальные пароли;
  • проверить, не открыт ли wp-login.php для массовых попыток без ограничений;
  • следить за журналами доступа хотя бы на уровне хостинга.

Если нужен более широкий набор мер по чистке и снижению дублей в WordPress, иногда удобнее закрывать несколько технических проблем сразу через специализированные плагины вроде Clearfy Pro: он помогает убрать часть лишнего технического шума и упростить обслуживание сайта. Но для XML-RPC отдельное точечное правило всё равно остаётся самым прозрачным вариантом.

Главная идея простая: если endpoint не нужен, не оставляйте его открытым только потому, что он «исторически есть в WordPress». В техническом обслуживании сайта лишние входные точки почти всегда превращаются в лишнюю нагрузку или лишний риск.

Как использовать хуки WooCommerce для автоматического изменения статуса заказа
30.07.2026
Автоматическое удаление товаров из заказов WooCommerce после отмены или возврата
05.06.2026
Как избежать проблем при использовании PHP 8 в WordPress
12.02.2026
Как отключить WooCommerce cart fragments и ускорить корзину без поломки мини-корзины
12.08.2026
Как исправить ошибку 503 Service Unavailable в WordPress
18.11.2025