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": ...

การเปลี่ยนแปลงจากเวอร์ชั่นล่าสุด:

REST API เปิดเผยข้อมูลผู้ใช้สำหรับผู้ใช้ทั้งหมดที่สร้างโพสต์ประเภทโพสต์สาธารณะ WordPress 4.7.1 จำกัด สิ่งนี้เฉพาะโพสต์ประเภทที่ระบุว่าควรจะแสดงใน REST API รายงานโดย Krogsgard และ Chris Jean

หลังจากติดตั้งปลั๊กอิน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
จากความเข้าใจของฉันการเปลี่ยนแปลงไม่ได้บอกว่าผู้ใช้จะไม่ถูกเปิดเผยอีกต่อไป ฉันคิดว่าควรอ่านเนื่องจาก "การเปิดเผยถูก จำกัด เฉพาะผู้ใช้ที่มีประเภทโพสต์ที่สร้างขึ้นซึ่งจะถูกเปิดเผยผ่าน REST API" ดังนั้นทันทีที่ผู้ใช้โพสต์โพสต์สำหรับประเภทโพสต์ที่ได้รับการเปิดเผย (ตรงกันข้ามกับเพิ่งเป็นสาธารณะ) ผู้เขียนก็จะได้สัมผัส
JHoffmann

บางทีลิงก์นี้อาจช่วยคุณได้: wordpress.stackexchange.com/questions/228585/…
Pablo

คำตอบ:


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

คุณสามารถอ้างถึงลิงค์นี้ใน repo gitHub ของ WP_REST_API สำหรับรายละเอียดเพิ่มเติมบางอย่างในเดียวกัน

:: UPDATE ::

ในการลบจุดสิ้นสุด 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 หากคุณต้องการ

// https://wordpress.stackexchange.com/a/211469/77054
// https://wordpress.stackexchange.com/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

ในการแก้ไขปัญหานี้คุณต้องทราบสาเหตุของปัญหาก่อน

  1. คุณใช้ปลั๊กอิน SEO เช่น: ทั้งหมดในชุด SEO หรือ Yoast หรือไม่ ลองปิดการใช้งานและตรวจสอบอีกครั้ง
  2. คุณใช้ปลั๊กอิน Jetpack หรือไม่ ลองปิดการใช้งานและตรวจสอบอีกครั้ง

โปรดแจ้งให้เราทราบหากสิ่งนี้ชี้ให้คุณเห็นว่าถูกทิศทาง

วิธีที่สกปรกในการแก้ปัญหานี้คือเพียงบล็อก url ที่อยู่ใน. htacces ของคุณ https://mywebsite.com/wp-json/wp/v2/users

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.