XML-RPC — это механизм WordPress для обмена данными с внешними клиентами через файл <code>/xmlrpc.php</code>. Его могут использовать мобильные приложения, Jetpack и отдельные внешние сервисы.
В то же время XML-RPC часто сканируют автоматизированные боты. Через него могут выполняться попытки подбора паролей, массовые pingback-запросы и другие нежелательные обращения. Оптимальная защита зависит от того, нужен ли XML-RPC именно вашему сайту: иногда достаточно отключить pingback, а иногда endpoint можно полностью заблокировать.
Почему XML-RPC может быть проблемой для WordPress
Сам XML-RPC не является уязвимостью, но открытый endpoint добавляет ещё один канал для обращений к сайту. Если он доступен без ограничений, злоумышленники могут отправлять большое количество POST-запросов и проверять учётные данные пользователей.
Отдельный риск связан с методом <code>system.multicall</code>, который позволяет объединять несколько XML-RPC-вызовов в один HTTP-запрос. Это может усложнять обнаружение brute-force на уровне простых правил защиты.
Pingback имеет другую природу: функция предназначена для уведомления сайтов о ссылках, но может использоваться для нежелательных запросов и отражённых атак. Поэтому отключение pingback часто становится компромиссом между безопасностью и совместимостью.
- XML-RPC не следует путать с REST API WordPress: блокировка одного механизма не отключает другой.
- Большое количество запросов к <code>/xmlrpc.php</code> не всегда означает успешную атаку, но является поводом проверить журналы и правила защиты.
- Защита XML-RPC не заменяет обновление WordPress, сложные пароли, 2FA и ограничение доступа к административной части.
Сначала определите, нужен ли XML-RPC
Перед блокировкой проверьте, какие сервисы подключены к сайту. Полное отключение может нарушить публикацию или управление сайтом из мобильного приложения, работу Jetpack или интеграцию с внешней системой.
Если сайт не использует ни один из этих сценариев, полное отключение обычно является самым простым решением. Для корпоративного сайта или интернет-магазина стоит дополнительно проверить все автоматические процессы: импорт, публикацию, синхронизацию и резервное копирование.
Не полагайтесь только на предположения. После изменения настроек выполните тестовую публикацию, откройте мобильный клиент и проверьте интеграции, имеющие доступ к WordPress.
- Составьте список плагинов и сервисов, взаимодействующих с сайтом.
- Проверьте документацию интеграций: одни используют XML-RPC, другие — REST API или собственный webhook.
- По возможности сначала протестируйте изменения на staging-копии сайта.
- После блокировки просмотрите журналы ошибок и сообщения интеграций.
Безопасный компромисс: отключение pingback
Если XML-RPC нужен для легитимных интеграций, необязательно блокировать весь endpoint. Можно удалить методы, связанные с pingback, оставив доступными другие XML-RPC-вызовы.
Фильтр нужно добавить в собственный плагин или mu-plugin. Он удаляет из списка доступных XML-RPC-команд методы, представляющие риск для этого сценария:
<?php
/**
* Отключение pingback в WordPress.
*/
add_filter('xmlrpc_methods', function ($methods) {
unset($methods['pingback.ping']);
unset($methods['pingback.extensions.getPingbacks']);
return $methods;
});
Что меняет этот код
После подключения фильтра WordPress не будет обрабатывать два указанных метода pingback. Другие XML-RPC-функции останутся доступными, поэтому совместимость с некоторыми сервисами будет выше, чем при полной блокировке.
Это не останавливает все brute-force-запросы к XML-RPC. Если endpoint продолжат активно атаковать, добавьте rate limiting, правила WAF или отдельную защиту аутентификации.
Полное отключение XML-RPC
Если XML-RPC не используется, его можно отключить на уровне WordPress с помощью фильтра <code>xmlrpc_enabled</code>:
<?php
/**
* Полное отключение XML-RPC.
*/
add_filter('xmlrpc_enabled', '__return_false');
Где разместить код
Не добавляйте защиту непосредственно в файлы активной темы, если она должна работать независимо от дизайна. После смены или обновления темы такой код можно потерять.
Практичный вариант — mu-plugin в каталоге <code>wp-content/mu-plugins/</code>. Например, создайте файл <code>xmlrpc-hardening.php</code> с PHP-кодом и убедитесь, что каталог существует. Другой вариант — небольшой собственный плагин, не зависящий от темы.
- Сделайте резервную копию перед изменениями.
- Не добавляйте два разных правила, если не понимаете особенности их взаимодействия.
- После активации проверьте сайт в режиме, которым пользуются редакторы и интеграции.
Защита на уровне сервера и WAF
Фильтр WordPress срабатывает после того, как запрос уже достиг PHP. Чтобы снизить нагрузку, дополнительно используйте веб-сервер, CDN или WAF. Лучшая тактика — ограничивать частоту POST-запросов к <code>/xmlrpc.php</code>, а не бездумно блокировать весь endpoint.
Rate limiting должен учитывать реальные интеграции. Слишком строгое правило может прервать синхронизацию или публикацию, особенно если несколько редакторов или сервисов работают одновременно.
На сервере также можно разрешить доступ только с известных IP-адресов, если интеграция использует стабильные адреса. Для публичных мобильных клиентов и сервисов такой подход часто неприменим.
- Установите отдельное правило для POST-запросов к <code>/xmlrpc.php</code>.
- Добавьте журналирование заблокированных запросов и периодически просматривайте его.
- Не используйте универсальную блокировку по User-Agent: его легко подделать.
- Убедитесь, что правило не блокирует внутренние health-check или легитимную интеграцию.
- Не редактируйте конфигурацию Nginx или Apache без резервной копии и возможности быстро откатить изменения.
Как проверить результат и не сломать сайт
После внедрения защиты проверьте не только доступность главной страницы. Важно убедиться, что нужные сценарии работают, а в журналах нет ошибок аутентификации или массовых повторных запросов.
Проверку лучше проводить в следующей последовательности:
- Войдите в мобильное приложение WordPress, если оно используется.
- Проверьте Jetpack и другие сервисы, подключённые к сайту.
- Выполните тестовую публикацию или обновление записи через каждую важную интеграцию.
- Просмотрите access log веб-сервера и журнал ошибок WordPress.
- Убедитесь, что страницы сайта, административная панель и REST API работают в соответствии с ожиданиями.
- Если сервис перестал работать, временно отмените правило, определите нужный механизм подключения и настройте исключение.
Распространённые ошибки при защите XML-RPC
Самая частая ошибка — полностью блокировать XML-RPC, не проверив зависимости сайта. Это быстро устраняет нежелательные запросы, но может незаметно нарушить публикацию из мобильного клиента или работу внешнего сервиса.
Другая ошибка — считать, что отключение pingback автоматически защищает от brute-force. Оно устраняет отдельный класс функций, но не заменяет rate limiting и защиту учётных записей.
Также не стоит без необходимости устанавливать несколько плагинов с дублирующими функциями. Конфликт фильтров или серверных правил усложняет диагностику, когда интеграция перестаёт работать.
- Не вставляйте PHP-код в редактор записей или страниц.
- Не храните критически важную защиту только в файлах темы.
- Не блокируйте <code>/xmlrpc.php</code> вслепую, если сайт использует Jetpack или мобильный клиент.
- Не считайте отсутствие ошибок на главной странице доказательством корректной работы интеграций.
- Не пренебрегайте 2FA, уникальными паролями и обновлениями только потому, что XML-RPC отключён.
Частые вопросы
Нужно ли всегда полностью отключать XML-RPC в WordPress?
Нет. Если сайт использует Jetpack, мобильный клиент или сервис, которому нужен XML-RPC, безопаснее сначала отключить pingback и добавить ограничение частоты запросов. Полная блокировка уместна, когда endpoint точно не используется.
Исчезнут ли brute-force-атаки после отключения XML-RPC?
Они могут переместиться на другие точки входа, например страницу входа или REST API. Отключение XML-RPC убирает один канал атак, но также необходимо использовать сложные пароли, 2FA, обновления и rate limiting.
Можно ли отключить только pingback, не блокируя XML-RPC?
Да. Фильтр <code>xmlrpc_methods</code> позволяет удалить методы <code>pingback.ping</code> и <code>pingback.extensions.getPingbacks</code>, оставив доступными другие XML-RPC-вызовы.
Где лучше разместить код защиты XML-RPC?
Лучше всего использовать mu-plugin или отдельный собственный плагин. Это не привязывает защиту к активной теме и снижает риск потери кода после смены или обновления дизайна.
Как понять, что блокировка нарушила работу интеграции?
Проверьте тестовую публикацию, мобильное приложение, Jetpack и журналы сервера. Если после блокировки сервис возвращает ошибку, выясните, использует ли он XML-RPC, REST API или другой канал обмена данными.
Вывод
Защиту XML-RPC в WordPress стоит настраивать по принципу минимально необходимого доступа. Если интеграции не нужны, полностью отключите XML-RPC. Если они нужны — начните с блокировки pingback и добавьте ограничение частоты запросов на уровне WAF или веб-сервера.
После любого изменения обязательно проверьте реальные сценарии работы сайта и журналы. Так вы сократите количество нежелательных запросов, не потеряв необходимые интеграции.