web-dev-qa-db-fra.com

WordPress 4.7.1 REST API exposant toujours les utilisateurs

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.

28
mirsad

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); ?>

21
BlueSuiter

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.

1
lowtechsun

Vous pouvez le réparer via la configuration nginx/Apache:

location ~* /wp-json/wp/v2/users {
        allow ip_address;
        deny all;
}
1
vim