WordPress 4.7.1 REST API все еще выставляет пользователей

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 ограничивает это только типами записей, которые указали, что они должны отображаться в REST API. Об этом сообщили Крогсгард и Крис Жан.

После установки плагина 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

и отключить это не очень хорошая идея.

Mirsad
источник
7
Насколько я понимаю, журнал изменений не говорит о том, что пользователи больше не подвергаются опасности. я думаю, что это следует читать как «Экспозиция ограничена пользователями, у которых есть авторские типы постов, которые выставляются для показа через REST API». Таким образом, как только пользователь создает сообщение для типа сообщения, которое становится доступным (в отличие от того, чтобы быть открытым), автор также будет представлен.
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 WP_REST_API для получения более подробной информации об этом.

::ОБНОВИТЬ::

Чтобы удалить все конечные точки API REST по умолчанию, необходимо добавить следующий код:

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

BlueSuiter
источник
По указанной ссылке вы также можете отфильтровать конечные точки ...
BlueSuiter
1
Это лучшее решение на сегодняшний день.
Мирсад
Куда идет этот пользовательский код? Вы не упоминаете, где это должно быть сохранено.
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;
    }

Проверьте весь пост для дальнейших методов.

lowtechsun
источник
1

Вы можете исправить это через конфигурацию nginx / apache:

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

Foo
источник