XML-RPC permet d’échanger des données entre un site WordPress et une application externe installée sur un serveur, sur un smartphone….
En utilisant le corps de la requête HTTP(S), et pas seulement l’adresse web (url), XML-RPC permet d’échanger un volume de données important dans les requêtes : celles qui demandent des données au site et celles pour la réponse du site.
Cet article décrit une solution pour créer et visualiser les échanges XML-RPC avec un site WordPress .
Présentation de XML-RPC
On trouvera une présentation de XML-RPC au début de l’article suivant :
Haut de page
Utiliser la méthode POST de HTTP
Pour utiliser la fonctionnalité XML-RPC d’un site WordPress, il faut pouvoir accéder à distance au fichier « xmlrpc.php » situé à la racine du site : «http(s)://adresse_mon_monsite/xmlrpc.php».
Si on lance la requête depuis la barre d’adresse d’un navigateur, on doit obtenir le message d’erreur suivant :

C’est en fait une bonne nouvelle car ce message d’erreur confirme que XML-RPC est disponible pour le site.
Parfois, l’accès est bloqué par l’hébergeur du site. Il faut alors le contacter pour lui demander de lever le blocage.
XML-RPC utilise la méthode « POST » de HTTP, afin de pouvoir insérer des données dans le corps de la requête et pas seulement par un paramétrage de l’adresse web (« query string »). Il n’est donc pas possible de tester XML-RPC depuis la barre d’adresse d’un navigateur.
Il existe différentes solutions : passer par un formulaire en demandant une action de type « POST » ou écrire un programme de test.
Mieux vaut utiliser un utilitaire de requêtage HTTP permettant de :
- créer les requêtes HTTP à envoyer au site WordPress,
- visualiser les réponses renvoyées par le site WordPress.
« Fiddler » une application de requêtage HTTP
« Fiddler » est gratuit et se télécharge à l’adresse https://www.telerik.com/download/fiddler.
Après l’avoir installé, lancer Fiddler. La page suivante doit apparaître :

Pour lancer une requête HTTP conforme au protocole XML-RPC :
- cliquer sur l’onglet
,
- choisir la méthode « POST »,
- saisir l’adresse du fichier « xmlrpc.php » pour le site à tester,
- saisir le corps de la requête
- cliquer sur le bouton

La partie « type de requête », « adresse web » et « version de protocole » définit l’en-tête de la requête.
Dessous, se trouve la zone de saisie du corps (« body ») de la requête. Il doit respecter les spécifications XML du protocole XML-RPC
Après envoi de la requête, la page Fiddler est modifiée et affiche le corps de la réponse du site WordPress :
- L’en tête de la requête envoyée est rappelée en haut de la colonne de droite,
- double cliquer sur la description de la requête dans la colonne de gauche,
- choisir un mode de visualisation de la réponse dans la partie basse de la colonne de droite,
- visualiser la réponse en bas de la colonne de droite

Récupérer une ancienne requête
Il est possible de relancer une précédente requête, éventuellement après l’avoir modifiée.
Après avoir sélectionné l’onglet :
- double cliquer sur une ancienne requête dans la colonne de droite; elle apparaît dans la zone de composition de la requête, au centre de la fenêtre,
- il est possible de modifier l’adresse web de la requête,
- il est possible de modifier le corps de la requête,
- cliquer sur le bouton

Conserver la trace des requêtes XML-RPC
Les fichiers journaux (logs) fournis par les hébergeurs font généralement apparaître l’en tête des requêtes HTTP mais pas le corps. Pour XML-RPC, il manque donc l’essentiel.
Voici le code d’une extension qui permet de conserver le contenu complet des requêtes XML-RPC :
Nous avons successivement :
- l‘en-tête de l’extension (entre « /* » et « */ ») en version mimale
- un test pour vérifier que l’extension est appelée depuis WordPress,
if ( !defined(‘ABSPATH’) ) exit (‘Faites demi-tour !’); - la vérification que le fichier « xmlrpc.php » est appelé depuis l’adresse web (sinon il n’y a pas d’information à recopier dans le fichier journal),
if (substr($_SERVER [‘PHP_SELF’],-10)=== ‘xmlrpc.php’) - la récupération de l’adresse IP appelante, de l’heure de réception et de l’adresse web
$wpdf_url = getenv (‘REMOTE_ADDR’). ‘ | ‘.date(‘l jS F Y h:i:s A’,$_SERVER [‘REQUEST_TIME’]). ‘ | ‘.$_SERVER [‘REQUEST_URI’] . « \n »; - la recopie de ces informations dans le fichier journal
file_put_contents(WP_CONTENT_DIR.’/xmlrpc_hook’ . date(« Ymd »). ‘.log’,$wpdf_url, FILE_APPEND);
on remarquera que le fichier journal :
est situé dans le répertoire « wp-content » ou équivalent : WP_CONTENT_DIR
est nommé « xmlrpc_hook » suivi de la date du jour: date(« Ymd »)
est suffixé par « .log«
- si la variable $HTTP_RAW_POST_DATA est vide, on lui affecte le contenu du corps de la requête (qu’elle contient généralement),
if ( ! isset( $HTTP_RAW_POST_DATA ) ) $HTTP_RAW_POST_DATA = file_get_contents( ‘php://input’ ); - le corps de la requête est recopié dans le fichier journal
file_put_contents(WP_CONTENT_DIR.’/xmlrpc_hook’ . date(« Ymd »). ‘.log’,$HTTP_RAW_POST_DATA, FILE_APPEND); - on ajoute un saut de ligne dans le fichier journal
file_put_contents(WP_CONTENT_DIR.’/xmlrpc_hook’ . date(« Ymd »). ‘.log’, »\n\n », FILE_APPEND);
Voici un exemple de liste de fichiers journaux récupérables via FTP :

Voici un exemple de ce que peut contenir un fichier journal :

On constate que le fichier journal contient :
- des en-têtes de requêtes HTTP
la troisième en-tête correspond à un appel depuis l’extension « JetPack »; l’adresse web permet d’identifier la provenance (« for=jetpack ») et les informations suivantes servent à l’authentification de la demande - un corps de requête HTTP correspondant à l’en-tête situé juste au dessus.
Si vous subissez des attaques en force brute via XML-RPC, cette extension vous permettra d’aller voir le détail de ces attaques, même si vous avez désactivé l’authentification via XML-RPC (« add_filter (‘xmlrpc_enabled’, ‘__return_false’, 1); »).
Haut de page