Найкращий спосіб усунути 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 цього потребує.
Див. Codex для отримання додаткової інформації про використання XML-RPC.

  • Будь ласка, завжди створюйте резервну копію файлів (-ів) перед редагуванням / додаванням.


Редагування / оновлення

@Prosti, - Ви абсолютно праві - щодо варіантів, які RESTful APIзапропонують для WordPress!

Я забув це згадати. Це вже повинно було бути інтегровано в ядро ​​( WordPress версії 4.1 ), що в той час було неможливо. Але, як здається, це буде ядро ​​в WordPress 4.5.

На даний момент альтернативою є цей плагін: WordPress REST API (версія 2)
Ви можете використовувати його до тих пір, поки він не Restful APIє основним для WordPress.
Цільова дата виходу WordPress 4.5. (12 квітня 2016 р. (+ 3w))

Для тих, хто цікавиться RESTful, на Stackoverflow - дуже приємна вікі спільноти.


2
Якщо я маю рацію, мобільний додаток WordPress потребує цього - ймовірно, це не буде потрібно в майбутньому, коли ми переходимо до API WordPress RESTful (WordPress 4.5)
pro

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

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

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

Схоже, =в першому рядку nginx conf-коду відсутній знак рівності ( ). Це спрацювало для мене: 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 -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

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 на сучасному сервері.


3

Для крайньої меншості, яка розміщує WordPress в IIS, ви можете використовувати модуль перезапису URL-адреси IIS, щоб зробити подібні обмеження, схожі на htaccess. Наведений нижче приклад передбачає, що справжній клієнтський IP надходить у заголовку X-Forwarded-For, відомий 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;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.