Tout savoir sur WordPress

Désactiver la REST API et le XML RPC de WordPress

Ces derniers temps, la REST API a connu quelques failles de sécurité qui peuvent couter cher à votre site. Même si la version 4.7.2 corrige le problème, on n’est pas à l’abris d’en avoir des nouveaux sous peu. Etant donné que l’API REST n’est utile que dans des cas spécifiques, je vous conseille de la désactiver, ainsi que le vieux protocole XML RPC

La première chose à faire, si vous n’êtes pas passé en 4.7.2, c’est de faire la mise à jour sans attendre. Ensuite, on va pouvoir désactiver l’API et le XML RPC pour éviter des soucis à l’avenir.

REST API ? XML RPC ? C’est quoi et comment cela peut être dangereux ?

Depuis WordPress 4.4 et surtout 4.7, WordPress dispose d’une API, c’est à dire d’une interface brute permettant d’exposer les données du site. Les APIS servent aux développeurs pour créer des ponts entre sites et applications afin d’échanger des données.

Exemple : en vous connectant à l’API Flickr, vous pouvez envoyer une requête pour récupérer la liste des dernières photos d’un groupe en particulier afin de les afficher sur votre site. Ou récupérer la liste des derniers tweets d’un utilisateur pour les embarquer dans une application tierce. Les possibilités sont infinies !

Dans la plupart des cas, une API est sécurisée à minima avec Oauth. Mais ce n’est pas le cas de l’API REST WordPress, et c’est une très mauvaise idée.

J’ai longuement parlé de l’API Rest lors de conférences et sur ce blog. Retrouvez d’ailleurs toute une série de tutoriels et explications :

Articles sur l'API REST WP

Quant à XML-RPC, c’est un peu l’ancêtre de l’API. Et aujourd’hui ce n’est plus trop utilisé. Et ça reste également une source potentielle de faille.

Alors pourquoi c’est dangereux ? 

Sachez déjà qu’une technologie fraichement rajoutée a plus de chances d’être encore fragile et des failles peuvent apparaitre. Comme un bon vin, cela va se bonifier avec le temps. Les APIS sont d’autant plus sensibles puisqu’elles ajoutent une porte de communication avec l’extérieur. Imaginez un chateau fort : plus il y a de portes à l’entrée et plus il y a de risque d’intrusions.

Je vous présente aujourd’hui 2 solutions simples à mettre en place !

Solution 1 – simple : Desactiver le tout avec SecuPress

La solution la plus rapide et la plus sûre est d’installer SecuPress (le plugin sécurité tout-en-un dont vous trouverez le test en profondeur ici) et il suffit d’aller dans SecuPress > Modules > Données sensibles, puis cochez désactiver XML-RPC et API REST.

Ces options sont disponibles dans la version gratuite.

Télécharger SecuPress

Pour vérifier que cela fonctionne bien, rendez-vous sur votre site et ajoutez à l’URL : /wp-json/wp/v2 si vous tombez sur une erreur 404, c’est bon ! Si vous tombez sur du JSON c’est que l’API est toujours active.

Solution 2 – pour les codeurs : désactiver par le code

Desactiver l’API REST WP

Ouvrez votre fichier functions.php dans votre thème et ajoutez ces lignes :

<?php 

	// Disable REST API 

	remove_action( 'init',          'rest_api_init' );
	remove_action( 'parse_request', 'rest_api_loaded' );

	remove_action( 'xmlrpc_rsd_apis',            'rest_output_rsd' );
	remove_action( 'wp_head',                    'rest_output_link_wp_head' );
	remove_action( 'template_redirect',          'rest_output_link_header', 11 );
	remove_action( 'auth_cookie_malformed',      'rest_cookie_collect_status' );
	remove_action( 'auth_cookie_expired',        'rest_cookie_collect_status' );
	remove_action( 'auth_cookie_bad_username',   'rest_cookie_collect_status' );
	remove_action( 'auth_cookie_bad_hash',       'rest_cookie_collect_status' );
	remove_action( 'auth_cookie_valid',          'rest_cookie_collect_status' );

	add_filter( 'rest_enabled',       '__return_false' );
	add_filter( 'rest_jsonp_enabled', '__return_false' );

Ces lignes sont celles actuellement utilisées dans SecuPress.

DESACTIVER Le XML RPC

Pour désactiver le XML-RPC il suffit ensuite d’ajouter ces lignes, toujours dans functions.php :

<?php 

	add_filter( 'xmlrpc_enabled', '__return_false' );
	remove_action( 'wp_head', 'rsd_link' );

A l’avenir l’API REST va tout de même être utilisée par l’interface d’administration de WordPress donc si vous la désactivez totalement ça risque d’un jour vous jouer des tours. Voici alors un code alternatif qui laisse l’API ouverte mais réservée seulement aux utilisateurs connectés :

<?php 

function secure_API( $access ) {

	if( ! is_user_logged_in() ) {
        return new WP_Error( 'rest_cannot_access', __( 'Accès réservé aux personnes authentifiées', 'disable-json-api' ), array( 'status' => rest_authorization_required_code() ) );
    }

    return $access;
}
add_filter( 'rest_authentication_errors', 'secure_API' );

Voilà, j’espère que vous aurez trouvé ce tutoriel utile. En tous cas soyez attentif plus que jamais, tant que l’API n’aura pas été consolidée il faut considérer qu’elle est fragile.

Beaucoup de développeurs sont d’avis qu’il aurait fallu la couper par défaut, et ne pas l’activer pour tout le monde, mais WordPress en a décidé autrement.

Cet article a été mis à jour il y a 312 jours

Article écrit par Maxime BJ

Développeur, bloggeur et formateur Web spécialisé WordPress. 31 ans. Grenoblois. Co-fondateur de WPChef, l’organisme de formation WordPress.

Organisateur de WPInAlps, le meetup WordPress Grenoblois. Vous pouvez me rencontrer lors d’événements tels que WordCamp Paris et Europe. Traducteur Français de l’extension Advanced Custom Fields. Également développeur d’applications web avec MeteorJs. Je m’occupe un site pour apprendre l’informatique aux débutants gratuitement.

J’aime les jeux vidéo, la rando, la bouffe bien grasse et les voyages.

11 Commentaires

Répondre à ArnaudBan Annuler la réponse.

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

    • Le problème est résolu en 4.7.2, je propose juste ces codes pour éviter de futurs potentiels problèmes en cas de nouvelle faille à l’avenir

  1. Personnellement, ayant détecté une attaque en cours sur le fichier xmlrpc.php, qui est la porte de l’api du même nom (que je n’utilise pas), j’ai tout simplement supprimé le fichier (en attendant la prochaine mise à jour).
    simple, sans risque et sans ajouter du code (plugin ou autre).

    ATTENTION, solution temporaire : la mise à jour suivante le réinstallera

    • Il vaut mieux utiliser le filter indiqué dans l’article que de supprimer des fichiers du coeur de WP ;)

  2. Merci pour ce code, je l’ai insérer à l’aide d’un MU Plugin, cela ne posera pas de problème futur ?
    C’est d’autant plus facile pour le déployer sur d’autres sites.

  3. Un grand merci pour cet article déjà. Je viens aussi de parcourir ton article sur l’API REST, c’est très instructif :)

    Dans ta « solution 2 », tu proposes une solution pour désactiver l’API REST et une autre pour désactiver le XML RPC.
    Ensuite, tu nous parles d’une solution alternative qui laisse l’API ouverte mais réservée seulement aux utilisateurs connectés.

    Si je veux opter pour la solution alternative, au niveau du code, est-ce qu’au final je dois avoir ceci :

    remove_action( ‘init’, ‘rest_api_init’ );
    remove_action( ‘parse_request’, ‘rest_api_loaded’ );
    (…)
    add_filter( ‘rest_enabled’, ‘__return_false’ );
    add_filter( ‘rest_jsonp_enabled’, ‘__return_false’ );

    function secure_API( $access ) {
    (…)
    }
    add_filter( ‘rest_authentication_errors’, ‘secure_API’ );

    OU uniquement ceci :

    function secure_API( $access ) {
    (…)
    }
    add_filter( ‘rest_authentication_errors’, ‘secure_API’ );

    Merci d’avance pour ta réponse :)

5a5a1525ccf9f8ae509eb5150419f760QQQQQQQQQQQQQQ