Otevřete si svůj WordPress web v prohlížeči, k URL přidejte /xmlrpc.php a zmáčkněte enter. Pokud uvidíte "XML-RPC server accepts POST requests only.", gratulujeme, váš web vystavuje 21 let starý endpoint, přes který útočníci zesilují brute-force útoky, odhalují uživatelská jména a ve špatný den udělají z vašeho serveru reflektor pro útok na někoho jiného. Oprava je jeden řádek PHP. Projdeme si, co XML-RPC vůbec je, proč ho WordPress drží naživu, co konkrétně se dá pokazit a čtyři způsoby, jak ho vypnout, seřazené od nejjednoduššího po nejodolnější.
Co je XML-RPC, stručně
XML-RPC je protokol pro vzdálené volání procedur z roku 1998. Posílá XML payload přes HTTP, klient zavolá pojmenovanou funkci na serveru a dostane zpět strukturovanou odpověď. WordPress podporu XML-RPC nasadil v roce 2003, kdy alternativou bylo buď nahrávat PHP soubory přes FTP, nebo používat pomalé formuláře v administraci. Na svou dobu to bylo elegantní.
Pohánělo to tři velké věci: publikování z desktopových blog klientů jako Windows Live Writer, pingbacky a trackbacky mezi blogy a první funkce Jetpacku, díky kterým WordPress.com mluvil s self-hosted webem. Zhruba deset let bylo XML-RPC jediná oficiální cesta, jak software mimo wp-admin mohl číst nebo zapisovat obsah na váš web.
Pak v roce 2016 přišel WordPress 4.7 s REST API. REST API je rychlejší, ve výchozím stavu bezpečnější, používá standardní JSON, podporuje OAuth a aplikační hesla a mluví jím všechny moderní integrace. XML-RPC zůstává v jádře jen kvůli zpětné kompatibilitě, ale žádný aktivně udržovaný nástroj ho už nepotřebuje. Editor Gutenberg používá REST. Mobilní aplikace používají REST. Nové funkce Jetpacku používají REST.
Protokol zůstal stejně, jako zůstávají staré dálniční sjezdy: nikdo je nepoužívá záměrně, ale vytrhnout je úplně by rozbilo pár aut.
Proč je xmlrpc.php v roce 2026 problém
Endpoint https://vasweb.cz/xmlrpc.php je ve výchozím nastavení zapnutý na každé instalaci WordPressu. Je to jeden soubor v rootu webu. Smazat se nedá, další aktualizace jádra ho vrátí. Problém s tím, že je zapnutý, není teoretický, je to jeden z nejvíc napadaných souborů v celém ekosystému.
1. Zesilování brute-force. Metoda wp.getUsersBlogs přijímá uživatelské jméno a heslo jako parametry. Každý požadavek zkusí jeden pár přihlašovacích údajů a server odpoví ano nebo ne. Horší je, že metoda system.multicall umožňuje útočníkovi spojit stovky pokusů o přihlášení do jediného HTTP požadavku. Bot tak může vyzkoušet 500 hesel jedním requestem, projít naivními fail2ban pravidly a v access logu se ani neobjevit jako 500 záznamů. Viděli jsme klientské weby, kde xmlrpc.php sežralo víc datového provozu než homepage, a všechno byl brute-force.
2. Vyčítání uživatelských jmen. I když přihlášení selže, odpověď prozradí informaci. Pošlete na wp.getUsersBlogs hádaný login admin a libovolné heslo a chybový kód řekne, jestli uživatel admin existuje. Útočník má průzkum zdarma pro další fázi útoku.
3. Pingback DDoS reflexe. Metoda pingback.ping má jednomu blogu říct druhému "hele, odkázal jsem na tebe". Váš server stáhne URL, kterou volající zadá, aby ověřil odkaz. To znamená, že útočník může požádat tisíce WordPress webů, aby najednou udeřily do jedné cílové URL. Váš web se stane součástí distribuovaného denial-of-service útoku, aniž by se kdokoli dotkl wp-admin přihlášení. Akamai tento přesný vzorec ve velkém zdokumentoval před lety a nikam nezmizel.
4. SSRF a skenování interní sítě. Protože pingback nutí server stahovat libovolné URL, útočníci ho používají k prozkoumávání interních sítí, na které veřejný internet nedosáhne, věci typu http://192.168.0.1/admin nebo http://localhost:9200 pro instanci Elasticsearchu, kterou operátor zapomněl zamknout. Z WordPress serveru se stane proxy pro útočníka.
5. Útočná plocha pluginů. Pluginy se můžou na XML-RPC zaháknout a přidat vlastní metody. Každá přidaná metoda je další funkce vystavená na veřejném endpointu. Několik historických CVE u významných pluginů bylo zneužitelných právě proto, že bylo XML-RPC zapnuté.
Vypnutí XML-RPC zavře všech pět věcí jedním pohybem. Jediná cena je, že nemůžete pingovat ani trackbackovat jiné blogy, funkce, která je už tak dlouho otrávená spamem, že ji většina webů stejně vypnula.
Něco se rozbije, když to vypnu?
Pravděpodobně ne. Poctivý seznam věcí, které v roce 2026 ještě XML-RPC opravdu potřebují:
- První připojení Jetpacku u hodně starých instalací — moderní Jetpack používá REST, ale pokud připojujete web s velmi starou verzí Jetpacku, handshake to může pořád zkoušet přes XML-RPC. Nejdřív aktualizujte Jetpack.
- Hrstka starých desktopových blog klientů — Windows Live Writer, Open Live Writer, MarsEdit v některých verzích, drobné third-party aplikace. Pokud z jednoho z nich pořád publikujete, budete XML-RPC muset nechat zapnuté, nebo migrovat na WordPress admin či mobilní aplikaci postavenou na REST.
- Pingbacky a trackbacky — jejich vypnutí je pro většinu webů spíš výhoda než ztráta.
Pokud si nejste jistí, bezpečný postup je: udělejte zálohu, vypněte XML-RPC, používejte web týden normálně. Pokud se nic nepokazí, hotovo. Pokud konkrétní nástroj přestane fungovat, máte mnohem užší otázku, potřebuju ten nástroj, nebo potřebuju ten nástroj s XML-RPC.
Jednořádková oprava a tři silnější
Čtyři vrstvy, od nejslabší po nejsilnější. Použijte aspoň jednu. Pokud je web cílem útoku, použijte víc než jednu.
Metoda 1, PHP filtr (jednořádková oprava)
Otevřete wp-config.php, nebo ještě lépe malý mu-plugin soubor v wp-content/mu-plugins/, a přidejte:
add_filter( 'xmlrpc_enabled', '__return_false' );
A je to. __return_false je helper z jádra WordPressu. Filtr říká WordPressu, ať odmítá všechna XML-RPC volání. Požadavky na xmlrpc.php pořád dostanou odpověď, ale je to čisté "XML-RPC services are disabled on this site." místo spustitelné plochy.
Plus: žádné závislosti, přežije aktualizace jádra, dvě sekundy práce, snadno se vrací. Mínus: PHP se pořád musí spustit, aby tu zprávu o vypnutí vrátilo. Pokud do vás někdo buší, server pořád utrácí CPU na každý škodlivý požadavek.
Proč mu-plugin místo functions.php: šablony se mění, must-use pluginy ne. Bezpečnostní filtry v šabloně znamenají, že záměna šablony tichounce XML-RPC zase zapne. Dvouřádkový mu-plugin to přežije.
Metoda 2, blokovat na webserveru (nginx)
Do server nebo location bloku přidejte:
location = /xmlrpc.php {
deny all;
access_log off;
log_not_found off;
return 444;
}
Return 444 je nginx "zavři spojení bez odpovědi", což skenery odradí rychleji než čistá 403. Požadavky se k PHP vůbec nedostanou, CPU náklad je tedy nulový. Tohle nasazujeme na každý WordPress web, který hostujeme.
Metoda 3, blokovat na webserveru (Apache, .htaccess)
Pokud běžíte na Apachi, do .htaccess v rootu WordPressu přidejte před WordPress rewrite blok tohle:
<Files xmlrpc.php>
Require all denied
</Files>
Stejný výsledek jako nginx verze, požadavky se odmítají dřív, než se spustí PHP. Na starém Apachi 2.2 byste místo toho použili Order allow,deny / Deny from all, ale cokoli aktuálně podporovaného je na 2.4.
Metoda 4, allowlist, pokud to skutečně potřebujete
Pokud konkrétní služba musí volat xmlrpc.php, nenechávejte dveře otevřené celému internetu. V nginxu:
location = /xmlrpc.php {
allow 198.51.100.42;
deny all;
}
IP nahraďte tou skutečnou. Jetpack zveřejňuje rozsahy svých IP adres, pokud je to váš případ. Endpoint takhle existuje jen pro provoz, který jste odsouhlasili.
Jak ověřit, že to fakt zabralo
Tři rychlé kontroly z notebooku:
- Otevřete
https://vasweb.cz/xmlrpc.phpv prohlížeči. Mělo by se zobrazit buď prázdné 403/444 (blok na webserveru), nebo krátká XML zpráva o tom, že je XML-RPC vypnuté (PHP filtr). Pokud uvidíte "XML-RPC server accepts POST requests only.", endpoint pořád běží. - Z terminálu:
curl -d "<methodCall><methodName>system.listMethods</methodName></methodCall>" https://vasweb.cz/xmlrpc.php. S vypnutým XML-RPC dostanete prázdné pole nebo 403. Se zapnutým dostanete zpátky dlouhý seznam názvů metod včetněwp.getUsersBlogsapingback.ping. - Mrkněte na access log za posledních 24 hodin. Trefy na xmlrpc.php by měly spadnout ze "stovek až tisíců denně" na nulu nebo na samé 403/444. Pokud pořád vrací 200, blok je ve špatném souboru.
Když už jste v tom, čtyři další levné výhry pro WordPress
Pokud stejně editujete wp-config nebo .htaccess, tyhle pětiminutové dodatky stojí za to ve stejném sezení udělat. Širší předlaunchovou kontrolu rozebíráme v našem technickém SEO checklistu, ale konkrétně k bezpečnosti:
- Vypněte editaci souborů z administrace. Do wp-config.php přidejte
define( 'DISALLOW_FILE_EDIT', true );. Pokud útočník unese admin účet, nemůže si jen tak vlepit webshell do šablony. - Vynuťte SSL na administraci. V wp-config
define( 'FORCE_SSL_ADMIN', true );. Na kvalitním hostingu už zapnuté, ale ověřit se vyplatí. - Zablokujte enumeraci uživatelů přes WordPress REST API pro nepřihlášené požadavky.
?rest_route=/wp/v2/usersprozrazuje stejná uživatelská jména jako XML-RPC. Filtrujte to nebo omezte na přihlášené uživatele. - Přejmenujte nebo rate-limitujte
/wp-login.php. Buď na webserveru, nebo malou funkcí na zpevnění přihlášení. Kombinace vypnutého XML-RPC a rate-limitovaného wp-login.php zavře dvě hlavní brány pro brute-force.
Co bezpečnostní pluginy, které "vypínají XML-RPC"?
Wordfence, iThemes Security, Sucuri, All In One WP Security, každý větší bezpečnostní plugin pro to má přepínač. Všechny v podstatě dělají to, co Metoda 1, nastaví stejný filtr. Rozdíl je v režii. Plný bezpečnostní plugin natáhne při každém požadavku desítky tisíc řádků PHP, aby přepnul jeden boolean. Pokud chcete jen tohle, jednořádkový filtr to udělá bez pluginové daně. Pluginy se vyplatí, když chcete navíc firewall, sken malwaru, captchu na přihlášení a tak dále. Na samotné XML-RPC vyhrává filtr.
Tenhle vzorec se v ekosystému WordPressu opakuje a je to důvod, proč jsme psali o tom, kdy je WordPress správný nástroj a kdy ne: každá funkce je jeden plugin daleko, což dělá útočnou plochu obrovskou, pokud nedržíte disciplínu. U malých firem se ten samý kompromis vrací krok za krokem, jak jsme rozebrali v průvodci weby pro malé firmy.
Často kladené otázky
Ovlivní vypnutí XML-RPC SEO?
Ne. XML-RPC vyhledávače nečtou ani nepoužívají. Vypnutí odstraňuje jen útočnou plochu.
Přestane fungovat oficiální mobilní aplikace WordPressu?
Oficiální aplikace WordPress a Jetpack se dnes přihlašují přes REST API pomocí aplikačních hesel. Pokud máte aktuální verzi WordPressu a Jetpacku, obě aplikace s vypnutým XML-RPC fungují bez problému.
Co s pingbacky a trackbacky?
Zmizí. V praxi to skoro nikomu nevadí. Pingback notifikace jsou víc než deset let dominované spamem. Většina aktivních administrátorů WordPressu je už stejně vypla v Nastavení → Diskuse. Zavřením XML-RPC se to vynucuje důsledněji.
Co když XML-RPC blokuje už hosting?
Některé managed WordPress hostingy (Kinsta, WP Engine, SiteGround na vybraných tarifech) blokují xmlrpc.php na úrovni platformy. Otevřete si /xmlrpc.php na svém webu a uvidíte. Pokud uvidíte 403 nebo blok stránku s logem hostingu, hotovo. Doplnit PHP filtr navíc nevadí, je to neškodná redundance.
Dá se to udělat z administrace WordPressu bez sahání do kódu?
V jádře ne. WordPress vypínač XML-RPC v dashboardu nenabízí. Buď filtr přidáte, nebo upravíte konfiguraci webserveru, nebo nainstalujete plugin, jehož jediná práce je přepnout ten filtr za vás. Jednořádková změna kódu je daleko nejmenší a nejlehčí.
Mám multisite, něco jinak?
Stejná oprava, aplikovaná v rámci sítě. Filtr dejte do mu-pluginu aktivovaného pro celou síť (do wp-content/mu-plugins/) a pokryje všechny weby v síti bez aktivace per site.
Závěr
XML-RPC je protokol z roku 1998 udržovaný v jádře WordPressu kvůli zpětné kompatibilitě se softwarem, který už většinou neexistuje. V roce 2026 znamená nechat xmlrpc.php veřejné jedním souborem dát útočníkům zesilovač pro brute-force, věštkyni uživatelských jmen a DDoS reflektor. Vypnutí nestojí nic, skoro nic nerozbije a patří k bezpečnostním změnám s nejlepším poměrem výsledek/úsilí, jaké na WordPressu uděláte.
Pokud chcete, abychom existující WordPress web zpevnili, prošli vystavené endpointy, zamkli přihlášení, nastavili zálohy a opravdové staging prostředí, tak takhle přistupujeme k WordPress projektům. Ozvěte se a projdeme s vámi nejdřív aktuální stav webu, než cokoli začneme měnit.