L'API REST di WordPress 4.7.1 espone ancora gli utenti


28

Ho aggiornato il mio WordPress a 4.7.1, e successivamente ho provato a enumerare gli utenti tramite l'API REST, che dovrebbe essere riparata, ma sono stato in grado di recuperare gli utenti.

https://mywebsite.com/wp-json/wp/v2/users

Produzione:

[{"id":1,"name":"admin","url":"","description":"","link":"https:\/\/mywebsite\/author\/admin\/","slug":"admin","avatar_urls":{"24": ...

Log delle modifiche dall'ultima versione:

L'API REST ha esposto i dati utente per tutti gli utenti che avevano creato un post di un tipo di post pubblico. WordPress 4.7.1 limita questo solo ai tipi di post che hanno specificato che dovrebbero essere mostrati nell'API REST. Segnalato da Krogsgard e Chris Jean.

Dopo aver installato il plug-in Disable REST API, sembra che tutto funzioni correttamente, ma non mi piace usarlo per ogni piccolo plug-in.

L'output dopo aver usato il plugin è:

{"code":"rest_cannot_access","message":"Only authenticated users can access the REST API.","data":{"status":401}}

Come posso risolvere questo problema senza usare il plugin, o perché anche dopo aver aggiornato questo stil esistono?

MODIFICA 30.9.2017

Mi sono reso conto che c'è un conflitto tra contact 7plugin Disable REST APIe che ti darà 401 unauthorizederrore.

Quando si tenta di inviare un messaggio tramite il contact 7modulo, verrà effettuata una richiesta

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

e disabilitarlo non è una buona idea.


7
Per quanto ne so, il log delle modifiche non dice che gli utenti non vengono più esposti. penso che dovrebbe essere letto come "L'esposizione si limita agli utenti che hanno creato tipi di post che sono impostati per essere esposti tramite l'API REST". Quindi non appena un utente pubblica un post per un tipo di post che viene esposto (al contrario di essere solo pubblico), anche l'autore verrà esposto.
JHoffmann,

Forse questo link potrebbe esserti di aiuto: wordpress.stackexchange.com/questions/228585/…
Pablo,

Risposte:


22

Usa questo frammento di codice per nascondere l'elenco degli utenti e dare come risultato 404, mentre il resto delle chiamate API continua a funzionare come prima.

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

Puoi fare riferimento a questo link sul repository gitHub di WP_REST_API per ulteriori dettagli sullo stesso.

::AGGIORNARE::

Per rimuovere tutti gli endpoint API REST predefiniti è necessario aggiungere il seguente codice:

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


come da link di riferimento puoi anche filtrare gli endpoint ...
BlueSuiter

1
Questa è la soluzione migliore finora.
Mirsad,

Dove va questo codice personalizzato? Non menzionate dove deve essere salvato.
Wruckie,

Puoi tenerlo nel functions.phptuo tema.
BlueSuiter il

Questa soluzione disabilita tutte le operazioni CRUD sugli utenti, vedi questa implementazione solo per richieste GET: github.com/szepeviktor/wordpress-fail2ban/commit/…
Szépe Viktor

2

Rimuovi il link API dall'header HTML, se lo desideri.

// https://wordpress.stackexchange.com/a/211469/77054
// https://wordpress.stackexchange.com/a/212472
remove_action( 'wp_head', 'rest_output_link_wp_head', 10 );

Quindi richiede l'autenticazione per tutte le richieste.

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

Questo ti lascerà con il messaggio desiderato.

Ora per interrompere l'enumerazione potresti usare qualcosa del genere.

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

Dai un'occhiata all'intero post per ulteriori tecniche.


1

Puoi risolverlo tramite la configurazione di nginx / apache:

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

-1

Per essere in grado di risolvere questo problema, devi prima conoscere l'origine del problema.

  1. Usi plugin SEO come: Tutto in un pacchetto SEO o Yoast? Prova a disabilitarlo e ricontrolla.
  2. Usi il plug-in Jetpack? Prova a disabilitarlo e ricontrolla.

Per favore fatemi sapere se questo vi ha indicato nella giusta direzione.

Un modo sporco per risolvere questo è semplicemente bloccare l'URL sottostante nei tuoi .htacces. https://mywebsite.com/wp-json/wp/v2/users

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.