API REST do WordPress 4.7.1 ainda expondo os usuários

28

Atualizei meu WordPress para 4.7.1e, depois disso, tentei enumerar os usuários por meio da API REST, que deveria ser corrigida, mas consegui recuperar os 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": ...

Registro de alterações 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 publicação pública. O WordPress 4.7.1 limita isso apenas aos tipos de postagem 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 usá-lo em todos os plugins.

A saída após o uso do plugin é:

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

Como posso corrigir esse problema sem usar o plug-in ou por que, mesmo após a atualização, ainda existe?

EDIT 30.9.2017

Percebi que há um conflito entre o contact 7plug-in Disable REST APIe isso gera um 401 unauthorizederro.

Quando você tenta enviar uma mensagem através do contact 7formulário, ele faz uma solicitação

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

e desativar isso não é uma boa ideia.

Mirsad
fonte
7
Pelo que entendi, o changelog não diz que os usuários não são mais expostos. Eu acho que deve ser lido como "Exposição fica limitada a usuários que criaram tipos de postagem que devem ser expostos via API REST". Portanto, assim que um usuário cria uma postagem para um tipo de publicação que é exposta (ao contrário de ser apenas pública), o autor também será exposto.
precisa saber é o seguinte
Talvez este link poderia ser ajuda você: wordpress.stackexchange.com/questions/228585/...
Pablo

Respostas:

22

Use esse trecho de código para ocultar a lista de usuários e fornecer 404 como resultado, enquanto as demais chamadas da API continuam em execução 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 o link this no repositório gitHub do WP_REST_API para obter mais detalhes sobre o mesmo.

::ATUALIZAR::

Para remover todos os pontos de extremidade da API REST padrão, você deve adicionar o seguinte código:

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

BlueSuiter
fonte
de acordo com o link referido, você também pode filtrar os pontos de extremidade ...
BlueSuiter 27/17
1
Esta é a melhor solução até agora.
Mirsad
Para onde vai esse código personalizado? Você não menciona onde isso deve ser salvo.
wruckie
Você pode manter isso dentro functions.phpdo seu tema.
BlueSuiter
Esta solução desativa todas as operações CRUD dos usuários; consulte esta implementação apenas para solicitações GET: github.com/szepeviktor/wordpress-fail2ban/commit/…
Szépe Viktor
2

Remova o link da API do cabeçalho HTML, se desejar.

// 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 interromper a enumeração, você pode 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 completo para obter mais técnicas.

lowtechsun
fonte
1

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

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

Para poder 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 plugin Jetpack? Tente desativar isso e verifique novamente.

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

Uma maneira suja de resolver isso é bloquear o URL abaixo nos seus .htacces. https://mywebsite.com/wp-json/wp/v2/users

Foo
fonte