Как отключить XML-RPC только для определённых IP в WordPress

Что такое XML-RPC и зачем его отключать частично

XML-RPC — интерфейс удалённого взаимодействия с WordPress. Он используется для публикации записей через внешние приложения, мобильные клиенты, а также некоторыми плагинами и сервисами. Однако этот протокол часто становится мишенью для атак типа Brute Force и DDoS. Полное отключение XML-RPC может нарушить работу легитимных интеграций, поэтому уместно ограничить доступ по IP, разрешая только доверенным адресам.

Диагностика: как понять, что XML-RPC уязвим или используется злоумышленниками

  • Проверьте логи сервера на частые POST-запросы к /xmlrpc.php с неизвестных IP.
  • Используйте команду Linux: grep xmlrpc.php /var/log/apache2/access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head — покажет IP с наибольшим числом обращений.
  • Проверьте в Wordfence или другом брандмауэре наличие попыток взлома через XML-RPC.

Пошаговое решение: отключить XML-RPC для всех, кроме определённых IP

Для ограничения доступа напишем кастомный фильтр в functions.php активной темы или в собственном плагине.

add_filter('xmlrpc_enabled', function($enabled) {
    $allowed_ips = ['123.123.123.123', '111.222.333.444']; // замените на свои IP
    $remote_ip = $_SERVER['REMOTE_ADDR'] ?? '';
    if (!in_array($remote_ip, $allowed_ips)) {
        return false; // Отключаем XML-RPC для всех, кроме разрешённых IP
    }
    return $enabled;
});

Этот код проверит IP клиента и отключит XML-RPC, если адрес не в списке разрешённых.

Альтернативный способ через .htaccess (Apache)

Можно заблокировать доступ к xmlrpc.php на уровне веб-сервера:

<Files xmlrpc.php>
    Order deny,allow
    Deny from all
    Allow from 123.123.123.123
    Allow from 111.222.333.444
</Files>

Поддержка IP-списка зависит от конфигурации сервера. Для nginx нужно использовать другую директиву.

Как проверить, что ограничение сработало

  • Из неразрешённого IP попробуйте отправить запрос curl -X POST https://вашдомен/xmlrpc.php. Сервер должен возвращать ошибку 403 или пустой ответ.
  • Из разрешённого IP тот же запрос должен вернуть корректный ответ XML-RPC (обычно пустой XML с ошибкой об отсутствии метода).
  • Проверяйте логи сервера на попытки доступа и их блокировки.

Частые ошибки при ограничении доступа к XML-RPC и их исправление

  • Неправильный IP-адрес в списке — используйте реальный IP клиента, учитывая прокси/Load Balancer (может потребоваться проверять HTTP_X_FORWARDED_FOR).
  • Кэширование — если сайт за CDN (Cloudflare, Sucuri), отключение может не сработать, так как запросы идут через прокси. Нужно настраивать доступ на уровне CDN.
  • Проблемы с .htaccess — неверный синтаксис или конфликт с другими правилами может привести к недоступности сайта. Всегда проверяйте логи сервера после изменений.
  • Отключение для нужных IP — проверьте, что IP, с которых работают ваши приложения, точно указаны, иначе интеграция перестанет работать.

Советы по безопасности и производительности при работе с XML-RPC

  • Если интеграции не используются, отключайте XML-RPC полностью с помощью add_filter('xmlrpc_enabled', '__return_false');.
  • Используйте плагины для защиты, например, Wordfence, которые умеют блокировать подозрительную активность по XML-RPC.
  • Мониторьте логи и количество запросов к xmlrpc.php, чтобы вовремя выявлять атаки.
  • Если нужно разрешить доступ с динамических IP (например, мобильные приложения), рассмотрите применение OAuth или других методов аутентификации вместо IP-фильтрации.

Сравнение способов ограничения доступа к XML-RPC

МетодПлюсыМинусы
Фильтр xmlrpc_enabled в PHPГибко, можно обрабатывать логику внутри WordPressЗагрузка PHP даже при блокировке, возможные накладки с кэшами
Блокировка через .htaccessБлокировка на уровне сервера, меньше нагрузкиМенее гибко, требует доступа к серверу и точных IP
Плагины безопасностиУдобный интерфейс, дополнительные функции защитыМожет влиять на производительность, зависит от стороннего ПО
⭐⭐⭐⭐⭐