WordPress 4.7.1 REST API masih mengekspos pengguna

28

Saya telah memutakhirkan WordPress saya 4.7.1, dan setelah itu saya mencoba untuk menghitung pengguna melalui REST API, yang harus diperbaiki, tetapi saya dapat mengambil pengguna.

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

Keluaran:

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

Changelog dari versi terbaru:

API REST memaparkan data pengguna untuk semua pengguna yang telah menulis posting dari jenis posting publik. WordPress 4.7.1 membatasi ini hanya untuk jenis posting yang telah menentukan bahwa mereka akan ditampilkan dalam REST API. Dilaporkan oleh Krogsgard dan Chris Jean.

Setelah menginstal plugin Disable REST API, tampaknya semuanya berfungsi dengan baik, tapi saya tidak suka menggunakan untuk setiap hal kecil.

Output setelah menggunakan plugin adalah:

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

Bagaimana saya dapat memperbaiki masalah ini tanpa menggunakan plugin, atau mengapa bahkan setelah meningkatkan masih ada?

EDIT 30.9.2017

Saya menyadari bahwa ada konflik antara contact 7plugin dan Disable REST APIdan itu akan memberi Anda 401 unauthorizedkesalahan.

Ketika Anda mencoba mengirim pesan melalui contact 7formulir, itu akan membuat permintaan

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

dan menonaktifkan itu bukan ide yang baik.

mirsad
sumber
7
Sesuai pemahaman saya, changelog tidak mengatakan bahwa pengguna tidak lagi terbuka. saya pikir itu harus dibaca sebagai "Eksposur menjadi terbatas untuk pengguna yang telah menulis jenis posting yang diatur untuk diekspos melalui REST API." Jadi, segera setelah pengguna menulis posting untuk jenis posting yang terbuka (berbeda dengan hanya menjadi publik), penulis juga akan terbuka.
JHoffmann
Mungkin tautan ini dapat membantu Anda: wordpress.stackexchange.com/questions/228585/…
Pablo

Jawaban:

22

Gunakan potongan kode ini karena itu akan menyembunyikan daftar pengguna dan memberikan 404 sebagai hasilnya, sementara sisa panggilan api tetap berjalan seperti sebelumnya.

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

Anda dapat merujuk ke tautan ini di repo gitHub dari WP_REST_API untuk detail lebih lanjut tentang hal yang sama.

::MEMPERBARUI::

Untuk menghapus semua titik akhir REST API default Anda harus menambahkan kode berikut:

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

BlueSuiter
sumber
sesuai tautan yang
direferensikan
1
Ini adalah solusi terbaik sejauh ini.
mirsad
Kemana kode kustom ini pergi? Anda tidak menyebutkan di mana ini harus diselamatkan.
wruckie
Anda dapat menyimpan ini di functions.phpdalam tema Anda.
BlueSuiter
Solusi ini menonaktifkan semua operasi CRUD pada pengguna, lihat implementasi ini hanya untuk permintaan GET: github.com/szepeviktor/wordpress-fail2ban/commit/…
Szépe Viktor
2

Hapus tautan API dari kepala HTML jika Anda mau.

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

Kemudian memerlukan otentikasi untuk semua permintaan.

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

Ini akan memberi Anda pesan yang diinginkan.

Sekarang untuk menghentikan pencacahan, Anda dapat menggunakan sesuatu seperti ini.

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

Lihat seluruh pos untuk teknik lebih lanjut.

teknik rendah
sumber
1

Anda dapat memperbaikinya melalui konfigurasi nginx / apache:

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

Untuk dapat memperbaikinya, Anda harus terlebih dahulu mengetahui sumber masalahnya.

  1. Apakah Anda menggunakan plugin SEO seperti: Paket SEO lengkap atau Yoast? Coba nonaktifkan ini dan periksa lagi.
  2. Apakah Anda menggunakan plugin Jetpack? Coba nonaktifkan ini dan periksa lagi.

Tolong beri tahu saya jika ini mengarahkan Anda ke arah yang benar.

Cara kotor untuk menyelesaikan ini adalah dengan hanya memblokir url di bawahnya di .htacces Anda. https://mywebsite.com/wp-json/wp/v2/users

Foo
sumber