WordPress 4.7.1 REST API hala kullanıcıları ortaya koyuyor


28

WordPress'imi yükselttim 4.7.1ve ondan sonra kullanıcıları REST API üzerinden numaralandırmaya çalıştım, düzeltilmesi gerekiyor ama kullanıcıları alabildim.

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

Çıktı:

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

En son sürümdeki değişiklik:

REST API, genel bir gönderi türü yayınlayan tüm kullanıcılar için kullanıcı verilerini gösterdi. WordPress 4.7.1 bunu yalnızca REST API'sinde gösterilmesi gerektiğini belirten gönderi türleriyle sınırlandırır. Krogsgard ve Chris Jean tarafından rapor edilmiştir.

Eklentiyi yükledikten sonra Disable REST API, her şey yolunda görünüyor, ancak her küçük şey eklentisi için kullanmaktan hoşlanmıyorum.

Eklentiyi kullandıktan sonra çıktı:

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

Eklenti kullanmadan bu sorunu nasıl düzeltebilirim ya da neden bu stil yükseltildikten sonra bile mevcut?

EDIT 30.9.2017

contact 7Eklenti arasında bir çelişki Disable REST APIolduğunu ve bunun size 401 unauthorizedhata vereceğini anladım .

Bir iletiyi contact 7form aracılığıyla göndermeye çalıştığınızda, istek gönderir

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

ve bunu devre dışı bırakmak iyi bir fikir değildir.


7
Anladığım kadarıyla, bu değişiklik, kullanıcıların artık maruz kalmayacağını söylemiyor. Bence "Maruz kalma, REST API'sine maruz kalmaya ayarlanmış yetkili yazı tiplerine sahip kullanıcılar ile sınırlı hale geliyor" şeklinde okunması gerektiğini düşünüyorum. Dolayısıyla, kullanıcılar maruz kaldıkları bir yazı türü için (yalnızca genel olanın aksine) bir gönderi yazar yazmaz, yazar da ortaya çıkar.
JHoffmann,

Belki bu bağlantı size yardımcı olabilir: wordpress.stackexchange.com/questions/228585/…
Pablo

Yanıtlar:


22

Bu kod parçasını kullanın, kullanıcılar listesini gizler ve sonuç olarak 404'ü verir, api çağrılarının geri kalanı olduğu gibi çalışmaya devam eder.

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

Bu bağlantıya WP_REST_API'nin gitHub deposunda aynı bazı detaylar için başvurabilirsiniz.

::GÜNCELLEŞTİRME::

Tüm varsayılan REST API uç noktalarını kaldırmak için aşağıdaki kodu eklemeniz gerekir:

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



1
Bu, şu ana kadarki en iyi çözüm.
mirsad

Bu özel kod nereye gidiyor? Bunun nereye kaydedileceğini söylemiyorsunuz.
Wruckie

Bunu functions.phptemanın içinde tutabilirsin .
BlueSuiter

Bu çözüm, kullanıcılara yönelik tüm CRUD işlemlerini devre dışı bırakır, yalnızca GET istekleri için bu uygulamaya bakın: github.com/szepeviktor/wordpress-fail2ban/commit/…
Szépe Viktor

2

İsterseniz, API bağlantısını HTML başlığından kaldırın.

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

Ardından tüm istekler için kimlik doğrulaması gerekir.

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

Bu sizi istediğiniz mesajla bırakacaktır.

Şimdi sayımı durdurmak için böyle bir şey kullanabilirsiniz.

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

Daha fazla teknik için tüm gönderiye göz atın.


1

Nginx / apache config ile düzeltebilirsiniz:

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

-1

Bunu düzeltebilmek için önce sorunun kaynağını bilmeniz gerekir.

  1. Aşağıdaki gibi SEO eklentilerini kullanıyor musunuz: Hepsi bir SEO paketinde mi yoksa Yoast'ta mı? Bunu devre dışı bırakmayı ve tekrar kontrol etmeyi deneyin.
  2. Jetpack eklentisini kullanıyor musunuz? Bunu devre dışı bırakmayı ve tekrar kontrol etmeyi deneyin.

Lütfen bu sizi doğru yöne gösteriyorsa bana haber verin.

Bunu çözmenin kirli bir yolu .htacces'inin altındaki url'yi engellemektir. https://mywebsite.com/wp-json/wp/v2/users

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.