Najlepszy sposób na wyeliminowanie xmlrpc.php?

Odpowiedzi:

26

Od wersji WordPress 3.5 ta opcja ( XML-RPC) jest domyślnie włączona, a możliwość wyłączenia jej z WordPress dashboardzniknęła.

Dodaj ten fragment kodu do użytku w 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;
}

Chociaż robi to, co mówi, może stać się intensywne, gdy witryna jest atakowana, uderzając w nią.
Lepiej użyj poniższego fragmentu kodu w swoim .htaccesspliku.

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

Lub użyj tego, aby wyłączyć dostęp do xmlrpc.phppliku z bloku serwera NGINX.

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

Pamiętaj, że wyłączenie może mieć również wpływ na logowanie za pośrednictwem telefonu komórkowego. Jeśli mam rację, aplikacja mobilna WordPress tego potrzebuje.
Zobacz Codex, aby uzyskać więcej informacji na temat korzystania z XML-RPC.

  • Przed edycją / dodaniem należy zawsze wykonać kopię zapasową pliku (ów).


Edytuj / Aktualizuj

@Prosti, -Masz absolutną rację- co do opcji, które RESTful APIzaoferują WordPress!

Zapomniałem o tym wspomnieć. Powinien już był zintegrowany z rdzeniem ( WordPress wersja 4.1 ), co nie było wówczas możliwe. Ale jak się wydaje, będzie podstawą w WordPress 4.5.

Alternatywą dla tej chwili jest ta wtyczka: WordPress REST API (wersja 2)
Możesz jej używać do momentu, gdy Restful APIjest także rdzeniem WordPress.
Docelowa data wydania WordPress 4.5. (12 kwietnia 2016 r. (+ 3 w))

Dla tych, którzy są zainteresowani RESTful, na Stackoverflow jest bardzo fajna wiki społeczności.

Charles
źródło
2
Jeśli mam rację, aplikacja mobilna WordPress tego potrzebuje - prawdopodobnie nie będzie to potrzebne w przyszłości, gdy przejdziemy do WordPress RESTful API (WordPress 4.5)
prosti
2
Dla tych, którzy nadal otrzymują X-Pingbacknagłówek dla pojedynczego posta / strony. Musimy użyć innego filtru, aby go usunąć całkowicie: add_filter('pings_open', '__return_false', PHP_INT_MAX);.
MinhTri,
1
Dodanie takich elementów functions.phpspowoduje utratę wszystkich efektów przy zmianie motywów. function.phpsłuży wyłącznie do celów projektowych, użyj wtyczki!
David
@David, jasne, ale ppl, lepiej użyj folderu mu-plugins, zamiast tworzyć taką wtyczkę. Kiedy ppl potrzebuje / używa takiej funkcji, ma to z jakiegoś powodu i nie chce, aby ktokolwiek (nawet administrator) miał opcję dezaktywacji wtyczki.
Charles
Wygląda na to, że =w pierwszym wierszu kodu conf nginx brakuje znaku równości ( ). To zadziałało dla mnie: location = /xmlrpc.php {
Dave
6

Jeśli masz możliwość zablokowania go za pomocą konfiguracji serwera internetowego, sugestie @Charles są dobre.

Jeśli możesz go wyłączyć tylko za pomocą php, xmlrpc_enabledfiltr nie jest właściwy. Jak udokumentowano tutaj: https://developer.wordpress.org/reference/hooks/xmlrpc_enabled/ wyłącza tylko metody xml rpc wymagające uwierzytelnienia.

Zamiast tego użyj xmlrpc_methods filtra, aby wyłączyć wszystkie metody:

<?php
// Disable all xml-rpc endpoints
add_filter('xmlrpc_methods', function () {
    return [];
}, PHP_INT_MAX);

Możesz sprawdzić, czy działa, wysyłając żądanie POST do pliku xmlrpc.php z następującą treścią:

<methodCall>
    <methodName>system.listMethods</methodName>
</methodCall>

Jeśli filtr działa, powinny pozostać tylko 3 metody:

<?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>

możesz go szybko przetestować za pomocą 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
źródło
5

Używamy pliku htaccess, aby chronić go przed hakerami.

# BEGIN protect xmlrpc.php
<files xmlrpc.php>
order allow,deny
deny from all
</files>
# END protect xmlrpc.php
Jorin van Vilsteren
źródło
4

Najlepiej jest wyłączyć xmlrpc.php funkcje za pomocą wtyczki zamiast usuwać lub wyłączać sam plik. Sam plik zostanie zastąpiony przy podstawowych aktualizacjach WordPress, a wtyczka sprawi, że będzie wyłączony po podstawowych aktualizacjach i po zmianie motywów.

Zobacz https://wordpress.org/plugins/search.php?q=disable+xml-rpc dla różnych wtyczek. Wszystkie mają niewielkie różnice.

Wtyczki te działają tak samo, jak funkcja dodana do functions.phppliku motywu lub dodająca order,allow denyregułę do .htaccess (jak opisano w innych odpowiedziach), z tą różnicą, że wtyczka lub funkcja wyłącza wywołania xmlrpc.phpprzez PHP, a reguła w .htaccess działa poprzez wykorzystanie mod_rewrite na serwerze internetowym (tj. Apache lub Nginx). Nie ma znaczącej różnicy w wydajności między używaniem PHP i mod_rewrite na nowoczesnym serwerze.

markratledge
źródło
3

Dla skrajnej mniejszości, która hostuje WordPress w IIS, możesz użyć modułu Przepisz URL IIS, aby wprowadzić podobne ograniczenia podobne do htaccess. W poniższym przykładzie założono, że prawdziwy adres IP klienta przychodzi w nagłówku X-Forwarded-For, znany adres IP na białej liście to 55.55.555.555 i że użytkownik chce odpowiedzieć HTTP 404 na adresy IP niebędące białymi listami.

<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>
Mosiądz
źródło
0

W pierwszy sposób możesz wstawić kod add_filter('xmlrpc_enabled', '__return_false');do pliku functions.phplub wtyczki specyficznej dla strony. Wyraźne umieszczenie go w witrynie jest bardziej zalecane niż edycja pliku functions.php.

i inne sposoby na wyeliminowanie xmlrpc

Yaser Hamzeloy
źródło
0

Niedawno zainstalowałem Wordfence, który od wersji 6.3.12 ma możliwość blokowania bezpośredniego dostępu do dowolnej lokalizacji. Umieszczenie /xmlrpc.php na stronie Opcje na liście adresów IP zabronionego dostępu „Natychmiast blokuj adresy IP, które uzyskują dostęp do tych adresów URL” pokazuje teraz, że jedna próba jest blokowana co około 15 minut.

Ma to również tę zaletę, że może zablokować adres URL, aby uciec od tych brzydkich botów, które wracają z innym adresem IP raz za razem.

Nie wiem, czy zezwala na użycie pliku xmlrpc.php przez aplikacje do prawidłowych operacji.

Miałem pewne problemy z produkcją błędów 504 Limit czasu i 502 Bad Gateway na serwerze, ale wygląda na to, że ustąpił.

Jak na razie jestem pod dużym wrażeniem i stworzył on cenny profil czyszczenia po zhakowaniu witryny przed zainstalowaniem Wordfence i pomimo posiadania zawsze najnowszej wersji WordPress i wtyczek.

Wordfence https://www.wordfence.com/

Steve
źródło
Dodanie /xmlrpc.phpdo reguły bezpieczeństwa zakazującej dostępu do adresów IP wydaje się, że może blokować legalny ruch. Jeśli witryna z włączonymi linkami pingback do Twojej witryny, wyśle ​​żądanie do tego adresu URL i natychmiast zostanie zablokowane ... wygląda na to, że może to powodować problemy.
adam-asdf
0

używam dla Nginx tego małego kodu i działa w 100%

location ~* (/wp-content/.*\.php|/wp-includes/.*\.php|/xmlrpc\.php$|/(?:uploads|files)/.*\.php$) {
deny all;
access_log off;
log_not_found off;
return 444;
}
Manuel K.
źródło