API WordPress 4.7.1 REST vẫn hiển thị cho người dùng


28

Tôi đã nâng cấp WordPress của mình lên 4.7.1và sau đó tôi đã cố gắng liệt kê người dùng thông qua API REST, cần được sửa, nhưng tôi đã có thể truy xuất người dùng.

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

Đầu ra:

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

Changelog từ phiên bản mới nhất:

API REST hiển thị dữ liệu người dùng cho tất cả người dùng đã tạo ra một bài đăng thuộc loại bài đăng công khai. WordPress 4.7.1 giới hạn điều này chỉ với các loại bài đăng đã chỉ định rằng chúng sẽ được hiển thị trong API REST. Báo cáo bởi Krogsgard và Chris Jean.

Sau khi cài đặt plugin Disable REST API, có vẻ như mọi thứ đều hoạt động tốt, nhưng tôi không muốn sử dụng cho mọi plugin nhỏ.

Đầu ra sau khi sử dụng plugin là:

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

Làm cách nào tôi có thể khắc phục sự cố này mà không cần sử dụng plugin hoặc tại sao ngay cả sau khi nâng cấp bản stil này vẫn tồn tại?

CHỈNH SỬA 30.9.2017

Tôi nhận ra rằng có một xung đột giữa contact 7plugin Disable REST APIvà điều đó sẽ gây ra 401 unauthorizedlỗi cho bạn .

Khi bạn cố gắng gửi tin nhắn qua contact 7biểu mẫu, nó sẽ đưa ra yêu cầu

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

và vô hiệu hóa đó không phải là một ý tưởng tốt.


7
Theo hiểu biết của tôi, changelog không nói rằng người dùng không bị lộ nữa. Tôi nghĩ rằng nó nên được đọc là "Phơi sáng bị giới hạn đối với người dùng đã tạo ra các loại bài đăng được thiết lập để được hiển thị thông qua API REST." Vì vậy, ngay sau khi người dùng tác giả một bài đăng cho một loại bài đăng bị lộ (ngược lại chỉ là công khai), tác giả cũng sẽ bị lộ.
JHoffmann

Có lẽ liên kết này có thể giúp bạn: wordpress.stackexchange.com/questions/228585/iêu
Pablo

Câu trả lời:


22

Sử dụng đoạn mã này, nó sẽ ẩn danh sách người dùng và đưa ra kết quả 404, trong khi các cuộc gọi api còn lại tiếp tục chạy như cũ.

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

Bạn có thể tham khảo liên kết này trên repo gitHub của WP_REST_API để biết thêm chi tiết.

:: CẬP NHẬT ::

Để xóa tất cả các điểm cuối API REST mặc định, bạn phải thêm mã sau đây:

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


theo liên kết được giới thiệu, bạn cũng có thể lọc ra các điểm cuối ...
BlueSuiter

1
Đây là giải pháp tốt nhất cho đến nay.
mirsad

Mã tùy chỉnh này đi đâu? Bạn không đề cập đến nơi này sẽ được lưu.
wruckie

Bạn có thể giữ điều này trong functions.phpchủ đề của bạn.
BlueSuiter

Giải pháp này vô hiệu hóa tất cả các thao tác CRUD trên người dùng, chỉ xem triển khai này cho các yêu cầu GET: github.com/szepeviktor/wordpress-fail2ban/commit/
Lỗi

2

Xóa liên kết API khỏi đầu HTML nếu bạn muốn.

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

Sau đó yêu cầu xác thực cho tất cả các yêu cầu.

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

Điều này sẽ để lại cho bạn với thông điệp mong muốn.

Bây giờ để ngừng liệt kê, bạn có thể sử dụng một cái gì đó như thế này.

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

Kiểm tra toàn bộ bài để biết thêm các kỹ thuật.


1

Bạn có thể sửa nó thông qua nginx / apache config:

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

-1

Để có thể khắc phục điều này trước tiên bạn cần biết nguồn gốc của vấn đề.

  1. Bạn có sử dụng các plugin SEO như: Tất cả trong một gói SEO hoặc Yoast không? Hãy thử vô hiệu hóa điều này và kiểm tra lại.
  2. Bạn có sử dụng plugin Jetpack không? Hãy thử vô hiệu hóa điều này và kiểm tra lại.

Xin vui lòng cho tôi biết nếu điều này chỉ cho bạn đi đúng hướng.

Một cách bẩn để giải quyết vấn đề này là chỉ chặn url bên dưới trong .htacces của bạn. https://mywebsite.com/wp-json/wp/v2/users

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.