Interfejs API REST WordPress 4.7.1 nadal udostępnia użytkowników

28

Zaktualizowałem WordPress do 4.7.1, a potem próbowałem wyliczyć użytkowników za pomocą REST API, co powinno zostać naprawione, ale udało mi się odzyskać użytkowników.

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

Wydajność:

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

Dziennik zmian z najnowszej wersji:

Interfejs API REST ujawnił dane użytkownika dla wszystkich użytkowników, którzy byli autorami postów typu publicznego. WordPress 4.7.1 ogranicza to tylko do typów postów, które określiły, że powinny być wyświetlane w interfejsie API REST. Zgłoszone przez Krogsgard i Chris Jean.

Po zainstalowaniu wtyczki Disable REST APIwydaje się, że wszystko działa dobrze, ale nie lubię używać jej do każdej drobiazgi.

Dane wyjściowe po użyciu wtyczki to:

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

Jak mogę rozwiązać ten problem bez użycia wtyczki lub dlaczego istnieją nawet po aktualizacji tego stil?

EDYCJA 30.9.2017

Uświadomiłem sobie, że istnieje konflikt między contact 7wtyczką Disable REST APIi to spowoduje 401 unauthorizedbłąd.

Gdy spróbujesz wysłać wiadomość za pośrednictwem contact 7formularza, zostanie wysłane żądanie

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

i wyłączenie to nie jest dobry pomysł.

mirsad
źródło
7
Według mnie dziennik zmian nie mówi, że użytkownicy nie są już narażeni. myślę, że należy to rozumieć jako „Narażenie ogranicza się do użytkowników, którzy są autorami typów postów, które mają być udostępniane za pośrednictwem interfejsu API REST”. Tak więc, jak tylko użytkownik utworzy post dla typu postu, który zostanie ujawniony (w przeciwieństwie do bycia publicznym), autor również zostanie ujawniony.
JHoffmann
Może ten link może ci pomóc: wordpress.stackexchange.com/questions/228585/…
Pablo

Odpowiedzi:

22

Użyj tego fragmentu kodu, aby ukryć listę użytkowników i dać wynik 404, podczas gdy pozostałe wywołania interfejsu API będą działać tak, jak były.

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

Możesz znaleźć ten link na repozytorium gitHub WP_REST_API, aby uzyskać więcej szczegółowych informacji na ten temat.

::AKTUALIZACJA::

Aby usunąć wszystkie domyślne punkty końcowe interfejsu API REST, musisz dodać następujący kod:

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

BlueSuiter
źródło
zgodnie z odnośnikiem można również odfiltrować punkty końcowe ...
BlueSuiter
1
To jak dotąd najlepsze rozwiązanie.
mirsad
Gdzie idzie ten niestandardowy kod? Nie wspominasz, gdzie to ma być zapisane.
wruckie
Możesz zachować to w functions.phpswoim motywie.
BlueSuiter,
To rozwiązanie wyłącza wszystkie operacje CRUD na użytkownikach, zobacz tę implementację tylko dla żądań GET: github.com/szepeviktor/wordpress-fail2ban/commit/…
Szépe Viktor
2

Usuń link API z nagłówka HTML, jeśli chcesz.

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

Następnie wymagaj uwierzytelnienia dla wszystkich żądań.

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

Spowoduje to pozostawienie żądanej wiadomości.

Teraz, aby zatrzymać wyliczanie, możesz użyć czegoś takiego.

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

Sprawdź cały post dla dalszych technik.

lowtechsun
źródło
1

Możesz to naprawić poprzez konfigurację nginx / apache:

location ~* /wp-json/wp/v2/users {
        allow ip_address;
        deny all;
}
wigor
źródło
-1

Aby to naprawić, musisz najpierw poznać źródło problemu.

  1. Czy korzystasz z wtyczek SEO, takich jak: Wszystko w jednym pakiecie SEO lub Yoast? Spróbuj to wyłączyć i sprawdź ponownie.
  2. Czy korzystasz z wtyczki Jetpack? Spróbuj to wyłączyć i sprawdź ponownie.

Daj mi znać, jeśli to skierowało cię w dobrym kierunku.

Brudnym sposobem na rozwiązanie tego problemu jest po prostu zablokowanie adresu URL pod .htacces. https://mywebsite.com/wp-json/wp/v2/users

bla
źródło