Лучший способ отключить xmlrpc.php
Какой самый лучший способ отключить файл xmlrpc.php в WordPress, когда он вам не нужен?

Начиная с WordPress 3.5 эта опция (XML-RPC
) включена по умолчанию, и возможность отключить её из дашборда
WordPress исчезла.
Добавьте этот фрагмент кода для использования в файле functions.php
:
// Отключаем использование XML-RPC
add_filter( 'xmlrpc_enabled', '__return_false' );
// Удаляем X-Pingback из заголовков
add_filter( 'wp_headers', 'disable_x_pingback' );
function disable_x_pingback( $headers ) {
unset( $headers['X-Pingback'] );
return $headers;
}
Хотя этот код выполняет свою задачу, он может создавать нагрузку, если сайт подвергается атаке через частые запросы.
Лучше использовать следующий фрагмент кода в файле .htaccess
.
# Блокируем запросы к xmlrpc.php в WordPress
<Files xmlrpc.php>
order allow,deny
deny from all
</Files>
Или используйте этот код для запрета доступа к файлу xmlrpc.php
в блоке сервера NGINX.
# Блокировка запросов к xmlrpc.php в nginx
location /xmlrpc.php {
deny all;
}
Учтите, что отключение может повлиять на вход через мобильные приложения. Если я не ошибаюсь, мобильному приложению WordPress это необходимо.
Подробнее об использованииXML-RPC
см. в Кодексе.
- Всегда делайте резервную копию файлов перед редактированием или добавлением кода.
Редактирование/Обновление
@Prosti, -Вы абсолютно правы- насчёт возможностей, которые RESTful API
предоставит для WordPress!
Я забыл упомянуть об этом. Он уже должен был быть интегрирован в ядро (WordPress версии 4.1), но тогда это было невозможно. Однако, похоже, он войдёт в ядро в WordPress 4.5.
Альтернативой на данный момент является этот плагин: WordPress REST API (Version 2)
Вы можете использовать его, пока RESTful API
также не станет частью ядра WordPress.
Планируемая дата выхода WordPress 4.5 (12 апреля 2016 (+3 недели))
Для тех, кто интересуется
RESTful
, на Stackoverflow есть отличное сообщество и вики.

Если я правильно понимаю, мобильному приложению WordPress это не нужно - скорее всего, это не понадобится в будущем, когда мы перейдем на RESTful API WordPress (WordPress 4.5)

Для тех, у кого все еще остается заголовок X-Pingback
для отдельных записей/страниц. Нам нужно использовать другой фильтр, чтобы полностью его удалить: add_filter('pings_open', '__return_false', PHP_INT_MAX);
.

Добавление подобных вещей в functions.php
приведет к потере всех изменений при смене темы. function.php
предназначен только для целей дизайна, используйте плагин!

@David, конечно, но людям лучше использовать папку mu-plugins, а не создавать отдельный плагин для этого. Когда людям нужна/используется такая функция, у них есть на то причина, и они не хотят, чтобы кто-либо (даже администратор) имел возможность отключить плагин.

Если у вас есть возможность заблокировать XML-RPC через конфигурацию веб-сервера, предложения @Charles хороши.
Если же вы можете отключить его только с помощью PHP, фильтр xmlrpc_enabled
— не лучший способ.
Как указано в документации:
https://developer.wordpress.org/reference/hooks/xmlrpc_enabled/
он отключает только XML-RPC методы, требующие аутентификации.
Вместо этого используйте фильтр xmlrpc_methods
, чтобы отключить все методы:
<?php
// Отключаем все XML-RPC эндпоинты
add_filter('xmlrpc_methods', function () {
return [];
}, PHP_INT_MAX);
Вы можете проверить, работает ли это, отправив POST-запрос к xmlrpc.php с таким содержимым:
<methodCall>
<methodName>system.listMethods</methodName>
</methodCall>
Если фильтр работает, останется только 3 метода:
<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
<params>
<param>
<value>
<array>
<data>
<value>
<string>system.multicall</string>
</value>
<value>
<string>system.listMethods</string>
</value>
<value>
<string>system.getCapabilities</string>
</value>
</data>
</array>
</value>
</param>
</params>
</methodResponse>
Можно быстро проверить это с помощью curl:
curl -X POST \
-H 'Cache-Control: no-cache' \
-H 'Content-Type: application/xml' \
-d '<methodCall><methodName>system.listMethods</methodName></methodCall>' \
https://your-wordpress-site.com/xmlrpc.php

Лучше всего отключить функции xmlrpc.php
с помощью плагина, а не удалять или отключать сам файл. Сам файл будет заменяться при обновлениях ядра WordPress, в то время как плагин будет сохранять его отключённым после обновлений ядра и при смене тем.
Посмотрите https://wordpress.org/plugins/search.php?q=disable+xml-rpc на различные плагины. У всех есть небольшие различия.
Эти плагины делают то же самое, что и функция, добавленная в файл functions.php
темы, или добавление правила order,allow deny
в .htaccess (как описано в других ответах), с той разницей, что плагин или функция отключают вызовы к xmlrpc.php
через PHP, а правило в .htaccess работает через mod_rewrite в веб-сервере (например, Apache или Nginx). Нет заметной разницы в производительности между использованием PHP и mod_rewrite на современном сервере.

Для крайне малого числа пользователей, которые размещают WordPress на серверах IIS, можно использовать модуль IIS URL Rewrite для наложения ограничений, аналогичных htaccess. Пример ниже предполагает, что реальный IP-адрес клиента передается в заголовке X-Forwarded-For, разрешенный IP-адрес — 55.55.555.555, а для всех остальных IP-адресов должен возвращаться HTTP 404.
<rule name="wordpress-restrictions" enabled="true" stopProcessing="true">
<match url="(^xmlrpc.php)|(^wp-admin)|(^wp-login.php)" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{HTTP_X_FORWARDED_FOR}" pattern="(^55\.55\.555\.555$)" negate="true" />
</conditions>
<action type="CustomResponse" statusCode="404" subStatusCode="44" statusReason="File or directory not found" statusDescription="The resource you are looking for might have been removed, had its name changed, or is temporarily unavailable." />
</rule>

Лучший способ - использовать файл .htaccess для блокировки всех запросов, добавив
# Блокировка запросов к WordPress xmlrpc.php
<Files xmlrpc.php>
order deny,allow
deny from all
allow from 1.1.1.1
</Files>
в конец файла. Но если вам нужен самый простой способ, использование плагина Disable XML-RPC-API сделает свою работу.

Недавно я установил Wordfence, который начиная с версии 6.3.12 имеет возможность блокировать прямой доступ к любым местам. Добавление /xmlrpc.php на страницу настроек в список запрещённых IP-адресов с опцией "Немедленно блокировать IP-адреса, которые обращаются к этим URL" теперь показывает одну блокировку попытки доступа примерно каждые 15 минут.
Это также имеет преимущество в возможности блокировать URL, чтобы избавиться от надоедливых ботов, которые возвращаются снова и снова с разными IP-адресами.
Я не знаю, разрешает ли он использование xmlrpc.php приложениями для валидных операций.
Первоначально у меня были некоторые проблемы с тем, что он вызывал ошибки 504 Timeout и 502 Bad Gateway на сервере, но, кажется, всё стабилизировалось.
Очень впечатлён результатом на данный момент, и он провёл ценную очистку профиля после того, как сайт был взломан до установки Wordfence, несмотря на то, что всегда использовались последние версии WordPress и плагинов.

Добавление /xmlrpc.php
в правило безопасности, блокирующее IP-адреса, которые обращаются к нему, может заблокировать легитимный трафик. Если сайт с включенными пингбеками ссылается на ваш сайт, он отправит запрос к этому URL и будет немедленно заблокирован... это может создать проблемы.

Использование плагина безопасности (рекомендуется):
Один из самых простых способов заблокировать доступ к файлу xmlrpc.php в WordPress — это использование плагина безопасности, такого как Wordfence
или Sucuri Security
. Эти плагины часто имеют опции для блокировки XML-RPC или конкретных файлов, таких как xmlrpc.php.
Использование серверных правил для Apache
<Files xmlrpc.php>
Order Deny,Allow
Deny from all
</Files>
Использование серверных правил для Nginx
location ~* /xmlrpc.php {
deny all;
access_log off;
log_not_found off;
}
Перезагрузите ваш Nginx
sudo systemctl reload nginx
Отключение XML-RPC через wp-config.php:
define('XMLRPC_REQUEST', false);
