सार्वजनिक देखने से वर्डप्रेस रीस्ट एपीआई v2 एंडपॉइंट्स को छिपाना


15

मैं अपनी साइट से जानकारी क्वेरी करने के लिए WordPress REST API v2 का उपयोग शुरू करना चाहूंगा । मैंने देखा है कि जब मैं सीधे एक समापन बिंदु URL पर जाता हूं, तो मैं सार्वजनिक रूप से सभी डेटा देख सकता हूं। मैंने यह भी देखा है कि बहुत सारे ट्यूटोरियल लाइव साइटों के बजाय परीक्षण या स्थानीय सर्वर के उपयोग का उल्लेख करते हैं।

मेरे प्रश्न हैं:

  • यह उत्पादन में साइटों पर इस्तेमाल किया जा रहा है?
  • क्या किसी समापन बिंदु को किसी को भी देखने की अनुमति देने के लिए सुरक्षा जोखिम है, जैसे कि /wp-json/wp/v2/users/सभी उपयोगकर्ता साइट पर पंजीकृत दिखाता है?
  • क्या केवल अधिकृत उपयोगकर्ताओं को एक समापन बिंदु तक पहुंचने की अनुमति देना संभव है?

मैं यह सुनिश्चित करना चाहता हूं कि मैं सुरक्षा के संबंध में सर्वोत्तम प्रथाओं का पालन कर रहा हूं, इसलिए कोई भी सुझाव मददगार होगा। एपीआई डॉक्स प्रमाणीकरण का उल्लेख है, लेकिन मुझे यकीन है कि कैसे सीधे पहुँचा जा रहा से URL को रोकने के लिए नहीं कर रहा हूँ। बहुत अधिक जानकारी को उजागर किए बिना अन्य डेटा को बाहरी अनुप्रयोगों द्वारा एक्सेस करने के लिए आमतौर पर अन्य लोग इस डेटा को कैसे सेट करते हैं?


1
असली सवाल यह है, क्या आप एंडपॉइंट क्लाइंट साइड (यानी AJAX कॉल में), या सर्वर साइड (शायद किसी अन्य एप्लिकेशन से) का उपयोग कर रहे हैं?
TheDeadMedic

1
नोट: WordFence प्लगइन के सबसे हाल के संस्करण में "के माध्यम से उपयोगकर्ता नाम की खोज को रोकने के लिए एक विकल्प है? लेखक = एन 'स्कैन, oEmbed एपीआई और वर्डप्रेस बाकी एपीआई"
squarecandy

जवाबों:


18

यह उत्पादन में साइटों पर इस्तेमाल किया जा रहा है?

हाँ। कई साइट्स पहले से ही इसका इस्तेमाल कर रही हैं

क्या एंडपॉइंट को किसी को भी देखने की अनुमति देने के लिए कोई सुरक्षा जोखिम है, जैसे / wp-json / wp / v2 / users / जो सभी उपयोगकर्ताओं को साइट पर पंजीकृत दिखाता है?

नहीं। सर्वर की प्रतिक्रियाओं का सुरक्षा से कोई लेना-देना नहीं है, आप रिक्त स्क्रीन के साथ क्या कर सकते हैं / केवल एक्सेस पढ़ सकते हैं? कुछ भी तो नहीं!

हालाँकि, यदि आपकी साइटें कमजोर पासवर्ड की अनुमति देती हैं, तो कुछ समस्याएं हैं । लेकिन यह आपकी साइटों की नीति है, REST API को इस बारे में कुछ नहीं पता है।

क्या केवल अधिकृत उपयोगकर्ताओं को एक समापन बिंदु तक पहुंचने की अनुमति देना संभव है?

हाँ। आप इसे अनुमति कॉलबैक का उपयोग करके कर सकते हैं ।

उदाहरण के लिए:

if ( 'edit' === $request['context'] && ! current_user_can( 'list_users' ) ) {
    return new WP_Error( 'rest_forbidden_context', __( 'Sorry, you cannot view this resource with edit context.' ), array( 'status' => rest_authorization_required_code() ) );
}

बहुत अधिक जानकारी को उजागर किए बिना अन्य डेटा को बाहरी अनुप्रयोगों द्वारा एक्सेस करने के लिए आमतौर पर अन्य लोग इस डेटा को कैसे सेट करते हैं?

इस प्रश्न का उत्तर देना कठिन है क्योंकि हम यह नहीं जानते कि क्या / कब बहुत अधिक जानकारी है । लेकिन हम सभी संदर्भ और धोखा दे रहे हैं


1
नोट करने के लिए महत्वपूर्ण: "एक्सपोजर उन उपयोगकर्ताओं तक सीमित है जिनके पास पोस्ट प्रकार हैं जो कि REST एपीआई के माध्यम से उजागर होने के लिए निर्धारित हैं।" - इसलिए यदि आपने कहा है, एक ऑनलाइन स्टोर जहां हर ग्राहक के पास एक उपयोगकर्ता है, इन उपयोगकर्ताओं को इसके माध्यम से उजागर नहीं किया जाता है /wp-json/wp/v2/users/। (संदर्भ wordpress.stackexchange.com/q/252328/41488 @JHoffmann टिप्पणी)
स्क्वायर

यह ध्यान दिया जाना चाहिए कि आपको 'X-WP-Nonce' हैडर में REST आधारित नॉन wp_create_bonce ('wp_rest') होना चाहिए, या इस सामान में से कोई भी काम नहीं करेगा, और हमेशा 403 लौटाएगा।
एंड्रयू किलेन

5

क्या केवल अधिकृत उपयोगकर्ताओं को एक समापन बिंदु तक पहुंचने की अनुमति देना संभव है?

अपने एपीआई एंडपॉइंट पर एक कस्टम अनुमति कॉलबैक जोड़ना संभव है जिसे सामग्री देखने के लिए प्रमाणीकरण की आवश्यकता होती है। अनधिकृत उपयोगकर्ताओं को एक त्रुटि प्रतिक्रिया प्राप्त होगी"code": "rest_forbidden"

ऐसा करने का सबसे सरल तरीका WP_REST_Posts_Controller है। यहाँ इसका एक बहुत ही सरल उदाहरण दिया गया है:

class My_Private_Posts_Controller extends WP_REST_Posts_Controller {

   /**
   * The namespace.
   *
   * @var string
   */
   protected $namespace;

   /**
   * The post type for the current object.
   *
   * @var string
   */
   protected $post_type;

   /**
   * Rest base for the current object.
   *
   * @var string
   */
   protected $rest_base;

  /**
   * Register the routes for the objects of the controller.
   * Nearly the same as WP_REST_Posts_Controller::register_routes(), but with a 
   * custom permission callback.
   */
  public function register_routes() {
    register_rest_route( $this->namespace, '/' . $this->rest_base, array(
        array(
            'methods'             => WP_REST_Server::READABLE,
            'callback'            => array( $this, 'get_items' ),
            'permission_callback' => array( $this, 'get_items_permissions_check' ),
            'args'                => $this->get_collection_params(),
            'show_in_index'       => true,
        ),
        array(
            'methods'             => WP_REST_Server::CREATABLE,
            'callback'            => array( $this, 'create_item' ),
            'permission_callback' => array( $this, 'create_item_permissions_check' ),
            'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ),
            'show_in_index'       => true,
        ),
        'schema' => array( $this, 'get_public_item_schema' ),
    ) );

    register_rest_route( $this->namespace, '/' . $this->rest_base . '/(?P<id>[\d]+)', array(
        array(
            'methods'             => WP_REST_Server::READABLE,
            'callback'            => array( $this, 'get_item' ),
            'permission_callback' => array( $this, 'get_item_permissions_check' ),
            'args'                => array(
                'context' => $this->get_context_param( array( 'default' => 'view' ) ),
            ),
            'show_in_index'       => true,
        ),
        array(
            'methods'             => WP_REST_Server::EDITABLE,
            'callback'            => array( $this, 'update_item' ),
            'permission_callback' => array( $this, 'update_item_permissions_check' ),
            'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
            'show_in_index'       => true,
        ),
        array(
            'methods'             => WP_REST_Server::DELETABLE,
            'callback'            => array( $this, 'delete_item' ),
            'permission_callback' => array( $this, 'delete_item_permissions_check' ),
            'args'                => array(
                'force' => array(
                    'default'     => true,
                    'description' => __( 'Whether to bypass trash and force deletion.' ),
                ),
            ),
            'show_in_index'       => false,
        ),
        'schema' => array( $this, 'get_public_item_schema' ),
    ) );     
  }

  /**
   * Check if a given request has access to get items
   *
   * @param WP_REST_Request $request Full data about the request.
   * @return WP_Error|bool
   */
  public function get_items_permissions_check( $request ) {
    return current_user_can( 'edit_posts' );
  }

}

आप देखेंगे कि अनुमतियाँ कॉलबैक यह निर्धारित करने के लिए function get_items_permissions_checkउपयोग current_user_canकरती है कि क्या एक्सेस की अनुमति है। आप एपीआई का उपयोग कैसे कर रहे हैं, इसके आधार पर, आपको क्लाइंट प्रमाणीकरण के बारे में अधिक जानने की आवश्यकता हो सकती है।

फिर आप निम्न तर्क जोड़कर अपने कस्टम पोस्ट प्रकार को REST API समर्थन के साथ पंजीकृत कर सकते हैं register_post_type

  /**
   * Register a book post type, with REST API support
   *
   * Based on example at: http://codex.wordpress.org/Function_Reference/register_post_type
   */
  add_action( 'init', 'my_book_cpt' );
  function my_book_cpt() {
    $labels = array(
        'name'               => _x( 'Books', 'post type general name', 'your-plugin-textdomain' ),
        'singular_name'      => _x( 'Book', 'post type singular name', 'your-plugin-textdomain' ),
        'menu_name'          => _x( 'Books', 'admin menu', 'your-plugin-textdomain' ),
        'name_admin_bar'     => _x( 'Book', 'add new on admin bar', 'your-plugin-textdomain' ),
        'add_new'            => _x( 'Add New', 'book', 'your-plugin-textdomain' ),
        'add_new_item'       => __( 'Add New Book', 'your-plugin-textdomain' ),
        'new_item'           => __( 'New Book', 'your-plugin-textdomain' ),
        'edit_item'          => __( 'Edit Book', 'your-plugin-textdomain' ),
        'view_item'          => __( 'View Book', 'your-plugin-textdomain' ),
        'all_items'          => __( 'All Books', 'your-plugin-textdomain' ),
        'search_items'       => __( 'Search Books', 'your-plugin-textdomain' ),
        'parent_item_colon'  => __( 'Parent Books:', 'your-plugin-textdomain' ),
        'not_found'          => __( 'No books found.', 'your-plugin-textdomain' ),
        'not_found_in_trash' => __( 'No books found in Trash.', 'your-plugin-textdomain' )
    );

    $args = array(
        'labels'             => $labels,
        'description'        => __( 'Description.', 'your-plugin-textdomain' ),
        'public'             => true,
        'publicly_queryable' => true,
        'show_ui'            => true,
        'show_in_menu'       => true,
        'query_var'          => true,
        'rewrite'            => array( 'slug' => 'book' ),
        'capability_type'    => 'post',
        'has_archive'        => true,
        'hierarchical'       => false,
        'menu_position'      => null,
        'show_in_rest'       => true,
        'rest_base'          => 'books-api',
        'rest_controller_class' => 'My_Private_Posts_Controller',
        'supports'           => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' )
    );

    register_post_type( 'book', $args );
}

आपको डिफ़ॉल्ट नियंत्रक के बजाय rest_controller_classउपयोग दिखाई देगा My_Private_Posts_Controller

मुझे प्रलेखन के बाहर REST API का उपयोग करने के लिए अच्छे उदाहरण और स्पष्टीकरण खोजने में मुश्किल हो रही है । मुझे डिफ़ॉल्ट नियंत्रक को विस्तारित करने का यह शानदार विवरण मिला , और यहां समापन बिंदुओं को जोड़ने के लिए बहुत ही गहन मार्गदर्शिका है


2

यहाँ पर मैंने REST API का उपयोग करने वाले सभी गैर-लॉग इन उपयोगकर्ताओं को ब्लॉक करने के लिए उपयोग किया है:

add_filter( 'rest_api_init', 'rest_only_for_authorized_users', 99 );
function rest_only_for_authorized_users($wp_rest_server){
    if ( !is_user_logged_in() ) {
        wp_die('sorry you are not allowed to access this data','cheatin eh?',403);
    }
}

जैसे-जैसे रेस्ट एंड प्वाइंट का उपयोग विस्तार होता जा रहा है, इस तरह की रणनीति समस्यात्मक होती जाएगी। अंत में wp-json end पॉइंट एडमिन-ajax एक की जगह लेगा, जिसका अर्थ है कि सभी प्रकार के वैध फ्रंट एंड अनुरोध भी होंगे। वैसे भी, 403 के साथ मरने के लिए बेहतर है कि सामग्री के रूप में व्याख्या की जाए।
मार्क कप्लुन

@MarkKaplun - हाँ, आप इसके बारे में सही हैं। मैं इसका उपयोग उस साइट के संदर्भ में कर रहा हूं जो अनिवार्य रूप से कोई सार्वजनिक डेटा प्रदान नहीं करती है और जो डेटा हम उपयोगकर्ताओं, उपयोगकर्ता मेटा, कस्टम पोस्ट प्रकार डेटा, आदि सहित संग्रहीत कर रहे हैं, वह मालिकाना डेटा है जिसे जनता द्वारा कभी एक्सेस नहीं किया जाना चाहिए । यह सुनिश्चित करता है कि जब आप निश्चित डेटा को निजी बनाने के लिए क्लासिक WP टेम्पलेट संरचना के भीतर काम का एक गुच्छा करते हैं और फिर अचानक महसूस करते हैं कि यह सार्वजनिक रूप से REST API के माध्यम से उपलब्ध है। वैसे भी, एक 403 की सेवा के बारे में अच्छी बात है ...
squarecandy

0
add_filter( 'rest_api_init', 'rest_only_for_authorized_users', 99 );
function rest_only_for_authorized_users($wp_rest_server)
{
if( !is_user_logged_in() ) 

    wp_die('sorry you are not allowed to access this data','Require Authentication',403);
} } 
function json_authenticate_handler( $user ) {

global $wp_json_basic_auth_error;

$wp_json_basic_auth_error = null;

// Don't authenticate twice
if ( ! empty( $user ) ) {
    return $user;
}

if ( !isset( $_SERVER['PHP_AUTH_USER'] ) ) {
    return $user;
}

$username = $_SERVER['PHP_AUTH_USER'];
$password = $_SERVER['PHP_AUTH_PW'];


remove_filter( 'determine_current_user', 'json_authenticate_handler', 20 );

$user = wp_authenticate( $username, $password );

add_filter( 'determine_current_user', 'json_authenticate_handler', 20 );

if ( is_wp_error( $user ) ) {
    $wp_json_basic_auth_error = $user;
    return null;
}

$wp_json_basic_auth_error = true;

return $user->ID;}add_filter( 'determine_current_user', 'json_authenticate_handler', 20 );

1
क्या आप पाठ में विस्तार से जान सकते हैं कि यह ओपी के सवालों का जवाब क्यों और कैसे देता है?
केरो

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