API REST do WordPress 4.7.1 ainda expondo usuários

23

Eu atualizei meu WordPress para 4.7.1 e, depois disso, tentei enumerar usuários por meio da API REST, que deve ser corrigida, mas consegui recuperar usuários.

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

Saída:

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

Changelog da versão mais recente:

  

A API REST expôs dados do usuário para todos os usuários que criaram uma postagem   de um tipo de correio público. O WordPress 4.7.1 limita isso a apenas postar tipos   que especificaram que eles devem ser mostrados na API REST.   Relatado por Krogsgard e Chris Jean.

Depois de instalar o plugin Disable REST API , parece que tudo está funcionando bem, mas eu não gosto de usar para cada pequeno plugin.

A saída depois de usar o plugin é:

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

Como posso corrigir este problema sem usar o plugin, ou porque mesmo após a atualização deste stil existe?

EDIT 30.9.2017

Percebi que há um conflito entre contact 7 plugin e Disable REST API e isso dará a você 401 unauthorized error.

Quando você tentar enviar uma mensagem por meio de contact 7 form, ela fará uma solicitação

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

e desativando isso não é uma boa ideia.

    
por mirsad 13.01.2017 / 01:45
fonte

4 respostas

14

Use este trecho de código para esconder a lista de usuários e dar 404 como resultado, enquanto o resto das chamadas de api continuarão funcionando como estavam.

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

Você pode consultar este link no repositório gitHub do WP_REST_API para obter mais detalhes sobre mesmo.

    
por BlueSuiter 27.01.2017 / 19:38
fonte
1

Remova o link da API da cabeça do HTML, se quiser.

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

Em seguida, exija autenticação para todas as solicitações.

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

Isso deixará você com a mensagem desejada.

Agora, para parar a enumeração, você poderia usar algo assim.

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

Confira o post inteiro para mais técnicas.

    
por lowtechsun 18.06.2017 / 15:38
fonte
0

Você pode corrigi-lo através da configuração do nginx / apache:

location ~* /wp-json/wp/v2/users {
        allow ip_address;
        deny all;
}
    
por vim 12.12.2018 / 14:37
fonte
-1

Para corrigir isso, primeiro você precisa saber a origem do problema.

  1. Você usa plugins de SEO como: Tudo em um pacote de SEO ou Yoast? Tente desativar isso e verifique novamente.
  2. Você usa o plug-in do Jetpack? Tente desativar isso e verifique novamente.

Por favor, deixe-me saber se isso apontou você na direção certa.

Uma maneira suja de resolver isso é apenas bloquear a URL abaixo em suas .htacces. enlace

    
por Foo 24.06.2017 / 20:30
fonte