XML-RPC – kiedy wykorzystać, a kiedy wyłączyć?
21-01-2024Dzisiaj porozmawiamy sobie o temacie dosyć kontrowersyjnym, a mianowicie o XML-RPC, czyli protokole, który większość osób od razu radzi wyłączać. Czy naprawdę mamy się czego obawiać?
Spis treści
Czym jest XML-RPC?
XML-RPC (XML – Extensible Markup Language, RPC – Remote Procedure Call) jest specjalnym protokołem WordPressa, który umożliwia łączenie się ze stroną opartą o WP, za pomocą XML. Dawniej funkcję tę trzeba było aktywować, jednak obecnie jest domyślnie włączona. W dużym skrócie – protokół ten umożliwia komunikację strony opartej o WordPress z aplikacją zewnętrzną. W większości przypadków, tego protokołu nigdy nie użyjesz, a niestety – zwiększa ryzyko ataku hakerskiego.
Pewnie przeglądając pliki WordPressa zwróciłeś uwagę na plik xmlrpc.php. To własnie on odpowiada za protokół XML-RPC. W dalszej części artykułu postaram się wyjaśnić, kiedy protokół ten może być przydatny, a kiedy warto go wyłączyć.
Jak sprawdzić, czy Twoja strona ma włączone XML-RPC?
Tutaj sprawa jest dosyć prosta. Najprościej będzie wejść na adres
https://exmaple.com/xmlrpc.php
W przypadku włączonego protokołu, powinieneś dostać mniej więcej taki komunikat
XML-RPC server accepts POST requests only.
W przypadku kiedy plik ten jest zablokowany, możesz dostać, np. error 403. Możesz też oczywiście skorzystać z zewnętrznego narzędzia, które znajdziesz tutaj.
Do czego jest wykorzystywany protokół XML-RPC i plik xmlrpc.php?
Pingback i trackback
Pingback to funkcja informująca, że ktoś dodał link do Twojego wpisu na swoim blogu. Istotne jest tutaj to, że informację tę uzyskasz wyłącznie jeśli oba blogi obsługują pingbacki. Czyli, np. stoją na WordPressie i nie blokują pliku xmlrpc.php.
Trackbacki są starszą wersją pingbacków, i w przeciwieństwie do nich nie są wysyłane automatycznie.
Pingbacki w praktyce
Po dodaniu linku do Twojego wpisu na innym blogu, dostaniesz powiadomienie w zakładce komentarze
Po zatwierdzeniu, taki pingback będzie widoczny pod Twoim wpisem
Pamiętaj, że żeby mechanizm pingback zadziałał, obie strony muszą korzystać z mechanizmu pingback i nie mogą blokować pliku xmlrpc.php
Automatyzacja WordPress
Wyobraź sobie, że tworzysz zaplecze SEO, albo masz pod opieką kilkadziesiąt stron opartych na WordPress. Dodawanie nowych wpisów, czy wprowadzanie innych poprawek na tylu stronach może być problematyczne i czasochłonne. Dlatego często szuka się automatyzacji w tym zakresie. Możesz, np. napisać skrypt w Pythonie, który będzie łączył się z API Chat GPT, będzie generował określone treści na stronę, a następnie będzie je publikował na wybranych blogach. Oczywiście tutaj nie kończą się możliwość zdalnego zarządzania Twoimi stronami. Równie dobrze możesz wydelegować automatyczną zmianę haseł użytkowników co określony czas, albo automatycznie tworzyć/usuwać konta pracowników na wielu stronach WP.
Jeśli natomiast często stawiasz kolejne strony na WordPress, które muszą mieć określoną konfigurację, to protokół ten także może okazać się niezwykle pomocny. Oszczędzi Ci masę czasu i nerwów.
Tak jak wspomniałem wcześniej – jeśli prowadzisz jednego bloga, prawdopodobnie taka funkcjonalność nie będzie dla Ciebie szczególnie użyteczna, i często lepszym (i szybszym) wyjściem będzie po prostu manualne wykonywanie tych czynności. W przypadku zarządzania wieloma różnymi blogami, taka automatyzacja może zaoszczędzić Ci dużo czasu. W dalszej części artykułu pokażę Wam przykłady tego typu automatyzacji.
Piszemy prosty skrypt w Pythonie
W naszym przykładzie użyjemy biblioteki python-wordpress-xmlrpc, którą należy zainstalować przed użyciem
pip3 install python-wordpress-xmlrpc
Zainstalowane? To teraz możemy przejść do naszego prostego przykładu. Załóżmy, że chcemy dodać nowy wpis na naszego bloga.
from wordpress_xmlrpc import Client, WordPressPost
from wordpress_xmlrpc.methods.posts import NewPost
url = "https://myblog.pl/xmlrpc.php" #adres Twojej strony
username = "login" #Twój login
password = "password" #Twoje hasło
# Inicjalizacja klienta XML-RPC
client = Client(url, username, password)
# Przykładowy wpis
new_post = WordPressPost()
new_post.title = "Tytuł nowego wpisu"
new_post.content = """
<h2>Przykładowy nagłówek</h2>
<p>Przykładowa treść. Możesz tutaj wpisać cokolwiek.</p>
<p>Treść możesz, np. generować przez Chat GTP i dodawać do wielu swoich blogów.</p>
"""
# Dodanie nowego wpisu
post_id = client.call(NewPost(new_post))
print(f"Wpis został dodany. ID: {post_id}")
Może kiedyś rozwinę ten temat. Na ten moment pokazuję ten kod tylko po to, żeby pokazać z czym to się je. Pamiętaj jednak, że jeśli korzystasz z WordFence (albo podobnego pluginu), to może on blokować działanie tego skryptu. Zdarza się tak, także, że WAF (Web Application Firewall), albo VPN, który masz uruchomiony na swoim komputerze też uniemożliwia poprawne działanie skryptu.
Inne metody zdalnego zarządzania wieloma stronami na WordPress
Popularny plugin WP Remote wykorzystuje własny protokół do wygodnego zarządzania wieloma stronami na WordPress. Możesz za jego pomocą, np. istalować pluginy do wielu stron z poziomu jednego panelu, ale o tym powiemy sobie przy innej okazji. Różnica pomiędzy tą metodą, a poprzednia polega na tym, że tutaj plik xmlrpc.php może być zablokowany, ponieważ omawiany plugin wykorzystuje własny protokół komunikacji.
Kiedy warto zablokować ten protokół?
Odpowiedź jest prosta – zawsze, kiedy z niego nie korzystasz na danej stronie, a doświadczenie mi mówi, że bardzo niewiele osób z niego korzysta. Niestety protokół ten niesie ze sobą określone ryzyko, np. ataku siłowego, lub słownikowego na stronę, w celu złamania hasła administratora. Bardzo rzadko próby złamania hasła następują przez panel logowania, ponieważ ta metoda jest zdecydowanie wolniejsza. A jeśli chcesz poznać więcej technik zabezpieczania strony na WP, to polecam mój artykuł zabezpieczanie WordPressa.
Blokujemy plik xmlrpc.php
Tutaj sprawa jest banalnie prosta. Wystarczy do pliku .htaccess w głównym katalogu strony dodać następującą regułę
<files xmlrpc.php>
order allow,deny
deny from all
</files>
Podsumowanie
Większość tekstów w polskim Internecie po macoszemu podchodzi do tego tematu. Chciałem, żeby mój wpis bardziej kompleksowo umawiał zdalny dostęp do WP za pomocą XML-RCP. Chciałem pokazać jego ewentualne zastosowanie, oraz ryzyko jakie jest z nim związane. Mimo wszystko uważam, że w przypadku większości blogów, spokojnie można z niego zrezygnować, zyskując tym samym nieco na bezpieczeństwie naszej strony.