WPFormationWordPress, rien que du WordPress
Formation WordPress + IA
IA & Claude Code · Qualiopi · OPCO
Je me forme
xmlrpc.php sur WordPress : 0,11 % des requêtes reçues par le serveur, 39 fois moins que wp-login.php
Sécurité WordPress

xmlrpc.php : faut-il le désactiver sur WordPress ?

Par Fabrice Ducarme··Mis à jour le ·27 min de lecture
Résumé de l'article

Désactiver xmlrpc.php sur WordPress se décide après avoir regardé qui s’en sert. Si rien ne s’en sert, fermez-le au niveau du serveur, car le filtre xmlrpc_enabled laisse le fichier répondre ; si Jetpack, l’application mobile ou IFTTT en dépendent, gardez-le et verrouillez-le. Sur mon serveur, en 14 jours, il a pesé 0,11 % des requêtes, 39 fois moins que wp-login.php.

Pas le temps ? Faites-le analyser par l'IA

Vous me lisez souvent ? Dites-le à Google

J'ajoute WPFormation à mes sources

0,11 %. Voilà ce que pèse xmlrpc.php dans les journaux de mon serveur : une requête sur 940, mesurée sur 14 jours, du 16 au 29 septembre 2026. Sur la même période, wp-login.php en a reçu 39 fois plus.

Et pourtant, partout, la consigne est la même : désactivez XML-RPC, cette porte ouverte aux pirates. Le conseil part d’un bon sentiment. Il a un peu vieilli, surtout… et presque personne ne vous dit comment fermer ce fichier pour de bon.

Mon propre site en a fait la démonstration. Le réglage que tout le monde recopie ne ferme pas xmlrpc.php : il en coupe une partie, WordPress continue de répondre, et quatre audits de sécurité de suite ont lu cette réponse de quatre façons différentes.

xmlrpc.php, c’est quoi ?

xmlrpc.php est le fichier de WordPress qui reçoit les appels XML-RPC : des requêtes web (HTTP) de type POST, écrites en XML (un format de texte à balises), par lesquelles un logiciel extérieur demande au site de publier un article, d’envoyer une image ou d’enregistrer un rétrolien. Il est posé à la racine de chaque installation et activé d’office depuis WordPress 3.5.

La spécification du protocole, signée Dave Winer et datée du 15 juin 1999, définit un message XML-RPC comme une requête HTTP POST dont le corps est en XML.

Dans WordPress, il est là depuis très longtemps. La classe qui sert ces appels porte la mention "depuis la 1.5.0", une version annoncée le 17 février 2005. Vous lirez souvent que WordPress l’embarque "depuis 2012" : 2012 est seulement l’année où il a été réactivé par défaut.

Publication distante désactivée en 2008, réactivée par défaut en 2012

En juillet 2008, WordPress 2.6 désactive la publication distante par défaut. Le billet de sortie parle d’une publication à distance désormais "secure (off) by default", avec une option pour la rallumer.

Le 11 décembre 2012, WordPress 3.5 fait le chemin inverse. XML-RPC est activé par défaut et l’option disparaît de l’écran Réglages > Écriture. Le même changement crée un filtre pour ceux qui voudraient encore le couper, xmlrpc_enabled. Retenez ce nom, il va nous occuper un moment…

L’API REST, l’interface plus récente par laquelle un logiciel dialogue avec WordPress, entre dans le cœur en deux temps, avec la 4.4 (décembre 2015) puis la 4.7 (décembre 2016). Elle n’a pas remplacé XML-RPC pour autant. Les deux cohabitent, et les mots de passe d’application arrivés avec la 5.6 (décembre 2020) sont acceptés par l’une comme par l’autre.

Frise XML-RPC et WordPress, de la spécification de 1999 à WordPress 7.1 en 2026
De la spécification XML-RPC de 1999 à WordPress 7.1 en 2026.

Ce que le fichier charge à chaque appel

Ouvrez le fichier, dans sa version 7.1.2 : 106 lignes. Il déclare la requête comme un appel XML-RPC, jette les cookies, puis charge WordPress en entier, extensions comprises.

La main passe ensuite à une classe de plus de 7 000 lignes, qui déclare 77 méthodes : 50 propres à WordPress, les autres héritées des API Blogger, MetaWeblog et Movable Type ou dédiées aux rétroliens et aux tests. Trois méthodes system.* s’y ajoutent, dont une certaine system.multicall.

Et WordPress annonce lui-même l’adresse du fichier, par défaut, avec une balise EditURI dans l’en-tête de vos pages. Les robots n’ont même pas à deviner.

Qui se sert encore de xmlrpc.php aujourd’hui ?

La réponse a bougé en 2026. J’ai donc fait relire, fin septembre, les pages d’aide et les notes de version de chacun. Voici l’état des lieux, source par source.

QuiA besoin de xmlrpc.php ?Ce que dit la source
JetpackOuiXML-RPC relie le site à WordPress.com ; bloquer le fichier casse la connexion
Application WordPress pour iOSPlus obligatoireFonctionne sans XML-RPC depuis la 26.7 (mars 2026), avec des fonctions limitées
Application WordPress pour AndroidNon documentéLes notes de version ne disent rien de XML-RPC
ZapierNonLa page, mise à jour le 1er octobre 2026, demande l’extension Zapier for WordPress, qui passe par l’API REST
IFTTTOuiAccès au fichier exigé à la connexion, puis à chaque exécution
MarsEditOuiCe logiciel de publication parle à WordPress par xmlrpc.php
Rétroliens reçus (pingbacks)OuiIls arrivent par la méthode pingback.ping
D’après la documentation de chaque service, vérifiée le 7 octobre 2026.

L’application mobile hésite, Jetpack non

On vous dira ici que l’application mobile a besoin de XML-RPC, là qu’elle s’en passe. Les deux sont datés. Sur iOS, elle se connecte par mot de passe d’application depuis la 26.6 (février 2026) et tourne sans XML-RPC depuis la 26.7, mais avec des fonctions limitées. En août 2026, la 27.1 réparait encore les catégories sur ces sites.

Jetpack, lui, ne laisse aucun doute (je le présente dans mon tour d’horizon de l’extension Jetpack).

Jetpack - extension WordPress de sécurité, de sauvegarde et de statistiques reliée à WordPress.com

Jetpack - v16.3 - ⭐ 3.7/5 (2 407 avis) - +3 000 000 installations - par Automattic

Sa documentation l’écrit noir sur blanc : XML-RPC relie votre site à WordPress.com. Jetpack n’y envoie ni identifiant ni mot de passe (il utilise des jetons), et compte y rester "aussi longtemps que possible". J’ai ce cas sur une boutique WooCommerce cliente dont j’assure la maintenance : j’y reviens plus bas.

Qu’est-ce qui ne passe pas par ce fichier ? Les trackbacks ont le leur, wp-trackback.php. La publication par e-mail du cœur passe par wp-mail.php. Quant aux rétroliens que votre site envoie et aux pings vers les services de mise à jour, ce sont des appels sortants. Fermer xmlrpc.php n’en coupe aucun.

Ce que les attaquants en font, et ce que WordPress a déjà corrigé

On range sous le même mot des attaques qui n’ont rien à voir entre elles. Autant les démêler, parce que la plus citée est aussi la plus périmée.

La force brute, et l’amplification de 2015

xmlrpc.php est une seconde porte de connexion. Chaque méthode protégée vérifie l’identifiant et le mot de passe avec la même fonction que le formulaire, wp_authenticate. Sans formulaire, justement : ni captcha, ni code à six chiffres.

WordPress le reconnaît dans son guide des mots de passe d’application : un appel XML-RPC ne peut pas afficher d’étape interactive. Une extension de double authentification sur WordPress doit donc choisir entre refuser ces appels et les laisser passer.

À l’automne 2015, la force brute change d’échelle. system.multicall regroupe plusieurs appels dans une seule requête, et des attaquants s’en servent pour essayer des centaines de mots de passe d’un coup. Sucuri le décrit le 8 octobre.

La réponse de WordPress tient dans un commit du 23 octobre 2015, livré avec la 4.4 le 8 décembre. Après un premier échec d’authentification dans un appel, toutes les tentatives suivantes du même appel échouent. Ce garde-fou est toujours dans le code de la 7.1.2.

Vous lirez pourtant, y compris dans des pages retouchées en 2026, qu’une requête suffit à tester des centaines d’identifiants. C’était vrai à l’automne 2015, et seulement jusqu’à la 4.4.

Attention toutefois à ne pas en déduire trop. system.multicall existe toujours, et chaque requête permet encore un essai de mot de passe. Le cœur ne compte pas ces essais : sa documentation renvoie la limitation de débit au serveur ou à une extension.

Les rétroliens : votre site sert de relais

L’autre attaque passe par pingback.ping, la méthode des rétroliens. On lui donne l’adresse de la page qui fait le lien et celle de la page visée. WordPress va alors chercher lui-même la première, pour vérifier que le lien existe.

L’attaquant désigne comme "source" le site d’une victime, puis répète la demande auprès de milliers de WordPress, qui téléchargent tous cette page en même temps. Votre site n’est pas la cible. Il sert de relais, à votre insu (on lit souvent l’inverse).

Le 30 avril 2013, le blog d’Imperva décrit une attaque partie d’environ 2 500 sites WordPress, aucun piraté. En mars 2014, Sucuri en compte plus de 162 000 lancés contre un seul site, et prévient que le problème ne sera pas corrigé.

Il l’a été en partie. Depuis WordPress 3.9 (avril 2014), la requête de vérification transporte l’adresse IP de celui qui a demandé le rétrolien : l’attaquant n’est plus caché derrière votre site. En février 2016, Sucuri relevait pourtant encore 26 000 sites lancés contre une seule cible.

Depuis WordPress 7.1, les rétroliens sont coupés d’office dans les environnements déclarés local, development ou staging avec WP_ENVIRONMENT_TYPE. Sans déclaration, WordPress considère le site comme étant en production. En production, ils restent ouverts par défaut sur une installation neuve.

Déprécié ? Non, et pas près de l’être

Alors pourquoi WordPress garde-t-il ce fichier ? Parce que trop de choses en dépendent. Le 2 juillet 2025, sur le blog des développeurs du cœur, Jonathan Desrosiers propose de placer XML-RPC en "mode maintenance" : plus de nouvelles fonctions, seulement des corrections.

XML-RPC est indispensable à de nombreuses applications et services externes qui interagissent avec WordPress, il ne peut donc pas être déprécié.

Jonathan Desrosiers, make.wordpress.org/core, 2 juillet 2025 (traduit de l’anglais)

Il a clos la discussion le 30 juillet 2025, en annonçant des ajustements. Depuis, rien d’officiel : la page du composant XML-RPC ne parle pas de mode maintenance. Mais le fichier est entretenu : les 23 et 25 septembre 2026, deux durcissements de XML-RPC sont encore entrés dans la version en développement.

Ce que disent mes journaux : 14 jours de requêtes

Restait à mesurer ce que ce fichier pèse pour de vrai. Le 30 septembre 2026, j’ai fait compter les requêtes des 14 jours précédents dans les journaux du serveur qui héberge le WordPress de ce site. Je ne vous donne que des parts et des rapports.

Ce que la mesure donne (16 au 29 septembre 2026)Valeur
Part de xmlrpc.php dans les requêtes reçues0,11 %, soit une sur 940
wp-login.php, sur la même période39 fois plus (4,2 % des requêtes)
Fichiers .env92 fois plus (9,8 % des requêtes)
Requêtes POST, parmi celles qui visent xmlrpc.php87 %
Requêtes qui se présentent comme un navigateur100 %, dont 99 % comme Chrome
Requêtes qui s’annoncent comme Jetpack, comme l’application mobile ou comme un logiciel de publication0 %
Requêtes écrites //xmlrpc.php, avec une double barre29 %
Journaux d’accès Nginx de mon serveur, 14 jours complets. Parts et rapports uniquement.
Part de xmlrpc.php, de wp-login.php et des fichiers .env dans les requêtes reçues par mon serveur en 14 jours
Sur ce serveur, xmlrpc.php reçoit 39 fois moins de requêtes que wp-login.php.

Des robots qui passent, sans insister

Qui frappe à cette porte ? Des robots, selon toute apparence. Toutes les requêtes se présentent comme un navigateur, Chrome dans 99 % des cas, parfois dans une vieille version (78, 89 ou 95). Aucune ne s’annonce comme Jetpack, comme l’application mobile ou comme un logiciel de publication. Et pour cause : le WordPress de ce site ne s’en sert pas.

Ils ne s’acharnent pas. Deux requêtes par adresse en moyenne, près de deux adresses sur trois qui n’en font qu’une, et pas une seule rafale sur toute la période. Et cette double barre oblique dans près d’une requête sur trois… Personne ne tape ça à la main.

La page de connexion raconte une autre histoire. wp-login.php attire à peu près deux fois plus d’adresses, pour bien plus de requêtes par adresse : là, on insiste.

Les limites de cette mesure : un seul serveur, 14 jours, et un journal commun à plusieurs sites, qui n’enregistre pas le site demandé. Il ne dit pas non plus quelle méthode XML-RPC était appelée.

Ce serveur porte le WordPress en coulisses : le site public que vous lisez est servi ailleurs, et les robots qui visent son adresse n’apparaissent pas ici. Aucune requête ne s’y est présentée sous le nom de Jetpack.

Sur un serveur où tournent des sites reliés à Jetpack, le tableau serait tout autre, en effet : une partie des requêtes viendrait de WordPress.com, et celles-là sont légitimes.

Chez moi, donc, xmlrpc.php est une cible marginale. Le fermer reste justifié, mais je ne vais pas vous le présenter comme la porte la plus frappée de WordPress.

Pourquoi "désactiver XML-RPC" ne ferme pas le fichier

Sur le WordPress de ce site, XML-RPC était censé être désactivé : je l’ai même écrit dans deux articles. Un mu-plugin, ces extensions que WordPress charge d’office, y pose ces lignes. Le commentaire laissé dans le code annonce la couleur.

// Disable XML-RPC completely
add_filter('xmlrpc_enabled', '__return_false');
add_filter('xmlrpc_methods', '__return_empty_array');

Le 3 juin 2026, un audit de sécurité interroge le fichier. Il reçoit "XML-RPC server accepts POST requests only", en conclut que XML-RPC est actif et recommande de le désactiver par un filtre… celui qui était déjà en place.

Une semaine plus tard, deuxième audit, même réponse, lecture inverse : le filtre est actif, rien à signaler. Le 3 juillet, troisième passage. L’alerte tombe (le fichier répond), puis elle est levée. Interrogé sur ses méthodes, le serveur n’en avoue plus que trois, les system.*.

Le lendemain, quatrième audit. Il note "xmlrpc.php actif" et recommande, cette fois, autre chose qu’un filtre : une règle Nginx. Elle est posée le jour même. Dans mon journal de bord, la ligne du 4 juillet 2026 est brève : "xmlrpc 403 (était 405)".

Aucun de ces audits ne se trompait sur ce qu’il voyait. Le fichier répondait, parce que ce filtre n’a jamais servi à le fermer.

Ce que dit la documentation du filtre, sans détour

Contrairement à ce que son nom laisse penser, ce filtre ne contrôle pas si XML-RPC est entièrement activé : il contrôle seulement si les méthodes XML-RPC qui exigent une authentification […] sont activées.

Documentation de WordPress, filtre xmlrpc_enabled (traduit de l’anglais)

La suite du texte ajoute que le filtre ne contrôle pas non plus les rétroliens. La précision date de mars 2016. Son auteur y rappelle que ce filtre remplaçait une case à cocher qui, déjà, ne coupait que les méthodes de publication.

En pratique, avec ce filtre à faux, les méthodes protégées par mot de passe renvoient l’erreur "XML-RPC services are disabled on this site". Dix autres répondent toujours, dont pingback.ping, system.multicall et system.listMethods. Et à chaque requête, PHP démarre et WordPress se charge en entier avant de refuser.

Mon second filtre, celui qui vide la liste des méthodes, retire bien celles du cœur, rétroliens compris. Il ne peut rien contre les trois system.*, que WordPress réinscrit après lui. C’est exactement ce que le troisième audit avait vu.

L’extension la plus installée tient en une ligne

Prenez, par exemple, l’extension la plus installée du répertoire de WordPress.org pour ce seul travail.

Disable XML-RPCExtension WordPress

Disable XML-RPC - v1.0.1 - ⭐ 4.1/5 (34 avis) - +200 000 installations - par Phil Erb

Son code actif tient en une ligne, celle du filtre :

add_filter( 'xmlrpc_enabled', '__return_false' );

Sa fiche ne s’en cache pas, elle annonce utiliser le filtre intégré de WordPress. Mais l’installer ne ferme ni les rétroliens, ni system.multicall, ni le fichier. Vous obtenez moins que ce que ce site avait avant le 4 juillet : le second filtre, au moins, y retirait les rétroliens.

Le test dans le navigateur qui trompe tout le monde

Vous connaissez sans doute ce test. Ouvrez votre-site.fr/xmlrpc.php dans le navigateur : si la page affiche "XML-RPC server accepts POST requests only.", XML-RPC serait actif.

Le message est exact. WordPress l’envoie à toute requête qui n’est pas un POST, avec un code 405, quelle que soit la valeur du filtre. Filtre posé ou non, extension installée ou non, la page affiche la même phrase. Elle prouve une seule chose : PHP a répondu.

Les codes HTTP réservent un autre piège. Quand XML-RPC refuse un mot de passe, l’erreur voyage dans le XML et la réponse HTTP reste un 200. Un journal plein de "200" sur xmlrpc.php ne dit donc pas que quelqu’un est entré. Avec le filtre, le refus sort en 405.

Mon outil Score WordPress, qui teste xmlrpc.php parmi ses contrôles de sécurité, lit ces codes à votre place : il classe le fichier "Accessible" dès qu’il répond 200 ou 405. Un site protégé par le seul filtre y reste donc en rouge.

Comment bloquer xmlrpc.php au niveau du serveur ?

Pour fermer réellement xmlrpc.php, il faut que le serveur web refuse la requête avant de lancer PHP : une règle location = /xmlrpc.php avec deny all sous Nginx, un bloc Files avec Require all denied sous Apache 2.4. Aucun code WordPress ne s’exécute, aucune méthode ne répond, et la règle survit aux mises à jour.

La documentation de WordPress sur la force brute va dans ce sens : les extensions s’exécutent dans PHP, mieux vaut agir au niveau du serveur quand c’est possible.

Ne supprimez pas le fichier pour autant. Il appartient au cœur, et la documentation prévient qu’une mise à jour touche tous les fichiers de l’installation : il reviendrait. Voici ce que chaque méthode ferme vraiment.

MéthodeMéthodes avec mot de passeRétroliens et system.multicallWordPress est chargé ?Réponse à un GET
Filtre xmlrpc_enabled à faux, ou l’extension Disable XML-RPCRefuséesRépondentOui405
Filtre xmlrpc_methods vidéRetiréesRétroliens retirés, system.* répondentOui405
Extension qui refuse en PHP (Login Armor, réglage XML-RPC)RefuséesRefusésOui, jusqu’au crochet init403
Règle du serveur (Nginx deny all, Apache Require all denied)RefuséesRefusésNonRefus (403 constaté sous Nginx)
Nginx return 444RefuséesRefusésNonConnexion fermée, sans réponse
D’après le code de WordPress 7.1.2 et de Login Armor 2.7.10, et la documentation de Nginx et d’Apache.

Sous Nginx

Voilà la règle posée sur mon serveur, dans le bloc server du site :

location = /xmlrpc.php {
    deny all;
}

Le signe = compte. Il demande une correspondance exacte, et la documentation de Nginx est nette : si elle est trouvée, la recherche s’arrête. La règle passe donc avant le bloc qui exécute les fichiers PHP, où qu’elle soit écrite.

Si WordPress est installé dans un sous-dossier, adaptez le chemin (location = /blog/xmlrpc.php).

Ce n’est pas vrai de toutes les règles, et mon serveur en a fait les frais ailleurs. Celles qui s’écrivent avec une expression régulière (~) sont testées dans l’ordre du fichier, et la première qui correspond gagne. Le 2 septembre 2026, les journaux l’ont montré : une interdiction d’exécuter du PHP dans les téléversements, écrite après le bloc PHP, n’avait jamais rien bloqué.

Faut-il répondre 403, ou ne rien répondre du tout ? deny all renvoie un refus, 403 sur mon serveur. Avec return 444;, Nginx ferme la connexion sans envoyer d’en-tête de réponse. Les deux ferment la porte.

Le conseil qui circule : ajouter access_log off. Ma règle ne le fait pas. Sans journal, pas de mesure : celle de cet article n’existerait pas.

Avant de recharger Nginx : copiez le fichier de configuration hors de la racine web, lancez nginx -t, et ne rechargez que si le test passe. Le 2 septembre, il a recalé une règle mal écrite avant le rechargement.

Sous Apache 2.4

Sous Apache, la règle se pose dans le .htaccess à la racine du site, au-dessus de la ligne # BEGIN WordPress (WordPress réécrit ce qui se trouve entre ses deux balises) :

<Files "xmlrpc.php">
    Require all denied
</Files>

L’ancienne écriture traîne encore partout, avec Order Allow,Deny puis Deny from all. C’est la syntaxe d’Apache 2.2, une version en fin de vie dont la dernière mouture date de juillet 2017. Elle ne fonctionne en 2.4 que grâce à un module de compatibilité, lui-même déprécié.

La documentation d’Apache déconseille aussi de mélanger les deux écritures. Les autres règles utiles, toutes écrites en syntaxe 2.4, sont dans mon guide des règles .htaccess pour WordPress.

À noter : le .htaccess est relu à chaque requête. Si vous administrez le serveur, écrivez plutôt la règle dans sa configuration principale. Et si l’ajout provoque une erreur 500, retirez le bloc : le site revient aussitôt. Relisez ensuite votre copie, une balise mal fermée suffit. Si elle est exacte, votre hébergeur n’autorise sans doute pas cette directive, et son support vous le confirmera.

Vérifier que c’est fermé

Une règle qu’on n’a pas vérifiée ne protège rien. Ça se contrôle avec curl, depuis votre poste :

# 1. Ce que reçoit un navigateur (requête GET)
curl -sS -o /dev/null -w "%{http_code}\n" https://votre-site.fr/xmlrpc.php

# 2. Ce que reçoit un robot (requête POST, liste des méthodes)
curl -sS -o /dev/null -w "%{http_code}\n" \
  -H "Content-Type: text/xml" \
  -d '<?xml version="1.0"?><methodCall><methodName>system.listMethods</methodName><params></params></methodCall>' \
  https://votre-site.fr/xmlrpc.php

# 3. Le même contrôle en HTTP simple
curl -sS -o /dev/null -w "%{http_code}\n" http://votre-site.fr/xmlrpc.php

# 4. La variante avec un segment après le nom du fichier
curl -sS -o /dev/null -w "%{http_code}\n" https://votre-site.fr/xmlrpc.php/test

Voici comment lire les codes :

  • 405 au GET et 200 au POST : le fichier répond, avec ou sans filtre ;
  • 403 aux deux : la requête est refusée, par le serveur ou par une extension qui répond en PHP ;
  • 404 : le fichier est absent, ou une règle le fait passer pour tel ;
  • 301 ou 308 : l’adresse est redirigée (le site public que vous lisez renvoie ainsi vers sa page d’accueil) ;
  • 000 : aucune réponse HTTP reçue. Cela peut venir d’un return 444, mais aussi d’une erreur DNS, TLS ou d’un délai dépassé. Lisez le message d’erreur avant de conclure.

Ne sautez pas la troisième commande. Si l’adresse en http:// ne renvoie pas vers le HTTPS, la règle doit exister dans les deux configurations.

La quatrième teste une variante de l’adresse. Selon la configuration PHP du serveur, elle peut échapper à une correspondance exacte : si elle ne répond pas 403 ou 404, la règle est à élargir.

Quatre commandes curl sur xmlrpc.php, qui répondent toutes par un code 403 quand le fichier est fermé
Les quatre contrôles joués sur un WordPress local où xmlrpc.php est fermé : quatre refus.

Que fait déjà votre hébergeur ?

Avant d’écrire la moindre règle, regardez ce que votre hébergeur fait déjà. Certains ferment xmlrpc.php d’office, d’autres vous laissent la main, d’autres n’en disent rien.

HébergeurCe qu’il documentePage datée du
KinstaTout accès à xmlrpc.php est coupé par défaut18 septembre 2026
WP EngineBloqué par défaut sur les environnements créés après avril 2022, avec un interrupteur2 mars 2026
HaiSoftBloqué par défaut sur ses serveurs mutualisés et ses nouveaux serveurs VM et dédiés ; là où fail2ban est présent, les adresses qui insistent sont bannies23 septembre 2020
o2switchRègle de blocage "recommandée" dans l’outil Tiger Protect. La page ne dit pas si elle est active par défaut6 juin 2026
OVHcloud (mutualisé)Pare-feu applicatif ModSecurity à activer soi-même ; le guide ne mentionne pas xmlrpc.php22 août 2025
WordPress VIPPas de blocage par défaut : au-delà de 10 requêtes en 30 secondes, l’adresse est bloquée une heure ; sur les nouveaux environnements, seuls les mots de passe d’application sont acceptés, et une option ferme XML-RPC entièrement26 février 2026
Ce que chaque hébergeur écrit lui-même, lu le 30 septembre 2026. Je n’ai testé aucune de ces plateformes pour cet article.

Un blocage par défaut est une bonne nouvelle… jusqu’au jour où vous installez Jetpack. Et une règle "recommandée" n’est pas forcément active : ouvrez votre panneau d’hébergement et vérifiez.

Sans accès au serveur, l’extension de sécurité

Ni accès au serveur, ni règle chez l’hébergeur ? Il reste les extensions de sécurité.

Wordfence Security - pare-feu, analyse de logiciels malveillants et sécurité de la connexion pour WordPress

Wordfence Security - v9.0.2 - ⭐ 4.7/5 (5 020 avis) - +5 000 000 installations - par Mark Maunder

Wordfence range dans ses réglages de connexion une option "Disable XML-RPC authentication". Le libellé est honnête : il parle d’authentification, et l’option s’appuie sur le filtre xmlrpc_enabled. Le reste est dans mon guide complet de Wordfence.

Ce que ma règle ne protégeait pas

En préparant cet article, le 30 septembre 2026, j’ai fait relever les codes de réponse dans mes journaux. 57 % des requêtes vers xmlrpc.php ont reçu un code 200, et un tiers seulement un 403, le code du refus. Pour un fichier censé être bloqué, c’est beaucoup.

Le serveur n’héberge pas que ce site. Il porte aussi deux WordPress de test, et chacun a son propre fichier de configuration Nginx. Ma règle du 4 juillet vit dans celui du site principal. Les autres ne l’avaient pas.

Une requête sur chaque site a levé le doute, ce 30 septembre. Le principal renvoyait le 403 de Nginx. Un WordPress de test refusait lui aussi, mais plus tard, par PHP. L’autre répondait 405 et "XML-RPC server accepts POST requests only". Ouvert, donc. Tout indique que les robots l’avaient trouvé…

Mon journal ne garde ni le site demandé ni le contenu des réponses. Je ne peux donc pas vous dire ce que ces requêtes ont obtenu, ni même affirmer que toutes visaient ce site de test. Je sais seulement qu’elles ont reçu un 200, sur un fichier censé renvoyer un 403.

La règle est posée depuis le même jour sur le site de test resté ouvert. Contrôle refait : 403 sur les trois. La relecture des deux fichiers a aussi montré le défaut d’ordre décrit plus haut : l’interdiction du PHP dans les dossiers de médias y venait après le bloc PHP, donc sans effet. Elle est remontée.

Une règle écrite dans le fichier d’un site ne protège que ce site. Sur un serveur qui porte plusieurs WordPress, elle se recopie dans chaque configuration, ou s’écrit une fois dans un fichier commun que toutes incluent. Ces deux sites de test demandaient pourtant aux moteurs de recherche de ne pas les indexer.

Et si vous devez le garder ouvert ?

Jetpack, l’application mobile, IFTTT… Si l’un d’eux tourne chez vous, fermer xmlrpc.php casse quelque chose. La documentation de WordPress donne alors la consigne : le restreindre par des règles de pare-feu et limiter fortement le débit.

N’ouvrir qu’aux adresses de Jetpack

Jetpack publie les plages d’adresses depuis lesquelles WordPress.com contacte votre site. Sous Apache, le refus devient une liste blanche :

<Files "xmlrpc.php">
    Require ip 122.248.245.244/32 54.217.201.243/32 54.232.116.4/32
    Require ip 192.0.80.0/20 192.0.96.0/20 192.0.112.0/20
    Require ip 195.234.108.0/22 192.0.64.0/18
</Files>

Ces plages changent : je les ai fait relever le 30 septembre 2026 sur la page d’aide de Jetpack, qui prévient qu’elles peuvent évoluer et en publie une version lisible par une machine. Relisez-la avant de copier quoi que ce soit.

Derrière un CDN (un réseau qui relaie les requêtes vers votre site) ou un proxy, votre serveur voit par défaut l’adresse de ce relais à la place de celle de Jetpack. Le plus simple est alors de poser la liste blanche chez le CDN. Votre serveur peut aussi rétablir l’adresse d’origine, à condition de ne croire que ce relais : mal réglé, il laisserait n’importe qui se présenter comme Jetpack.

Sous Nginx, les mêmes plages s’écrivent en lignes allow, suivies d’un deny all, dans un bloc location = /xmlrpc.php qui reprend aussi les directives PHP de votre configuration (comme dans l’exemple de limitation de débit, plus bas).

Un mot de passe d’application à la place du vrai

Depuis WordPress 5.6, vous pouvez créer un mot de passe d’application par service. Il s’utilise avec XML-RPC à la place du vrai, ne sert pas à ouvrir une session dans le tableau de bord et se révoque sans toucher au compte.

Toutefois, le vrai mot de passe reste accepté par XML-RPC. Un ticket ouvert propose d’imposer les mots de passe d’application pour ces appels.

Limiter le débit

La documentation de WordPress donne un exemple pour Nginx, que je reprends ici : dix requêtes par minute et par adresse, avec une tolérance de vingt. La première ligne se place dans le bloc http, le reste dans le bloc server du site.

limit_req_zone $binary_remote_addr zone=logins:10m rate=10r/m;

server {
    location = /xmlrpc.php {
        limit_req zone=logins burst=20 nodelay;
        include fastcgi_params;
        # puis les directives PHP de votre configuration (fastcgi_pass...)
    }
}

Au-delà du seuil, Nginx répond par une erreur (503 par défaut). Ne collez pas ce bloc à l’aveugle : il remplace votre bloc PHP pour ce fichier, et doit donc en reprendre les directives.

Garder XML-RPC, couper les rétroliens

Vous gardez XML-RPC pour Jetpack, mais vous n’avez que faire des rétroliens. Retirez seulement leur méthode, avec le filtre xmlrpc_methods, dans un fichier posé dans wp-content/mu-plugins/. Le cœur fait exactement cela depuis la 7.1, dans les environnements déclarés hors production.

<?php
/**
 * Plugin Name: Retirer les rétroliens XML-RPC
 */
add_filter( 'xmlrpc_methods', function ( $methods ) {
    unset( $methods['pingback.ping'] );
    return $methods;
} );

Le cas d’une boutique cliente sous Jetpack

Sur la boutique WooCommerce dont je parlais, XML-RPC doit rester ouvert : Jetpack y assure les sauvegardes. Au printemps 2026, une attaque par force brute sur xmlrpc.php a saturé PHP en quelques minutes, et la sauvegarde en cours a échoué.

Fermer le fichier aurait réglé l’attaque et cassé Jetpack. La parade a donc été une liste blanche des adresses de Jetpack dans le .htaccess, doublée d’un mu-plugin qui retire les méthodes dont les attaquants abusaient.

L’été suivant, le problème est venu d’ailleurs. La protection de l’hébergeur soumettait xmlrpc.php à une vérification de navigateur. Jetpack est un robot, il ne peut pas la passer. Il a relancé ses appels en rafale, et le site en est devenu indisponible un court moment. La réponse a été une limite de débit par adresse sur ce fichier.

Garder XML-RPC pour une extension revient à l’ajouter à votre surface d’attaque. Surveillez ses failles : mon outil Veille Sécurité, gratuit pour les abonnés, compare chaque jour vos extensions à la base WPVulnerability.net. Et si vous préférez déléguer, mes forfaits de maintenance démarrent à 590 € HT par mois.

Un WordPress à verrouiller ? Je m’en occupe pour vous.

Découvrir la maintenance

Masquer la page de connexion suffit-il ?

Non. Masquer ou déplacer la page de connexion ne protège pas xmlrpc.php, qui vérifie les identifiants sans passer par wp-login.php. Si les méthodes d’authentification XML-RPC restent autorisées, un robot peut encore y essayer des mots de passe, une requête après l’autre. La page masquée réduit le bruit, elle ne ferme pas cette seconde porte.

Vous lirez parfois que déplacer la page de connexion "ne sert à rien" tant que ce fichier reste ouvert, parce qu’il avalerait des dizaines de tentatives par requête. J’ai fait vérifier l’affirmation.

Le fond est juste : les deux portes sont indépendantes. La conclusion va trop loin. Sur mon serveur, wp-login.php reçoit 39 fois plus de requêtes que xmlrpc.php : la page de connexion reste de loin la plus sollicitée. Mon journal compte des requêtes, pas des mots de passe essayés. Quant aux dizaines de tentatives par requête, l’argument est périmé depuis WordPress 4.4.

WPS Hide Login ne touche pas à ce fichier

WPS Hide Login - extension pour masquer la page de connexion WordPress

WPS Hide Login - v1.9.19 - ⭐ 4.8/5 (2 111 avis) - +2 000 000 installations - par Remy Perona

Cette extension, dont je suis l’un des créateurs, ne touche pas à xmlrpc.php. Vérification faite dans le code de sa version 1.9.19 : aucune occurrence de "xmlrpc", de "multicall" ni de "pingback". Elle masque wp-login.php et wp-admin. Rien d’autre.

Je l’ai présentée dans mon guide pour changer l’adresse de connexion de WordPress, et sa propre fiche renvoie vers une extension sœur pour limiter les tentatives de connexion par force brute. Sur le serveur de ce site, deux mécanismes distincts ferment les deux portes : WPS Hide Login pour la page de connexion, Nginx pour xmlrpc.php.

Login Armor le ferme, en PHP

Login Armor, maintenant. C’est mon extension : je l’ai créée et je la développe. Prenez ce qui suit comme la parole d’un auteur, vérifiable dans le code.

Login Armor - extension WordPress de protection de la page de connexion

Login Armor - v2.8.2 - ⭐ 5/5 (6 avis) - +500 installations - par WPFormation

Son réglage "Disable XML-RPC" répond 403, avec le message "XML-RPC is disabled.", avant que WordPress ne traite l’appel. Constaté sur un site local en 7.1.2, en GET comme en POST. Il n’est pas actif à l’installation : il fait partie des sept réglages recommandés, que l’on applique d’un bouton.

Un réglage séparé retire les seuls rétroliens. Et si votre page de connexion est masquée pendant que des attaques arrivent par xmlrpc.php, le tableau de bord vous le dit : "Hide Login is on, but XML-RPC is still open."

Sa limite est celle de toute extension, déjà dite : le refus vient de PHP. Avec un accès au serveur, la règle Nginx ou Apache reste la meilleure fermeture. Le détail est dans ma présentation de Login Armor et de ses protections.

Alors, faut-il désactiver xmlrpc.php ?

Je ne coupe pas xmlrpc.php d’office. Je commence par regarder qui s’en sert. Si une extension ou une fonction du site en a besoin, je le garde et je le verrouille au maximum. Si rien ne s’en sert, je le ferme : c’est une porte d’entrée de moins à surveiller. Tout dépend du projet.

Regarder qui s’en sert, en une commande

Vos journaux donnent un premier élément de réponse. Cette commande lit tous les journaux d’accès conservés, archives compressées comprises, et liste les agents utilisateurs (le nom sous lequel chaque logiciel se présente) qui appellent le fichier, du plus fréquent au plus rare. Adaptez le chemin du journal :

zgrep -hE '"[A-Z]+ [^ "]*/xmlrpc\.php[/? ]' /var/log/nginx/access.log* \
  | awk -F'"' '{print $6}' | sort | uniq -c | sort -nr

Lisez la liste jusqu’en bas : un service qui n’appelle le fichier qu’une fois par semaine s’y trouve tout à la fin. Si un nom connu y figure (Jetpack, par exemple), c’est un indice à recouper avec les services connectés. Ce nom peut être imité. Une liste qui ne montre que des navigateurs, comme chez moi, reste un indice : chaque logiciel choisit le nom sous lequel il se présente.

Avant de fermer, le tour du site

Avant de fermer, faites donc aussi le tour du site : les extensions actives, les services connectés, l’application mobile d’un collègue. Vos journaux ne couvrent que la période conservée (14 jours sur mon serveur), et une tâche mensuelle peut leur échapper. Puis fermez, et regardez ce qui cesse de fonctionner les jours suivants.

Votre situationCe que la méthode donne
Rien ne s’en sert, et vous administrez le serveurLe fermer par une règle Nginx ou Apache, puis vérifier avec curl
Rien ne s’en sert, sans accès au serveurLa règle .htaccess, ou celle de votre hébergeur ; à défaut, une extension qui répond 403
JetpackLe garder, n’ouvrir qu’aux adresses de Jetpack, limiter le débit
Application mobileTester l’application sans XML-RPC ; s’il manque une fonction, le garder et limiter le débit
IFTTT, MarsEditLe garder, avec un mot de passe d’application par service et une limite de débit
XML-RPC utile, rétroliens inutilesRetirer la seule méthode pingback.ping
Plusieurs WordPress sur le même serveurÉcrire la règle une fois, dans un fichier commun à tous les sites
La même méthode, cas par cas : regarder qui s’en sert, puis fermer ou verrouiller.

Le reste de l’hygiène (comptes, mots de passe, sauvegardes) est dans ma checklist pour sécuriser WordPress étape par étape.

Désactiver xmlrpc.php n’est pas une décision de principe. Regardez qui s’en sert, puis tranchez sans demi-mesure : fermé pour de bon au niveau du serveur si personne n’en a besoin, gardé et verrouillé sinon. Le seul mauvais choix est l’entre-deux que ce site a connu jusqu’au 4 juillet 2026, un fichier "désactivé" qui répond à tout le monde.

Questions fréquentes

Peut-on supprimer le fichier xmlrpc.php ?

Mieux vaut l’éviter. xmlrpc.php fait partie des fichiers livrés avec WordPress, et chaque mise à jour de WordPress les réinstalle : il reviendrait. Une règle posée au niveau du serveur survit aux mises à jour.

Quelle différence entre XML-RPC et l’API REST de WordPress ?

Ce sont deux interfaces distinctes. XML-RPC, présent au moins depuis WordPress 1.5, passe par xmlrpc.php. L’API REST est entrée dans le cœur avec les versions 4.4 et 4.7. Elle ne l’a pas remplacé partout : Jetpack et IFTTT en dépendent encore, alors que Zapier est passé par l’API REST avec son extension.

Jetpack fonctionne-t-il sans xmlrpc.php ?

Non. Sa documentation indique que bloquer le fichier casse la connexion avec WordPress.com. Gardez alors xmlrpc.php ouvert aux seules plages d’adresses que Jetpack publie, et ajoutez une limite de débit.

Comment savoir si xmlrpc.php est actif sur mon site ?

Pas avec le navigateur : son message s’affiche que le filtre soit posé ou non. Lancez une requête avec curl et lisez le code de réponse. 405 au GET ou 200 au POST, le fichier répond. 403, la requête est refusée.

Sources

Sources vérifiées le 7 octobre 2026 ; citations traduites de l’anglais.

Newsletter gratuite

Chaque mois, je passe 15 heures en veille WordPress. Vous, vous recevez un email de 3 minutes.

Sécurité, performance, SEO, nouveautés, IA : l'essentiel trié, vérifié et expliqué par un formateur WordPress depuis 2012 et fondateur de WPServeur.

01Alertes sécurité et patches critiques
02Nouveautés WordPress décryptées
03Tips SEO et performance
04Veille IA appliquée à WordPress
05Retours terrain sur des tutoriels WordPress
06Plugins et outils recommandés

Double opt-in : un email de confirmation à valider. Max 2 emails/mois. WPFormation utilise les données saisies, via Brevo, pour votre inscription et les emails annoncés, avec votre consentement. Données jamais revendues. Désabonnement en 1 clic. Vos droits et la conservation de vos données

Fabrice Ducarme, formateur WordPress
Fabrice Ducarme

Référence francophone WordPress depuis 2012. Expert en IA (Claude, Gemini) et développement Headless (Next.js), je forme les professionnels à maîtriser l'écosystème web d'aujourd'hui et de demain.