WordPress 4.7.1 REST API仍然向用户公开


28

我将WordPress升级到4.7.1,然后尝试通过REST API枚举用户,该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}}

如何在不使用插件的情况下解决此问题,或者为什么甚至在升级此Stil后仍然存在?

编辑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 '17

也许此链接可能对您有所帮助:wordpress.stackexchange.com/questions/228585/…–
Pablo

Answers:


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


根据
引用的

1
这是迄今为止最好的解决方案。
mirsad

该自定义代码在哪里?您没有提及要保存在何处。
wruckie

您可以将其保留在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配置修复它:

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

-1

为了解决此问题,您首先需要知道问题的根源。

  1. 您是否使用SEO插件,例如:全部集成在一个SEO包或Yoast中?尝试禁用此功能,然后再次检查。
  2. 您是否使用Jetpack插件?尝试禁用此功能,然后再次检查。

请告诉我这是否为您指明了正确的方向。

解决此问题的一种肮脏方法是仅阻止.htacces中的url。 https://mywebsite.com/wp-json/wp/v2/users

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.