如何锁定或禁用WordPress REST API端点。

作者:API传播员 · 2026-01-03 · 阅读时间:3分钟

WordPress API 的端点。以下是几种实现方法的详细说明。


核心方法:使用 rest_endpoints 过滤器

rest_endpoints 过滤器可以用来禁用所有或特定的 REST API 端点。以下是一个示例代码:

// 核心方法:禁用所有端点
add_filter('rest_endpoints', function($endpoints) {
    // 禁用所有 REST API 端点
    $endpoints = [];
    return $endpoints;
});

虽然这种方法看似简单,但它可能会导致网站功能失效。因为 WordPress 核心和许多插件都依赖 REST API,如果禁用所有端点,可能会导致页面加载失败或功能异常。例如,如果启用了 Gutenberg 编辑器,这种方法可能会导致严重问题。

更好的做法是有选择地禁用特定端点,例如:

// 禁用特定端点
add_filter('rest_endpoints', function($endpoints) {
    // 移除用户端点
    unset($endpoints['/wp/v2/users/(?P[\d]+)']);
    return $endpoints;
});

需要注意的是,使用这种方法删除端点后,访问被禁用的端点会返回以下错误:

{
  "code": "rest_no_route",
  "message": "No route was found matching the URL and request method",
  "data": {
    "status": 404
  }
}

更平衡的方法:使用 rest_authentication_errors

相比直接禁用端点,rest_authentication_errors 过滤器提供了一种更灵活的方式来控制访问权限。例如,可以将默认权限提升到某个级别,同时为特定端点设置例外:

// 更平衡的方法
add_filter('rest_authentication_errors', function($maybe_error) {
    // 仅允许拥有编辑权限的用户访问,页面端点除外

    if (!(current_user_can('edit_posts') || false !== stripos($_SERVER['REQUEST_URI'], 'wp/v2/pages'))) {        return new WP_Error(
            'rest_auth_required',
            'No REST for the restless!',
            ['status' => 401]
        );
    }
    return $maybe_error;
});

在上述代码中,我们检查了用户权限和请求路径。如果用户没有足够的权限,则返回错误响应。需要注意的是,这种方法依赖 $_SERVER 来检测请求路径,因此在某些情况下可能不够安全。


其他高级方法

使用 rest_pre_dispatch

rest_pre_dispatch 过滤器允许在路由和分派过程的早期阶段进行干预。以下是一个示例:

add_filter('rest_pre_dispatch', function($res, WP_REST_Server $wp_rest_server, WP_REST_Request $request) {
    if (this_needs_to_be_restricted()) {
        return new WP_Error(
            'rest_auth_required',
            'No REST for the restless!',
            ['status' => 401]
        );
    }
    return $res;
}, 10, 3);

此方法的优点是可以访问 WP_REST_Server 实例和请求本身,从而实现更精细的控制。

使用 rest_request_before_callbacks

此过滤器在所有请求参数验证和净化之后触发。如果需要阻止某些端点,可以使用以下代码:

add_filter('rest_request_before_callbacks', function($response, $handler, $request) {
    if (endpoint_needs_to_be_blocked()) {
        return new WP_Error(
            'rest_auth_required',
            'No REST for the restless!',
            ['status' => 401]
        );
    }
    return $response;
}, 10, 3);

需要注意的是,如果请求参数验证失败,此过滤器不会被调用。

使用 rest_dispatch_request

此过滤器在请求分派之前触发,可以用来检查用户权限:

add_filter('rest_dispatch_request', function($res, WP_REST_Request $request, string $route, $handler) {
    if (!current_user_can('edit_others_posts')) {
        return new WP_Error(
            'rest_auth_required',
            'No REST for the restless!',
            ['status' => 401]
        );
    }
    return $res;
}, 10, 4);

总结

通过本文介绍的几种方法,您可以根据实际需求选择适合的方式来限制或禁用 WordPress REST API 端点。无论是直接禁用端点、提升访问权限,还是在请求分派过程中进行干预,都可以有效地增强网站的安全性。

希望本文能为您提供有价值的参考!

原文链接: https://rinat.dev/blog/2020/03/04/how-to-lock-down-wordpress-rest-api-endpoints-or-completely-disable-them/