J'ai mis à niveau mon WordPress vers 4.7.1
, puis j'ai essayé d'énumérer les utilisateurs via l'API REST, qui devrait être corrigée, mais j'ai pu récupérer des utilisateurs.
https://mywebsite.com/wp-json/wp/v2/users
Sortie:
[{"id":1,"name":"admin","url":"","description":"","link":"https:\/\/mywebsite\/author\/admin\/","slug":"admin","avatar_urls":{"24": ...
Changelog de la dernière version:
L'API REST a exposé les données utilisateur de tous les utilisateurs ayant créé une publication d'un type de publication publique. WordPress 4.7.1 limite cela aux articles suivants qui ont spécifié qu'ils doivent être affichés dans l'API REST. Rapporté par Krogsgard et Chris Jean.
Après avoir installé le plugin Disable REST API
, il semble que tout fonctionne bien, mais je n'aime pas utiliser pour chaque plugin.
La sortie après utilisation du plugin est:
{"code":"rest_cannot_access","message":"Only authenticated users can access the REST API.","data":{"status":401}}
Comment puis-je résoudre ce problème sans utiliser de plugin, ou pourquoi, même après la mise à niveau, il existe toujours?
EDIT 30.9.2017
J'ai réalisé qu'il y avait un conflit entre le plugin contact 7
et le Disable REST API
et que cela vous donnerait une erreur 401 unauthorized
.
Lorsque vous essayez d'envoyer un message par le biais du formulaire contact 7
, une requête sera émise.
wp-json/contact-form-7/v1/contact-forms/258/feedback
et désactiver ce n’est pas une bonne idée.
Utilisez cet extrait de code, il masquera la liste des utilisateurs et donnera 404 comme résultat, tandis que les appels restants de l'API continueront de fonctionner comme ils étaient.
add_filter( 'rest_endpoints', function( $endpoints ){
if ( isset( $endpoints['/wp/v2/users'] ) ) {
unset( $endpoints['/wp/v2/users'] );
}
if ( isset( $endpoints['/wp/v2/users/(?P<id>[\d]+)'] ) ) {
unset( $endpoints['/wp/v2/users/(?P<id>[\d]+)'] );
}
return $endpoints;
});
Vous pouvez vous référer au repo this link on gitHub de WP_REST_API pour plus de détails à ce sujet.
:: UPDATE ::
Pour supprimer tous les points finaux de l'API REST par défaut, vous devez ajouter le code suivant:
<?php remove_action('rest_api_init', 'create_initial_rest_routes', 99); ?>
Supprimez le lien API de la tête HTML si vous le souhaitez.
// https://wordpress.stackexchange.com/a/211469/77054
// https://wordpress.stackexchange.com/a/212472
remove_action( 'wp_head', 'rest_output_link_wp_head', 10 );
Ensuite, demandez une authentification pour toutes les demandes.
// You can require authentication for all REST API requests by adding an is_user_logged_in check to the rest_authentication_errors filter.
add_filter( 'rest_authentication_errors', function( $result ) {
if ( ! empty( $result ) ) {
return $result;
}
if ( ! is_user_logged_in() ) {
return new WP_Error( 'rest_not_logged_in', 'Only authenticated users can access the REST API.', array( 'status' => 401 ) );
}
return $result;
});
Cela vous laissera avec le message souhaité.
Maintenant, pour arrêter l’énumération, vous pouvez utiliser quelque chose comme ceci.
// https://perishablepress.com/stop-user-enumeration-wordpress/
// block WP enum scans
// https://m0n.co/enum
if (!is_admin()) {
// default URL format
if (preg_match('/author=([0-9]*)/i', $_SERVER['QUERY_STRING'])) die();
add_filter('redirect_canonical', 'shapeSpace_check_enum', 10, 2);
}
function shapeSpace_check_enum($redirect, $request) {
// permalink URL format
if (preg_match('/\?author=([0-9]*)(\/*)/i', $request)) die();
else return $redirect;
}
Découvrez le post entier pour d'autres techniques.
Vous pouvez le réparer via la configuration nginx/Apache:
location ~* /wp-json/wp/v2/users {
allow ip_address;
deny all;
}