Лучший способ устранить xmlrpc.php?

Ответы:

26

Начиная с WordPress 3.5 эта опция (XML-RPC ) включена по умолчанию, и возможность отключить ее из WordPress dashboardисчезла.

Добавьте этот фрагмент кода для использования в functions.php:

// Disable use XML-RPC
add_filter( 'xmlrpc_enabled', '__return_false' );

// Disable X-Pingback to header
add_filter( 'wp_headers', 'disable_x_pingback' );
function disable_x_pingback( $headers ) {
    unset( $headers['X-Pingback'] );

return $headers;
}

Хотя он делает то, что говорит, он может стать интенсивным, когда сайт подвергается атаке, попав в него.
Вы можете лучше использовать следующий фрагмент кода в вашем .htaccessфайле.

# Block WordPress xmlrpc.php requests
<Files xmlrpc.php>
order allow,deny
deny from all
</Files>

Или используйте это, чтобы отключить доступ к xmlrpc.phpфайлу из блока сервера NGINX.

# nginx block xmlrpc.php requests
location /xmlrpc.php {
    deny all;
}

Имейте в виду, что отключение также может повлиять на вход через мобильный телефон. Если я прав, мобильное приложение WordPress нуждается в этом.
См. Кодекс для получения дополнительной информации об использованииXML-RPC .

  • Пожалуйста, всегда делайте резервную копию файла (ов) перед редактированием / добавлением.


Редактировать / Update

@Prosti, -Вы абсолютно правы насчет вариантов, которые RESTful API предложат для WordPress!

Я забыл упомянуть об этом. Он уже должен был быть интегрирован в ядро ​​( WordPress версии 4.1 ), что в то время было невозможно. Но, как кажется, будет основным в WordPress 4.5.

Альтернативой на данный момент является этот плагин: WordPress REST API (версия 2).
Вы можете использовать его до тех пор, пока он не Restful APIстанет основным для WordPress.
Ориентировочная дата выпуска WordPress 4.5. (12 апреля 2016 г. (+ 3 Вт))

Для тех, кто интересуется RESTful, на Stackoverflow очень хорошее сообщество вики.

Чарльз
источник
2
Если я прав, мобильное приложение WordPress действительно нуждается в этом - вероятно, это не понадобится в будущем, как только мы перейдем к WordPress RESTful API (WordPress 4.5)
prosti
2
Для тех, кто все еще получает X-Pingbackзаголовок для одного поста / страницы. Нам нужно использовать другой фильтр , чтобы удалить его полностью: add_filter('pings_open', '__return_false', PHP_INT_MAX);.
MinhTri
1
Добавление таких вещей functions.phpпотеряет весь эффект при смене темы. function.phpтолько для дизайнерских целей, используйте плагин!
Дэвид
@ Давид, конечно, но тогда лучше использовать папку mu-plugins, вместо того, чтобы создавать такой плагин. Когда ppl нужна / используется функция, подобная этой, они имеют такую ​​причину и не хотят, чтобы кто-либо (даже администратор) имел возможность деактивировать плагин.
Чарльз
Похоже, что =в первой строке conf-кода nginx отсутствует знак равенства ( ). Это сработало для меня: location = /xmlrpc.php {
Дейв
6

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

Если вы можете отключить его только с помощью php, xmlrpc_enabledфильтр не правильный путь. Как описано здесь: https://developer.wordpress.org/reference/hooks/xmlrpc_enabled/ он отключает только методы xml rpc, требующие аутентификации.

Вместо этого используйте xmlrpc_methodsфильтр, чтобы отключить все методы:

<?php
// Disable all xml-rpc endpoints
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
tweber
источник
5

Мы используем файл htaccess, чтобы защитить его от хакеров.

# BEGIN protect xmlrpc.php
<files xmlrpc.php>
order allow,deny
deny from all
</files>
# END protect xmlrpc.php
Йорин ван Вильстерен
источник
4

Лучше всего отключить 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 на современном сервере.

markratledge
источник
3

Для крайнего меньшинства, которое размещает WordPress в IIS, вы можете использовать модуль IIS URL Rewrite, чтобы выполнить аналогичные htaccess-подобные ограничения. В приведенном ниже примере предполагается, что в заголовке X-Forwarded-For указан истинный IP-адрес клиента, известным IP-адресом белого списка является 55.55.555.555, и вы хотите ответить HTTP 404 на IP-адреса, не входящие в белый список.

<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>
латунный
источник
0

В первом случае вы можете поместить код add_filter('xmlrpc_enabled', '__return_false');в файл functions.phpили плагин для конкретного сайта. Ясно, что лучше указывать его в зависимости от сайта, чем редактировать файл functions.php.

и другие способы устранения xmlrpc

Язер Хамзелой
источник
0

Я недавно установил Wordfence, который, начиная с версии 6.3.12, может блокировать прямой доступ к любому местоположению. Помещение /xmlrpc.php на страницу «Параметры» в списке IP-адресов с запрещенным доступом «Немедленно блокировать IP-адреса, которые обращаются к этим URL-адресам» теперь показывает, что одна попытка блокируется каждые 15 минут.

Это также имеет то преимущество, что может блокировать URL-адрес, чтобы скрыться от тех надоедливых ботов, которые снова и снова возвращаются с другим IP-адресом.

Я не знаю, позволяет ли он использовать xmlrpc.php в приложениях для допустимых операций.

У меня были некоторые проблемы с ним, приводившие к ошибкам 504 Timeout и 502 Bad Gateway на сервере, но, похоже, они устранились.

Результат впечатлил до сих пор, и он создал ценный профиль очистки после того, как сайт был взломан до установки Wordfence и несмотря на наличие последней версии WordPress и плагинов.

Wordfence https://www.wordfence.com/

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

я использую для Nginx этот маленький код, и это работает на 100%

location ~* (/wp-content/.*\.php|/wp-includes/.*\.php|/xmlrpc\.php$|/(?:uploads|files)/.*\.php$) {
deny all;
access_log off;
log_not_found off;
return 444;
}
Мануэль К
источник