L'API REST WordPress 4.7.1 expose toujours les utilisateurs


28

J'ai mis à niveau mon WordPress vers 4.7.1, et après cela, j'ai essayé d'énumérer les utilisateurs via l'API REST, qui devrait être corrigé, mais j'ai pu récupérer les 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": ...

Journal des modifications de la dernière version:

L'API REST a exposé les données utilisateur de tous les utilisateurs qui avaient créé un message de type public. WordPress 4.7.1 limite cela aux seuls types de publication 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 l'utiliser pour chaque petit 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, ce stil existe?

EDIT 30.9.2017

J'ai réalisé qu'il y a un conflit entre le contact 7plugin et Disable REST APIet cela vous donnera une 401 unauthorizederreur.

Lorsque vous essayez d'envoyer un message via le contact 7formulaire, il fera une demande

wp-json/contact-form-7/v1/contact-forms/258/feedback

et désactiver ce n'est pas une bonne idée.


7
D'après ma compréhension, le journal des modifications ne dit pas que les utilisateurs ne sont plus exposés. je pense que cela devrait être lu comme "L'exposition est limitée aux utilisateurs qui ont créé des types de messages qui sont définis pour être exposés via l'API REST." Ainsi, dès qu'un utilisateur crée un message pour un type de message qui est exposé (contrairement au simple fait d'être public), l'auteur sera également exposé.
JHoffmann

Peut-être que ce lien pourrait vous aider: wordpress.stackexchange.com/questions/228585/…
Pablo

Réponses:


22

Utilisez cet extrait de code, il masquera la liste des utilisateurs et donnera le résultat 404, tandis que les autres appels api continueront de fonctionner tels qu'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 à ce lien sur le dépôt gitHub de WP_REST_API pour plus de détails à ce sujet.

::MISE À JOUR::

Pour supprimer tous les points de terminaison de l'API REST par défaut, vous devez ajouter le code suivant:

<?php remove_action('rest_api_init', 'create_initial_rest_routes', 99); ?>


selon le lien référencé, vous pouvez également filtrer les points de terminaison ...
BlueSuiter

1
C'est la meilleure solution jusqu'à présent.
mirsad

Où va ce code personnalisé? Vous ne mentionnez pas où cela doit être enregistré.
wruckie

Vous pouvez conserver cela dans functions.phpvotre thème.
BlueSuiter

Cette solution désactive toutes les opérations CRUD sur les utilisateurs, consultez cette implémentation uniquement pour les demandes GET: github.com/szepeviktor/wordpress-fail2ban/commit/…
Szépe Viktor

2

Supprimez le lien API de la tête HTML si vous le souhaitez.

// /wordpress//a/211469/77054
// /wordpress//a/212472
remove_action( 'wp_head', 'rest_output_link_wp_head', 10 );

Ensuite, exigez 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 le message souhaité.

Maintenant, pour arrêter l'énumération, vous pouvez utiliser quelque chose comme ça.

// 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;
    }

Consultez le post entier pour d'autres techniques.


1

Vous pouvez le corriger via la configuration nginx / apache:

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

-1

Pour pouvoir résoudre ce problème, vous devez d'abord connaître la source du problème.

  1. Utilisez-vous des plugins SEO comme: Tout en un pack SEO ou Yoast? Essayez de désactiver cela et vérifiez à nouveau.
  2. Utilisez-vous le plugin Jetpack? Essayez de désactiver cela et vérifiez à nouveau.

Veuillez me faire savoir si cela vous a orienté dans la bonne direction.

Une sale façon de résoudre ce problème est de simplement bloquer l'URL en dessous dans vos .htacces. https://mywebsite.com/wp-json/wp/v2/users

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.