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によって報告されました。

pluginをインストールした後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 API401 unauthorized発生することに気付きました。

contact 7フォームからメッセージを送信しようとすると、リクエストが行われます

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

それを無効にすることは良い考えではありません。


7
私の理解では、変更ログは、ユーザーがもう公開されないということを言っていません。「露出は、REST APIを介して公開されるように設定された投稿タイプを作成したユーザーに限定される」と読むべきだと思います。そのため、ユーザーが公開された投稿タイプの投稿を作成すると(ただ公開されているのとは対照的に)、作成者も公開されます。
-JHoffmann

たぶん、このリンクはあなたを助けるかもしれません:wordpress.stackexchange.com/questions/228585/…–
パブロ

回答:


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

詳細については、WP_REST_APIのgitHubリポジトリのこのリンクを参照してください。

::更新::

すべてのデフォルトREST APIエンドポイントを削除するには、次のコードを追加する必要があります。

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


参照リンクに従って、エンドポイントを除外することもできます
...-BlueSuiter

1
これがこれまでの最善の解決策です。
mirsad

このカスタムコードはどこに行きますか?これを保存する場所については言及しません。
ラッキー

これをfunctions.phpテーマに含めることができます。
BlueSuiter

このソリューションは、ユーザーのすべてのCRUD操作を無効にし、唯一のGET要求のために、この実装を参照してください。github.com/szepeviktor/wordpress-fail2ban/commit/...
Szépeヴィクトル

2

必要に応じて、HTMLヘッドからAPIリンクを削除します。

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

nginx / apache configで修正できます:

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

-1

これを修正するには、まず問題の原因を知る必要があります。

  1. 次のようなSEOプラグインを使用していますか?すべて1つのSEOパックまたはYoastですか?これを無効にして、もう一度確認してください。
  2. Jetpackプラグインを使用していますか?これを無効にして、もう一度確認してください。

これが正しい方向を示しているかどうかを教えてください。

これを解決する汚い方法は、.htaccesの下にあるURLをブロックすることです。 https://mywebsite.com/wp-json/wp/v2/users

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.