WordPress 4.7.1 API REST як і раніше відкриває користувачів


28

Я модернізував WordPress до 4.7.1, і після цього я спробував перерахувати користувачів за допомогою REST API, який слід виправити, але мені вдалося знайти користувачів.

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

Вихід:

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

Журнал змін з останньої версії:

API REST викрив дані користувачів для всіх користувачів, які були автором публікації публічного типу публікації. WordPress 4.7.1 обмежує це лише типами публікацій, які вказали, що їх слід відображати в API REST. Доповіли Крогсгард та Кріс Жан.

Після установки плагіна Disable REST APIздається, що все працює нормально, але я не люблю використовувати для кожної дрібниці плагін.

Вихід після використання плагіна:

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

Як я можу виправити цю проблему, не використовуючи плагін, або чому навіть після оновлення цього стилю існує?

РЕДАКЦІЯ 30.9.2017

Я зрозумів, що конфлікт між contact 7плагіном Disable REST APIі тим може призвести до 401 unauthorizedпомилки.

Коли ви спробуєте надіслати повідомлення через contact 7форму, він зробить запит

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

і відключити це не дуже добре.


7
Наскільки я розумію, журнал змін не говорить про те, що користувачі більше не піддаються впливу. Я думаю, що це слід читати як "Експозиція обмежується користувачами, які мають авторські типи публікацій, які встановлені для викриття через API REST". Отже, як тільки користувачі створюють публікацію для типу публікації, яка піддається впливу (на відміну від просто публічної), автор також буде відкритий.
JHoffmann

Можливо, це посилання може вам допомогти: wordpress.stackexchange.com/questions/228585/…
Пабло

Відповіді:


22

Використовуючи цей фрагмент коду, він приховатиме список користувачів та дасть 404 як результат, а решта api-дзвінків продовжують працювати як раніше.

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

Ви можете посилатися на це посилання на gitHub repo WP_REST_API, щоб отримати докладнішу інформацію про те саме.

:: ОНОВЛЕННЯ ::

Щоб видалити всі кінцеві точки API REST API, потрібно додати наступний код:

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


за посиланням на яке ви можете також відфільтрувати кінцеві точки ...
BlueSuiter

1
Це найкраще рішення поки що.
mirsad

Куди йде цей спеціальний код? Ви не згадуєте, де це зберегти.
wruckie

Ви можете зберегти це у functions.phpсвоїй темі.
BlueSuiter

Це рішення вимикає всі дії CRUD для користувачів, дивіться цю реалізацію лише для GET-запитів: github.com/szepeviktor/wordpress-fail2ban/commit/…
Szépe Viktor

2

Видаліть посилання API з голови HTML, якщо хочете.

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

Тоді потрібна автентифікація для всіх запитів.

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

Це залишить вам потрібне повідомлення.

Тепер для припинення перерахування ви можете використовувати щось подібне.

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

Ознайомтеся з цілою публікацією щодо подальших прийомів.


1

Ви можете виправити це через nginx / apache config:

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

-1

Щоб мати змогу це виправити, спершу потрібно знати джерело проблеми.

  1. Чи використовуєте ви плагіни SEO на кшталт: Все в одному SEO-пакеті або Yoast? Спробуйте відключити це і перевірте ще раз.
  2. Чи використовуєте ви плагін Jetpack? Спробуйте відключити це і перевірте ще раз.

Будь ласка, дайте мені знати, чи це спрямувало вас у правильний бік.

Брудний спосіб вирішити це - просто заблокувати URL-адресу під вашими .htacces. https://mywebsite.com/wp-json/wp/v2/users

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.