वर्डप्रेस 4.7.1 रीस्ट एपीआई अभी भी उपयोगकर्ताओं को उजागर कर रहा है


28

मैंने अपने वर्डप्रेस को अपग्रेड किया है 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 उन सभी उपयोगकर्ताओं के लिए उपयोगकर्ता डेटा को उजागर करता है जिन्होंने सार्वजनिक पोस्ट प्रकार के पोस्ट को अधिकृत किया था। वर्डप्रेस 4.7.1 इसे केवल उन पोस्ट प्रकारों तक सीमित करता है, जिन्होंने निर्दिष्ट किया है कि उन्हें REST API के भीतर दिखाया जाना चाहिए। क्रोग्सगार्ड और क्रिस जीन द्वारा रिपोर्ट की गई।

प्लगइन स्थापित करने के बाद Disable REST API, ऐसा लगता है कि सब कुछ ठीक काम कर रहा है, लेकिन मुझे हर छोटी चीज़ प्लगइन के लिए उपयोग करना पसंद नहीं है।

प्लगइन का उपयोग करने के बाद आउटपुट है:

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

मैं प्लगइन का उपयोग किए बिना इस समस्या को कैसे ठीक कर सकता हूं, या इस स्टिल के उन्नयन के बाद भी क्यों मौजूद है?

EDIT 30.9.2017

मुझे एहसास हुआ कि contact 7प्लगइन के बीच एक संघर्ष है Disable REST APIऔर वह आपको 401 unauthorizedत्रुटि देगा।

जब आप contact 7फ़ॉर्म के माध्यम से संदेश भेजने का प्रयास करते हैं , तो यह एक अनुरोध करेगा

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

और अक्षम करना एक अच्छा विचार नहीं है।


7
मेरी समझ के अनुसार, चेंजलॉग यह नहीं कहता कि उपयोगकर्ता अब उजागर नहीं होते हैं। मुझे लगता है कि इसे पढ़ा जाना चाहिए "एक्सपोजर उन उपयोगकर्ताओं तक सीमित है जिनके पास पोस्ट प्रकार हैं जो आरटीआई एपीआई के माध्यम से उजागर होने के लिए निर्धारित हैं।" इसलिए जैसे ही एक उपयोगकर्ता एक पोस्ट प्रकार के लिए एक लेखक को पोस्ट करता है जो उजागर हो जाता है (बस सार्वजनिक होने के विपरीत), लेखक भी उजागर हो जाएगा।
झॉफमैन

शायद यह लिंक आपकी मदद कर सकता है: wordpress.stackexchange.com/questions/228585/…
पाब्लो

जवाबों:


22

इस कोड स्निपेट का उपयोग करें यह उपयोगकर्ताओं की सूची को छिपाएगा और परिणाम के रूप में 404 देगा, जबकि बाकी एप कॉल चालू रहेंगे जैसा कि वे थे।

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

आप इस लिंक को कुछ और विवरणों के लिए WP_REST_API के gitHub रेपो पर देख सकते हैं ।

::अद्यतन करें::

सभी डिफ़ॉल्ट REST API अंत-बिंदुओं को हटाने के लिए आपको निम्नलिखित कोड जोड़ना होगा:

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


संदर्भित लिंक के अनुसार, आप समापन बिंदु भी फ़िल्टर कर सकते हैं ...
BlueSuiter

1
यह अब तक का सबसे अच्छा समाधान है।
मीरसाड

यह कस्टम कोड कहां जाता है? आप इस बात का उल्लेख नहीं करते हैं कि इसे कहां सहेजना है।
विक्रि

इसे आप functions.phpअपनी थीम पर रख सकते हैं ।
ब्लूसूटर

यह समाधान उपयोगकर्ताओं पर सभी CRUD संचालन को अक्षम करता है, यह कार्यान्वयन केवल GET अनुरोधों के लिए देखें: github.com/szepeviktor/wordpress-fail2ban/commit/…
Szépe Viktor

2

यदि आप चाहें तो 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 प्लग इन का उपयोग करते हैं जैसे: सभी एक एसईओ पैक या योस्ट में? इसे अक्षम करने का प्रयास करें और फिर से जांचें।
  2. क्या आप Jetpack प्लगइन का उपयोग करते हैं? इसे अक्षम करने का प्रयास करें और फिर से जांचें।

कृपया मुझे बताएं कि क्या यह आपको सही दिशा में ले जाता है।

इसे हल करने का एक गंदा तरीका सिर्फ आपके .htacces में मौजूद url को ब्लॉक करना है। https://mywebsite.com/wp-json/wp/v2/users

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.