WordPress 4.7 introduit une API REST qui est une avancée que beaucoup qualifient de révolutionnaire.
Elle permet à de nombreuses extensions, à des applications tierces ou encore à des services dans le cloud de communiquer facilement avec votre site Internet sous WordPress, et l’éditeur de blocs s’appuie lui aussi sur elle. L’inconvénient majeur dont s’est fait l’écho Wordfence sur son blog est qu’une telle API permet à n’importe quel visiteur anonyme d’obtenir la liste des auteurs de votre site… ce qui n’est pas sans poser des risques non négligeables en matière de sécurité. WordPress a depuis réduit ce qu’elle affiche, sans supprimer cet accès : voici comment le restreindre.
Explication du problème
Pour voir ce que votre site expose, ouvrez une fenêtre de navigation privée, où vous n’êtes pas connecté, et rendez-vous à l’adresse example.com/wp-json/wp/v2/users en remplaçant example.com par votre nom de domaine. Si vos permaliens sont réglés sur « Simple », utilisez plutôt example.com/?rest_route=/wp/v2/users.
Cette liste ne contient pas tous les comptes, mais seulement ceux qui ont publié au moins un contenu d’un type affiché dans l’API REST, comme les articles et les pages : WordPress 4.7.1 a resserré cette règle, qui s’appliquait auparavant à tous les types de contenus publics. C’est toujours le cas avec WordPress 7.1. Pour chacun de ces auteurs, l’API indique notamment son ID, son nom public, l’adresse de sa page d’auteur et son slug. L’identifiant de connexion et l’adresse e-mail n’y figurent pas, mais le slug est créé par défaut à partir de l’identifiant de connexion : il le reprend souvent tel quel.
La liste ainsi obtenue fournit donc des identifiants probables, qui pourraient être utilisés lors d’attaques sur votre formulaire de connexion. Même si vous disposez de protections additionnelles en limitant par exemple le nombre de tentatives, cela va nécessairement ralentir votre serveur.
Ce même slug apparaît aussi dans l’adresse de vos pages d’auteur, que l’API REST soit restreinte ou non. Pour qu’il ne révèle plus votre identifiant de connexion, modifiez-le, par exemple avec WP-CLI : wp user update 2 --user_nicename=nouveau-slug, où 2 est l’ID du compte. L’extension Edit Author Slug le permet aussi depuis l’administration, mais elle n’a plus été mise à jour depuis mai 2025.
Bloquer l’accès aux utilisateurs anonymes
Ne désactivez pas complètement l’API REST : la documentation officielle de l’API REST le déconseille, car une partie de l’administration de WordPress en dépend. Il reste deux niveaux de blocage pour les visiteurs non connectés : masquer seulement les routes des utilisateurs, ce qui règle le problème décrit plus haut, ou réserver toute l’API aux utilisateurs connectés.
Avec une extension
Si vous utilisez Wordfence, vérifiez simplement que son option Empêcher la découverte d’identifiants via les analyses « /?author=N », l’API oEmbed, l’API REST de WordPress et les plans de site XML de WordPress est cochée : elle l’est par défaut. Vous la trouverez dans Wordfence > Pare-feu, lien Toutes les options du pare-feu, section Protection anti force brute. Seuls les éditeurs et les administrateurs connectés peuvent alors obtenir la liste des utilisateurs. Le reste de l’API REST demeure accessible : Wordfence ne désactive pas l’API, et n’a pas besoin de le faire pour masquer vos identifiants.
D’autres extensions de sécurité proposent un réglage comparable : Kadence Security, anciennement iThemes Security, avec le réglage API REST de son module Ajustements WordPress à passer sur Accès restreint, ou SecuPress avec l’option Interdire l’énumération des comptes de son module Comptes & Connexion, qui rend aussi vos pages d’auteur inaccessibles.
Pour réserver toute l’API REST aux seuls utilisateurs connectés, il existe aussi une extension gratuite intitulée Disable REST API. Il suffit de l’installer puis de l’activer ; sa page de réglages permet ensuite d’autoriser certaines routes, rôle par rôle. Attention toutefois : elle n’a plus été mise à jour depuis septembre 2023 et n’a été testée que jusqu’à WordPress 6.3. Je vous conseille plutôt l’une des deux méthodes par code ci-dessous.
Désactiver l’accès anonyme à l’API REST de WordPress.
Si vous l’utilisez déjà, vérifiez qu’elle fonctionne correctement en ouvrant de nouveau l’URL mentionnée ci-dessus dans une fenêtre de navigation privée : la liste des utilisateurs n’est plus accessible, comme en témoigne ce message :
Par code : masquer seulement la liste des utilisateurs
C’est la méthode que je recommande : elle retire les routes /wp/v2/users de l’API pour les visiteurs non connectés, sans rien changer pour vos utilisateurs connectés ni pour le reste de l’API. Ajoutez ce code dans un mu-plugin plutôt que dans le fichier functions.php de votre thème : il restera actif si vous changez de thème.
Un visiteur anonyme qui demande la liste des utilisateurs, ou la fiche de l’un d’eux, reçoit désormais une erreur 404 :
Les requêtes authentifiées y ont toujours accès : l’éditeur de blocs peut toujours proposer le choix de l’auteur d’un article, et une application connectée avec un mot de passe d’application obtient toujours la liste. Ne vous étonnez pas, en revanche, de recevoir cette erreur 404 en ouvrant l’adresse dans votre navigateur alors que vous êtes connecté : sans jeton de sécurité (nonce), WordPress traite la requête comme anonyme.
Par code : réserver l’API REST aux utilisateurs connectés
Pour aller plus loin, comme le fait Disable REST API, le filtre rest_authentication_errors permet de refuser toute requête anonyme à l’API REST. Ce code reprend celui que propose la documentation officielle de l’API REST :
Les visiteurs anonymes reçoivent alors une erreur 401 avec le message « You are not currently logged in. », quelle que soit la route demandée. L’éditeur de blocs continue de fonctionner, puisque vous y êtes connecté, tout comme les applications qui s’authentifient avec un mot de passe d’application. En revanche, tout ce qui interroge l’API REST pour le compte de vos visiteurs cesse de fonctionner, par exemple l’envoi des formulaires de Contact Form 7 ou l’intégration de vos articles sur d’autres sites WordPress, qui passe par l’API oEmbed. Testez vos formulaires et vos pages en navigation privée après l’avoir mis en place, et préférez la méthode précédente au moindre doute.
Ce type de durcissement se vérifie à chaque version de WordPress : déléguez ce suivi à mon offre de maintenance préventive WordPress.
Autre précaution simple : masquer le numéro de version de WordPress.
12 réponses
« Il semblerait que Ninjafirewall le bloque aussi par défaut. » et « installé sous forme de MU »
Ce n’est pas une bonne idée de le mettre par défaut. C’est une fonctionnnalité, elle peut être désactivée si on estime que c’est un problème de sécurité. Pour moi ça en est un certes, mais elle peut aussi très bien correspondre à un besoin et dans ce cas le risque encourru est connu. De plus il est possible que ces « uers » soient protégés d’une autre manière de telle que même si je vous donne la liste des users de mon site, vous n’en faites rien (obligation de connaitre le mail pour se logger, double auth, déplacement de la page de login, combo triple)
« En attendant une évolution plus restrictive de l’accès à ce type d’information, une solution pour désactiver les requêtes en mode anonyme existe. »
Il n’y en aura pas. Cette « faille » existe déjà dans WordPress nativement, l’API REST n’a rien ouvert comme brèche. Vous souvenez vous de « ?author=1 » ? C’est la même chose ! Vous l’aviez bloqué ? Et bien bloquez aussi cette fonctionnalité rest, mais elle n’est pas plus une faille que ne l’est celle de WP nativement.
😉
Disons plutôt que c’est bloqué avec mes réglages de Ninjafirewall 🙂
J’attendais la réponse de l’expert ! 😎
Faille ou pas faille, appelons cela comme on le veut, il n’en reste pas moins que la plupart des utilisateurs de WordPress n’auront pas connaissance de cette information. Une simple case à cocher pour autoriser l’API REST en back-office ce n’était guère compliquée… Cela me rappelle les anciennes versions qui nous donnaient la possibilité de désactiver XML-RPC. On voit bien les problèmes que cela pose en matière d’hébergement depuis l’ouverture généralisée. Ce sera pareil avec l’API REST à mon sens. :/
Je suis d’accord, la plupart ne sauront pas et cette même plupart veulent le désactiver.
Dans tout bon plugin de sécurité vous devriez trouver rapidement de quoi désactiver ça via une coche.
Merci pour l’info !
installée sur tous mes sites en attendant une mise à jour.
Si ça peut aider un lecteur pour bloquer l’accès à la liste des membres du site :
add_filter( ‘rest_endpoints’, function( $endpoints ){
if ( isset( $endpoints[‘/wp/v2/users’] ) ) {
unset( $endpoints[‘/wp/v2/users’] );
}
if ( isset( $endpoints[‘/wp/v2/users/(?P[\d]+)’] ) ) {
unset( $endpoints[‘/wp/v2/users/(?P[\d]+)’] );
}
return $endpoints;
});
Merci !
Du coup si une app android/iOS a besoin de se connecter pour récupérer les derniers posts du site, comment ça se passe si l’accès n’est pas autorisé ?
Tu vas peu etre me dire d’utiliser oAuth.
L’utilisateur n’as pas forcement un compte sur le site en question et ne veut pas forcement créer un compte puis se logger en oAuth.
Merci Aurélien de ce retour, installé sous forme de MU et pour ceux qui tournent sous NGINX :
location /wp-json/wp/v2/users {
deny all;
}
Merci ! 😉
Merci Aurélien.
Pour info, d’après ce que je peux constater, WooCommerce n’est pas impacté : les comptes clients (customer) sont bien protégés même avant l’activation de cette extension.
Il semblerait que Ninjafirewall le bloque aussi par défaut.