15%

Zaoszczędź 15% na wszystkich usługach hostingowych

Sprawdź swoje umiejętności i zdobądź Rabat na dowolny plan hostingowy

Użyj kodu:

Skills
Rozpocznij
10.10.2024

Jak włączyć i wyłączyć xmlrpc.php w WordPress (i dlaczego ma to znaczenie)

Plik xmlrpc.php jest podstawowym komponentem WordPress, który udostępnia punkt końcowy API XML-RPC, umożliwiając zdalnym aplikacjom uwierzytelnianie i wykonywanie operacji po stronie serwera — publikowanie wpisów, zarządzanie komentarzami, wyzwalanie pingbacków i wiele więcej. Ponieważ domyślnie akceptuje nieuwierzytelnione żądania POST i przetwarza je przed aktywacją większości warstw zabezpieczeń, jest jedną z najczęściej wykorzystywanych powierzchni ataku w każdej instalacji WordPress.

Jeśli nie korzystasz z aplikacji mobilnej WordPress, Jetpack ani żadnej usługi zewnętrznej, która jawnie wymaga XML-RPC, wyłączenie xmlrpc.php jest właściwą domyślną postawą bezpieczeństwa. Jeśli polegasz na tych integracjach, możesz wzmocnić punkt końcowy zamiast całkowicie go usuwać.

Czym jest xmlrpc.php i jak działa

XML-RPC (Extensible Markup Language Remote Procedure Call) to protokół, który koduje wywołania funkcji w XML i przesyła je przez HTTP. WordPress dostarcza pełny serwer XML-RPC od wersji 3.5, zaimplementowany w pliku xmlrpc.php znajdującym się w głównym katalogu WordPress.

Gdy zdalny klient — aplikacja mobilna, desktopowy klient do blogowania lub skrypt automatyzacji — wysyła żądanie POST do https://yourdomain.com/xmlrpc.php, WordPress analizuje ładunek XML, uwierzytelnia dane uwierzytelniające osadzone w treści żądania i wykonuje żądaną metodę. Cała wymiana odbywa się w jednym cyklu HTTP, co jest zarówno jego zaletą, jak i podstawową słabością z punktu widzenia bezpieczeństwa.

Podstawowe metody XML-RPC udostępniane przez WordPress

  • wp.newPost / wp.editPost — zdalne tworzenie i aktualizowanie wpisów
  • wp.getComments / wp.deleteComment — zarządzanie komentarzami
  • wp.uploadFile — przesyłanie multimediów na serwer
  • pingback.ping — powiadamianie zdalnej witryny o linku do niej
  • system.multicall — grupowanie wielu wywołań metod w jednym żądaniu HTTP

Metoda system.multicall jest szczególnie niebezpieczna. Pojedyncze żądanie HTTP może zawierać setki wywołań wp.getUsersBlogs, z których każde testuje inne hasło. Pozwala to atakującemu przeprowadzić tysiące prób uwierzytelnienia, generując tylko jeden wpis w dzienniku serwera, omijając narzędzia ograniczające liczbę żądań, które zliczają pojedyncze żądania.

Zagrożenia bezpieczeństwa związane z pozostawieniem włączonego xmlrpc.php

Amplifikacja ataków brute force przez system.multicall

Tradycyjne ataki brute force wysyłają jedną parę danych uwierzytelniających na żądanie HTTP. Dzięki XML-RPC atakujący pakuje 500 prób logowania w jeden ładunek system.multicall. Standardowa reguła fail2ban lub licznik prób logowania widzi jedno żądanie; atakujący otrzymuje 500 prób. To nie jest ryzyko teoretyczne — jest to najczęściej obserwowany exploit XML-RPC w praktyce.

DDoS amplifikowany przez pingback

WordPress automatycznie przetwarza przychodzące żądania pingback przez xmlrpc.php. Atakujący może wysłać spreparowane żądanie pingback.ping do tysięcy witryn WordPress, instruując każdą z nich, aby wysłała żądanie HTTP do jednego docelowego adresu URL ofiary. Ofiara otrzymuje masową falę żądań pochodzących z legalnych serwerów WordPress, co sprawia, że blokowanie oparte na IP jest nieskuteczne. Twój serwer jednocześnie staje się ofiarą (wyczerpanie zasobów) i mimowolnym wzmacniaczem ataku.

SSRF przez pingback

Mechanizm pingback może być nadużywany do ataku Server-Side Request Forgery (SSRF). Atakujący wysyła żądanie pingback.ping, w którym źródłowy adres URL wskazuje na zasób sieci wewnętrznej — na przykład http://192.168.1.1/admin. Serwer WordPress pobiera ten adres URL z wnętrza obwodu sieciowego, potencjalnie ujawniając wewnętrzne usługi, które nie są publicznie dostępne.

Ujawnienie danych uwierzytelniających podczas transmisji

XML-RPC przesyła dane uwierzytelniające w treści POST jako zwykły tekst w kopercie XML. Jeśli Twoja witryna nie wymusza HTTPS, dane uwierzytelniające są widoczne dla każdego obserwatora sieci. Nawet przy TLS dane uwierzytelniające są osadzone w każdym pojedynczym żądaniu — nie ma tokenu sesji ani przepływu OAuth, który ograniczałby okno ekspozycji.

Kiedy należy pozostawić włączony xmlrpc.php

Wyłącz go domyślnie, ale pozostaw włączony, jeśli Twój przepływ pracy rzeczywiście zależy od któregokolwiek z poniższych:

  • Aplikacja mobilna WordPress (iOS/Android): Oficjalna aplikacja używa XML-RPC do wszystkich operacji zarządzania witryną na samodzielnie hostowanych instalacjach WordPress.
  • Wtyczka Jetpack: Kilka modułów Jetpack — w tym publicize, mobilne powiadomienia push i niektóre funkcje statystyk — komunikuje się przez XML-RPC z serwerami WordPress.com.
  • Desktopowe klienty do blogowania: MarsEdit, Windows Live Writer i podobne narzędzia opierają się wyłącznie na API XML-RPC.
  • Zautomatyzowane potoki publikowania: IFTTT, Zapier i niestandardowe skrypty przesyłające treści do WordPress często używają XML-RPC, gdy REST API nie jest skonfigurowane.
  • Pingbacki/trackbacki między witrynami WordPress: Jeśli powiadomienia pingback między witrynami są częścią Twojego przepływu pracy redakcyjnej, wyłączenie xmlrpc.php je wycisza.

Jeśli żadne z powyższych nie ma zastosowania, nie ma operacyjnego powodu, aby pozostawiać punkt końcowy otwarty.

xmlrpc.php a WordPress REST API

WordPress wprowadził REST API w wersji 4.7 jako nowoczesny, oparty na tokenach zamiennik dla XML-RPC. Zrozumienie różnic pomaga zdecydować, czy wyłączenie XML-RPC nie zepsuje czegoś krytycznego.

Funkcjaxmlrpc.phpWordPress REST API
UwierzytelnianieNazwa użytkownika + hasło w każdym żądaniuHasła aplikacji, OAuth, JWT
TransportTylko HTTP POSTHTTP GET, POST, PUT, PATCH, DELETE
Format ładunkuXMLJSON
WprowadzonoWordPress 1.5 (2005)WordPress 4.7 (2016)
Ryzyko brute forceWysokie (system.multicall)Niższe (na żądanie, z możliwością ograniczania)
SSRF przez pingbackTakNie
Obsługa aplikacji mobilnejTak (starsze)Tak (aktualne)
Zależność JetpackCzęściowaCzęściowa
Szczegółowe zakresy uprawnieńNieTak (hasła aplikacji)
Zalecane dla nowych integracjiNieTak

Jeśli budujesz nową integrację lub migrujesz istniejącą, użyj REST API. Model uwierzytelniania jest znacznie bezpieczniejszy, a punkt końcowy jest znacznie łatwiejszy do audytu i ograniczania na poziomie infrastruktury.

Jak wyłączyć xmlrpc.php w WordPress

Wybierz metodę odpowiadającą Twojemu poziomowi dostępu do serwera i tolerancji ryzyka. Metody są uporządkowane od najniższego do najwyższego poziomu egzekwowania na poziomie serwera.

Metoda 1: Wyłączenie przez wtyczkę (najszybsza, nie wymaga dostępu do serwera)

W przypadku środowisk hostingu współdzielonego lub witryn, w których wolisz nie edytować plików konfiguracyjnych serwera, wtyczka jest najbardziej dostępną opcją.

Zalecane wtyczki:

  • Disable XML-RPC-API — jednozadaniowa, minimalna, aktywuje się natychmiast
  • All In One WP Security and Firewall — szerszy pakiet bezpieczeństwa z szczegółowymi kontrolami XML-RPC

Kroki dla Disable XML-RPC-API:

  1. Przejdź do Wtyczki > Dodaj nową w panelu WordPress.
  2. Wyszukaj „Disable XML-RPC-API” i kliknij Zainstaluj teraz, a następnie Aktywuj.
  3. Nie jest wymagana żadna dalsza konfiguracja — wtyczka podłącza się do xmlrpc_enabled i natychmiast zwraca false po aktywacji.

Kroki dla All In One WP Security and Firewall:

  1. Po aktywacji wtyczki przejdź do WP Security > Firewall.
  2. Znajdź sekcję XML-RPC.
  3. Włącz opcję całkowitego blokowania żądań XML-RPC.
  4. Zapisz ustawienia.

Ograniczenie: Blokowanie oparte na wtyczkach uruchamia się w kontekście wykonania PHP WordPress. Serwer nadal uruchamia PHP, ładuje WordPress i przetwarza żądanie przed jego odrzuceniem. Podczas intensywnego ataku zużywa to CPU i pamięć. W przypadku witryn o dużym ruchu pod aktywnym atakiem użyj zamiast tego metody .htaccess lub Nginx.

Metoda 2: Wyłączenie przez .htaccess (Apache — blokada na poziomie serwera)

Blokowanie na poziomie .htaccess zapobiega całkowicie wykonaniu PHP dla żądań kierowanych do xmlrpc.php. Jest to znacznie wydajniejsze pod obciążeniem.

  1. Połącz się z serwerem przez FTP, SFTP lub menedżer plików hostingu i otwórz plik .htaccess w głównym katalogu WordPress (zazwyczaj public_html/.htaccess).
  2. Dodaj następujący blok. Umieść go przed standardowymi regułami przepisywania WordPress:
# Block all access to xmlrpc.php
<Files "xmlrpc.php">
    Order Deny,Allow
    Deny from all
</Files>
  1. Zapisz plik.

Aby zweryfikować, czy blokada jest aktywna, uruchom test z lokalnego komputera:

curl -s -o /dev/null -w "%{http_code}" -X POST https://yourdomain.com/xmlrpc.php

Powinieneś otrzymać odpowiedź 403. Odpowiedź 200 lub 405 oznacza, że blokada jeszcze nie działa.

Przypadek brzegowy — jeśli nadal potrzebujesz pingbacków z określonych zaufanych adresów IP, możesz je umieścić na białej liście:

<Files "xmlrpc.php">
    Order Deny,Allow
    Deny from all
    Allow from 192.0.2.10
</Files>

Metoda 3: Wyłączenie przez konfigurację Nginx

Jeśli Twój serwer działa na Nginx (powszechne w środowiskach VPS Hosting), pliki .htaccess nie mają żadnego efektu. Dodaj blok bezpośrednio do konfiguracji bloku serwera Twojej witryny.

# Block xmlrpc.php at the Nginx level
location = /xmlrpc.php {
    deny all;
    access_log off;
    log_not_found off;
    return 444;
}

Dyrektywa return 444 zamyka połączenie TCP bez wysyłania odpowiedzi HTTP, co jest bardziej wydajne niż 403, ponieważ uniemożliwia klientowi atakującego otrzymanie jakiejkolwiek informacji zwrotnej. Po edycji przeładuj Nginx:

sudo nginx -t && sudo systemctl reload nginx

Umieść ten blok location wewnątrz bloku server {}, przed jakimikolwiek dyrektywami try_files lub przetwarzania PHP.

Metoda 4: Wyłączenie przez functions.php (filtr hooków WordPress)

Ta metoda używa filtra WordPress do wyłączenia XML-RPC na warstwie aplikacji. Jest mniej wydajna niż blokowanie na poziomie serwera, ale przydatna, gdy nie masz bezpośredniego dostępu do serwera i chcesz rozwiązania opartego na kodzie bez zależności od wtyczki.

  1. Przejdź do Wygląd > Edytor motywu w panelu WordPress lub uzyskaj dostęp do pliku bezpośrednio przez SFTP pod adresem wp-content/themes/your-theme/functions.php.
  2. Dodaj następujący kod na końcu pliku:
// Disable XML-RPC completely
add_filter( 'xmlrpc_enabled', '__return_false' );
  1. Zapisz plik.

Ważne zastrzeżenie: Ten filtr wyłącza uwierzytelnione metody XML-RPC, ale nie blokuje metody pingback.ping ani nie uniemożliwia dostępu do pliku. Serwer nadal przetwarza żądanie do momentu, gdy WordPress oceni filtr. Aby uzyskać pełną ochronę, połącz to z blokiem .htaccess lub Nginx.

Jeśli używasz motywu podrzędnego, zawsze dodawaj niestandardowy kod do functions.php motywu podrzędnego, a nie motywu nadrzędnego. Aktualizacje motywu nadrzędnego nadpiszą Twoje zmiany.

Metoda 5: Selektywne wyłączenie — blokowanie tylko pingbacków

Jeśli potrzebujesz XML-RPC dla Jetpack lub mobilnego publikowania, ale chcesz wyeliminować wektor amplifikacji DDoS, możesz wyłączyć tylko metodę pingback, zachowując resztę funkcjonalności API.

// Disable only the pingback method, keep XML-RPC otherwise functional
add_filter( 'xmlrpc_methods', function( $methods ) {
    unset( $methods['pingback.ping'] );
    unset( $methods['pingback.extensions.getPingbacks'] );
    return $methods;
} );

Dodaj to do functions.php motywu podrzędnego lub wtyczki specyficznej dla witryny. Jest to zalecana konfiguracja dla witryn korzystających z Jetpack, które nie muszą odbierać pingbacków.

Jak ponownie włączyć xmlrpc.php

Cofnięcie którejkolwiek z powyższych metod przywraca dostęp do XML-RPC:

  • Metoda wtyczki: Dezaktywuj lub usuń wtyczkę blokującą z Wtyczki > Zainstalowane wtyczki.
  • Metoda .htaccess: Usuń blok <Files "xmlrpc.php"> z .htaccess i zapisz.
  • Metoda Nginx: Usuń blok location = /xmlrpc.php z konfiguracji serwera i przeładuj Nginx poleceniem sudo systemctl reload nginx.
  • Metoda functions.php: Usuń linię add_filter( 'xmlrpc_enabled', '__return_false' ) i zapisz.

Po ponownym włączeniu sprawdź, czy punkt końcowy odpowiada poprawnie:

curl -s -X POST https://yourdomain.com/xmlrpc.php 
  -H "Content-Type: text/xml" 
  --data '<?xml version="1.0"?><methodCall><methodName>system.listMethods</methodName><params></params></methodCall>'

Prawidłowa odpowiedź XML zawierająca listę dostępnych metod potwierdza, że punkt końcowy jest aktywny.

Wzmacnianie xmlrpc.php bez jego wyłączania

Jeśli wyłączenie nie jest opcją, zastosuj te środki zaradcze, aby zmniejszyć powierzchnię ataku:

Wymuszaj HTTPS: Upewnij się, że Twoja witryna używa ważnego certyfikatu TLS. Jeśli jeszcze tego nie zrobiłeś, skonfiguruj go przez swojego dostawcę hostingu — Certyfikaty SSL zapobiegają przechwytywaniu danych uwierzytelniających podczas transmisji.

Ogranicz liczbę żądań na poziomie zapory lub CDN: Skonfiguruj WAF (Cloudflare, ModSecurity), aby ograniczyć żądania POST do xmlrpc.php do maksymalnie 5–10 na minutę na IP.

Zablokuj system.multicall konkretnie:

add_filter( 'xmlrpc_methods', function( $methods ) {
    unset( $methods['system.multicall'] );
    return $methods;
} );

Eliminuje to wektor amplifikacji brute force, zachowując całą pozostałą funkcjonalność XML-RPC.

Ogranicz dostęp według IP: Jeśli uzyskujesz dostęp do XML-RPC tylko ze znanych adresów IP (zakres IP operatora Twojej aplikacji mobilnej lub statyczny adres IP biura), umieść te adresy na białej liście w .htaccess lub Nginx i odmów wszystkim pozostałym.

Monitoruj dzienniki dostępu: Regularnie audytuj dzienniki serwera pod kątem powtarzających się żądań POST do xmlrpc.php. Nagły wzrost żądań POST ze statusem 200 do tego pliku jest wiarygodnym wskaźnikiem trwającej kampanii brute force.

Na VPS z cPanel lub innym środowisku zarządzanego panelu możesz konfigurować reguły ModSecurity bezpośrednio z panelu sterowania, aby egzekwować te ograniczenia bez ręcznej edycji plików.

Wybór właściwej metody: macierz decyzyjna

Twoja sytuacjaZalecana metoda
Hosting współdzielony, brak dostępu do serweraWtyczka (Disable XML-RPC-API)
Serwer Apache, pełny dostęp do plikówBlok .htaccess
Serwer Nginx (VPS/Dedykowany)Blok lokalizacji Nginx
Potrzebujesz Jetpack, ale nie pingbackówSelektywny filtr w functions.php
Potrzebujesz pełnego XML-RPC (aplikacja mobilna)Wzmocnienie z ograniczaniem żądań + blokowanie system.multicall
Pod aktywnym atakiem brute forceNginx `return 444` + reguła zapory serwera
Zarządzany WordPress na VPS z cPanelReguła ModSecurity przez WAF cPanel

W przypadku witryn produkcyjnych hostowanych na Serwerach Dedykowanych, blokada na poziomie serwera Nginx lub Apache jest zawsze lepsza od rozwiązania opartego na wtyczce, ponieważ całkowicie zapobiega wykonaniu PHP dla złośliwych żądań, eliminując obciążenie CPU, które blokowanie oparte na wtyczkach powoduje podczas trwałego ataku.

Praktyczna lista kontrolna kluczowych wniosków

  • Sprawdź, czy jakakolwiek aktywna wtyczka lub usługa w Twoim środowisku rzeczywiście wymaga XML-RPC przed jego wyłączeniem — sprawdź Jetpack, aplikacje mobilne i wszelkie narzędzia automatyzacji publikowania.
  • Jeśli nie istnieje żadna zależność, zastosuj blokadę na poziomie serwera (.htaccess lub Nginx) zamiast wtyczki — jest bardziej wydajna i przeżywa dezaktywację wtyczki.
  • Jeśli musisz zachować aktywny XML-RPC, bezwarunkowo usuń system.multicall i pingback.ping przez filtr xmlrpc_methods — te dwie metody odpowiadają za zdecydowaną większość nadużyć XML-RPC.
  • Zawsze wymuszaj HTTPS na każdej witrynie WordPress, która akceptuje uwierzytelnione żądania, w tym XML-RPC.
  • Po zastosowaniu jakiejkolwiek blokady sprawdź za pomocą curl, czy punkt końcowy zwraca 403 lub przerywa połączenie — nie zakładaj, że konfiguracja jest poprawna bez testowania.
  • W środowiskach VPS lub serwerów dedykowanych opartych na Nginx używaj return 444 zamiast deny all, aby uniknąć przekazywania atakującym jakichkolwiek informacji zwrotnych na poziomie HTTP.
  • Rejestruj i monitoruj żądania POST do xmlrpc.php — nagły wzrost jest wczesnym ostrzeżeniem o kampanii credential stuffing lub amplifikacji DDoS.
  • Jeśli zarządzasz wieloma witrynami WordPress, rozważ centralizację tej konfiguracji na poziomie serwera lub CDN zamiast stosowania reguł wtyczek dla każdej witryny osobno.

W przypadku witryn wymagających solidnego zdalnego zarządzania bez powierzchni ryzyka XML-RPC, migracja integracji do WordPress REST API z hasłami aplikacji jest właściwą długoterminową ścieżką. REST API zapewnia odwoływanie tokenów, uprawnienia o ograniczonym zakresie i standardową semantykę HTTP, które są znacznie łatwiejsze do zabezpieczenia i audytu.

Jeśli konfigurujesz nowe środowisko WordPress i chcesz mieć czystą, bezpieczną podstawę od samego początku, Panele sterowania VPS ze wstępnie skonfigurowanym ModSecurity zapewniają ochronę WAF na poziomie serwera bez konieczności ręcznego tworzenia reguł.

Często zadawane pytania

Czy wyłączenie xmlrpc.php psuje WordPress REST API?

Nie. REST API (/wp-json/) to całkowicie oddzielny punkt końcowy z własnym uwierzytelnianiem i routingiem. Blokowanie xmlrpc.php nie ma żadnego wpływu na funkcjonalność REST API. Oba systemy są architektonicznie niezależne.

Czy wyłączenie xmlrpc.php zepsuje Jetpack?

To zależy od tego, których modułów Jetpack używasz. Jetpack stopniowo migruje funkcje do REST API, ale niektóre starsze moduły — w tym niektóre funkcje publicize i powiadomień — nadal komunikują się przez XML-RPC. Sprawdź stronę debugowania Jetpack pod adresem Jetpack > Panel > Debug, aby zobaczyć, czy łączność XML-RPC jest wymieniona jako wymaganie przed jego wyłączeniem.

Która metoda jest bezpieczniejsza — .htaccess czy functions.php?

Metoda .htaccess jest znacznie bezpieczniejsza w warunkach ataku. Blokuje żądanie na warstwie serwera WWW przed załadowaniem PHP, zużywając minimalne zasoby. Filtr functions.php uruchamia się w kontekście wykonania PHP WordPress, co oznacza, że serwer nadal uruchamia WordPress dla każdego zablokowanego żądania — co jest kosztowne podczas ataku o dużym natężeniu.

Czy atakujący może nadal wykorzystać xmlrpc.php, jeśli wyłączę go tylko przez filtr WordPress?

Częściowo. Filtr xmlrpc_enabled zapobiega uwierzytelnionym wywołaniom metod, ale plik pozostaje publicznie dostępny, a serwer nadal przetwarza przychodzące żądania. Punkt końcowy pingback może pozostać częściowo funkcjonalny w zależności od wersji WordPress. Aby uzyskać pełną ochronę, połącz filtr z blokadą na poziomie serwera.

Jak sprawdzić, czy xmlrpc.php jest obecnie dostępny w mojej witrynie?

Uruchom następujące polecenie z lokalnego terminala, zastępując domenę własną:

curl -s -o /dev/null -w "%{http_code}" -X POST https://yourdomain.com/xmlrpc.php

Odpowiedź 200 oznacza, że punkt końcowy jest otwarty. Odpowiedź 403 lub przerwanie połączenia (000) potwierdza, że jest zablokowany. Możesz również użyć narzędzia online na xmlrpc.eritreo.it, aby przetestować konkretnie podatność na pingback.

15%

Zaoszczędź 15% na wszystkich usługach hostingowych

Sprawdź swoje umiejętności i zdobądź Rabat na dowolny plan hostingowy

Użyj kodu:

Skills
Rozpocznij