XML-RPC to stary protokół WordPress standaryzujący komunikację pomiędzy różnymi systemami zewnętrznymi a samym WordPress. Miał za zadanie zezwalać na zarządzanie stroną poprzez inne platformy blogowe lub aplikacje. Sam protokół ma jednak swojego następcę w postaci REST API a plik xmlrpc.php zapewniający wdrożenie XML-RPC do WordPress ma swoje wady. W tym wpisie opowiem dokładniej jak wyłączyć XML-RPC w WordPress i tym samym podnieść bezpieczeństwo Twojej strony internetowej lub sklepu.
Czym jest plik xmlrpc.php
XML-RPC jako protokół komunikacji z WordPress został zaimplementowany w 2003 roku. Zaprojektowany został jednak dużo wcześniej. Wykorzystuje HTTP do przesyłu danych zakodowanych w XML. Kod źródłowy zapisany jest w pliku xmlrpc.php w katalogu głównym WordPress. I pomimo tego, że jest mocno przestarzały (ponad 20 lat) to nie został jeszcze usunięty z natywnych paczek instalacyjnych.
Co więcej, XML-RPC był początkowo domyślnie wyłączony. Dopiero od wersji WordPress 3.5 został domyślnie włączony przy każdej instalacji i tak pozostało do dziś. Wszystko po to, aby można było zarządzać WordPressem za pomocą dedykowanej aplikacji mobilnej. Tak WordPress ma również aplikację. Cała komunikacja odbywa się właśnie przy pomocy pliku xmlrpc.php.
Samo XML-RPC to nie tylko obsługa aplikacji mobilnej. Pozwala na komunikację z innymi platformami blogowymi zezwalając na trackbacki i pingbacki a także wspiera wtyczkę Jetpack do współpracy z serwisem wordpress.com. Ale od kiedy WordPress posiada wbudowany REST API, to używanie protokołu XML-RPC jest niepraktyczne. REST API oferuje większe bezpieczeństwo i dużo większą kompatybilność z innymi serwisami.
W związku z powyższym, warto abyś wyłączył nieużywany plik xmlrpc.php.
Dlaczego warto wyłączyć xmlrpc.php
Chodzi tu głównie o bezpieczeństwo. Protokół XML-RPC pozwala hakerom zdalnie bombardować WordPress tysiącami zapytań z kombinacjami loginów i haseł. To tzw. atak brute force. Służą do tego specjalne narzędzia, roboty atakujące setki stron jednocześnie. Roboty te po prostu zgadują wszystkie losowe kombinacje loginów i haseł. Jeśli masz przewidywalny login do zaplecza, np. admin oraz słabe hasło to prędzej czy później włamanie masz gwarantowane.
Bombardowanie pliku xmlrpc.php milionami zapytań to także świetny sposób na ataki typu DDoS. Charakteryzują się tak dużym ruchem na stronie i ilością zapytań do bazy danych, że serwer nie nadąża odpowiadać i strona przechodzi w tryb offline.
Różne oprogramowania potrafią w bardzo prosty sposób sprawdzić, czy Twój WordPress posiada włączony XML-RPC. Jeśli tak jest, zaczynają atak.
Jak wyłączyć XML-RPC w WordPress?
Sposobów wyłączenia XML-RPC jest kilka: modyfikując plik .htaccess, functions.php lub za pomocą wtyczki. Sprawdźmy po kolei:
Wyłącz XML-RPC za pomocą .htaccess
Jeśli posiadasz stronę na typowym hostingu Apache (większość hostingów współdzielonych w Polsce), to zmodyfikuj plik .htaccess w katalogu głównym WordPress. Po prostu wklej poniższy kod na początku pliku i zapisz zmiany.
<Files xmlrpc.php>
Order Allow,Deny
Deny from all
</Files>
Wyłącz XML-RPC za pomocą filtra
Jeśli posiadasz motyw potomny (Child Theme), to w pliku functions.php dopisz jedną linijkę z następującym filtrem:
add_filter( 'xmlrpc_enabled', '__return_false' );
Wyłącz XML-RPC za pomocą własnej wtyczki
Jeszcze lepszym rozwiązaniem jest napisanie własnej wtyczki. O tym jak napisać wtyczkę również napisałem artykuł na blogu. To naprawdę bardzo proste. Po prostu wklej tam taki sam kod. Plusem własnej wtyczki, jest to, że możesz tam umieścić więcej przydatnego kodu.
add_filter( 'xmlrpc_enabled', '__return_false' );
Wyłącz XML-RPC za pomocą snipetu
Jeśli nie chcesz tworzyć własnej wtyczki ani modyfikować functions.php to zawsze możesz stworzyć nowy snipet. Użyj do tego dowolnej wtyczki z repozytorium WordPress. Ja niezmiennie polecam Code Snippets.
Wyłącz XML-RPC za pomocą wtyczki z repozytorium
Ostatecznie możesz zajrzeć do darmowego repozytorium WordPress w poszukiwaniu darmowej wtyczki napisanej przez kogoś innego. Z pewnością znajdziesz więcej niż jedną 😉
Dlaczego XML-RPC nie został jeszcze usunięty z WordPress?
Skoro przestarzały XML-RPC jest taki zły, to dlaczego jeszcze go nie usunięto z WordPress? Odpowiedź jest banalna: chodzi o kompatybilność wsteczną. Część starych, zewnętrznych systemów zdalnego zarządzania WordPress nie wspiera jeszcze REST API, więc musi komunikować się za pomocą xmlrpc.php. Choć w mojej ocenie XML-RPC powinno zostać usunięte lub co najmniej domyślnie wyłączone w nowych instalacjach. Dlaczego tak nie jest? Nie wiem. Ale zdaje mi się, że jeśli ktoś będzie chciał włączyć XML-RPC w swoim WordPress to sobie włączy. Nie ma potrzeby narażać miliony stron (i tysiące nowych powstających codziennie) na niepotrzebne ataki tylko dla garstki użytkowników starych rozwiązań. A Ty co myślisz na ten temat? Masz jeszcze jakieś propozycje jak wyłączyć XML-RPC? Czy powinien zostać domyślnie włączony?