WordPress REST API安全配置

2026-08-07 4
WordPress

类型:CMS系统

简介:一款开源的内容管理系统(CMS),用于构建和管理网站。

访问WordPress网站的/wp-json/地址,通常可以看到REST API返回的接口信息。这并不代表网站已经被入侵,REST API本来就是WordPress核心功能,区块编辑器、移动应用和许多插件都会使用它。

真正需要处理的是未授权用户能否读取不应公开的数据、接口是否正确执行权限检查,以及网站是否暴露了不必要的用户信息。一刀切关闭REST API看起来简单,却可能让编辑器、WooCommerce、表单和第三方集成同时失效。

一、WordPress REST API是什么

WordPress REST API通过HTTP请求读取或修改网站数据,常见基础路径为:

https://example.com/wp-json/

文章接口示例:

https://example.com/wp-json/wp/v2/posts

REST API可以用于:

  • 区块编辑器;
  • WordPress移动应用;
  • 无头WordPress;
  • 自动发布工具;
  • 第三方数据同步;
  • WooCommerce及其他插件接口;
  • 自定义前端应用;
  • 网站管理自动化。

公开文章本来就可以通过API读取。安全配置的目标不是隐藏所有公开数据,而是阻止未授权访问敏感信息和危险操作。

二、什么是WordPress用户枚举

用户枚举是指攻击者通过公开页面、作者归档、登录错误或REST API推测网站用户名。

部分WordPress环境中,访问以下接口可能返回公开作者信息:

/wp-json/wp/v2/users

返回内容可能包括:

  • 用户显示名称;
  • 用户ID;
  • 作者归档地址;
  • 头像信息;
  • 公开描述;
  • 用户Slug。

这些信息不一定直接泄露密码,但可以帮助攻击者确定登录账号,再进行密码喷洒、钓鱼或暴力尝试。

1、显示名称和登录名应分开

管理员不应把公开显示名称设置成登录用户名。即使作者信息需要公开,也可以使用与登录名不同的昵称。

2、隐藏REST用户接口不能消除全部枚举方式

用户信息还可能从以下位置推测:

  • 作者归档;
  • 页面源代码;
  • RSS Feed;
  • 站点地图;
  • 评论;
  • 登录错误提示;
  • 插件生成的数据;
  • 公开缓存。

因此,限制用户接口只是降低信息暴露的一部分,还需要强密码、多因素认证和登录保护。

三、不要直接全局禁用REST API

部分教程通过rest_authentication_errors阻止所有未登录请求,例如返回统一错误。这种做法可能影响:

  • 区块编辑器;
  • 嵌入内容;
  • 网站健康检查;
  • WooCommerce;
  • 联系表单;
  • SEO插件;
  • 缓存和安全插件;
  • 第三方应用;
  • 无头前端;
  • 自动化工具。

更稳妥的方式是明确哪些接口必须公开、哪些只能登录访问,再针对具体路由设置权限。

四、如何限制未登录用户读取用户列表

可以通过自定义插件或必须使用插件处理。不要直接修改WordPress核心文件。

以下示例对未登录请求隐藏核心用户集合接口:

<?php

add_filter(
    'rest_endpoints',
    function (array $endpoints): array {
        if (is_user_logged_in()) {
            return $endpoints;
        }

        unset($endpoints['/wp/v2/users']);
        unset($endpoints['/wp/v2/users/(?P<id>[\d]+)']);

        return $endpoints;
    }
);

这段代码可以放入自定义插件或MU Plugin中。

1、建立MU Plugin

创建目录:

wp-content/mu-plugins

再创建文件:

wp-content/mu-plugins/rest-api-security.php

把代码写入该文件。MU Plugin会自动加载,不需要在插件页面手动启用。

2、限制的实际效果

未登录用户无法通过对应核心路由直接获取用户列表,但登录用户和内部功能仍可能按权限访问。

上线前需要测试:

  • 区块编辑器;
  • 作者页面;
  • 用户管理;
  • 移动应用;
  • WooCommerce;
  • 表单与自动化接口;
  • 使用REST API的主题和插件。

3、路由可能由插件扩展

插件可以注册自己的用户或会员接口。隐藏/wp/v2/users并不会自动保护所有第三方路由,需要单独检查。

五、自定义REST接口必须配置权限回调

注册REST路由时,应明确设置permission_callback

错误示例:

register_rest_route(
    'example/v1',
    '/settings',
    array(
        'methods'  => 'POST',
        'callback' => 'update_example_settings',
        'permission_callback' => '__return_true',
    )
);

__return_true表示任何请求都可访问。如果接口会修改设置,这属于严重权限问题。

更安全的写法:

register_rest_route(
    'example/v1',
    '/settings',
    array(
        'methods'  => 'POST',
        'callback' => 'update_example_settings',
        'permission_callback' => function (): bool {
            return current_user_can('manage_options');
        },
    )
);

1、按照业务能力检查权限

常见能力包括:

current_user_can('manage_options');
current_user_can('edit_posts');
current_user_can('publish_posts');
current_user_can('edit_user', $user_id);

不能只判断用户是否登录。普通订阅用户已经登录,但不应因此获得修改全站设置的权限。

2、对象级权限也要检查

如果接口接收文章ID或用户ID,还需要判断当前用户是否有权操作该对象。

例如:

current_user_can('edit_post', $post_id);

只检查edit_posts可能允许用户操作不属于自己的内容。

六、如何验证REST API请求身份

1、Cookie与Nonce

WordPress后台中的JavaScript请求通常使用登录Cookie和REST Nonce。

请求头示例:

X-WP-Nonce: nonce-value

Nonce用于降低跨站请求伪造风险,但它不是独立的登录凭据,也不能代替用户权限检查。

2、应用密码

外部服务可使用WordPress应用密码进行认证。应用密码与主账号密码分开,可以单独撤销,适合脚本和第三方工具。

3、不要在网址中传递密码

以下形式不安全:

https://example.com/wp-json/?password=secret

URL可能进入浏览器记录、代理日志、分析工具和服务器日志。

4、必须使用HTTPS

Basic Authentication和应用密码依赖HTTPS保护传输内容。未加密HTTP连接可能暴露凭据。

七、限制敏感接口的配置思路

1、先盘点路由

访问/wp-json/可以查看公开路由,也可以通过代码或开发工具检查插件注册的接口。

重点关注:

  • 用户及会员数据;
  • 网站设置;
  • 文件上传;
  • 表单记录;
  • 订单与客户数据;
  • 日志;
  • API密钥配置;
  • 调试接口;
  • 导入和导出功能。

2、按接口设置权限

对每个接口明确回答:

  • 未登录用户是否需要访问;
  • 普通登录用户能否访问;
  • 哪种角色可以读取;
  • 哪种角色可以写入;
  • 是否需要对象级权限;
  • 是否需要速率限制;
  • 是否记录操作日志。

3、移除不用的插件接口

如果敏感路由来自不再使用的插件,删除插件通常比在外部不断拦截接口更合理。

4、使用WAF或反向代理限流

对于登录、搜索、批量查询和高成本接口,可以根据业务设置请求频率限制。

不要仅按User-Agent放行或阻止,因为该字段容易伪造。

八、如何减少作者信息暴露

1、修改公开显示名称

在用户资料中选择与登录名不同的公开显示名称。

2、限制作者归档

不需要作者归档的网站,可以通过SEO插件或主题配置关闭作者页面,或者重定向到其他页面。

3、统一登录错误提示

避免明确提示“用户名不存在”或“密码错误”,可使用较通用的登录失败信息。

4、启用多因素认证

即使用户名被发现,多因素认证仍能显著增加账号被接管的难度。

5、限制登录尝试

通过安全插件、WAF或服务器策略控制高频登录请求,并保留误封恢复方式。

九、如何测试REST API安全配置

1、未登录访问测试

使用无痕窗口或退出账号后访问:

curl -i https://example.com/wp-json/wp/v2/users

根据配置,接口应返回受控错误、空结果或不可用状态,而不是敏感用户信息。

2、普通用户权限测试

使用低权限测试账号调用接口,确认其不能读取或修改管理员数据。

不要使用真实客户账号进行安全测试。

3、管理员功能测试

确认管理员登录后,区块编辑器、用户管理和相关插件仍可正常工作。

4、写入接口测试

对POST、PUT、PATCH和DELETE请求重点验证:

  • 未登录请求被拒绝;
  • 权限不足用户被拒绝;
  • 合法用户可以操作;
  • 非法对象ID被处理;
  • 输入数据经过验证和清理;
  • 操作被日志记录。

十、REST API异常访问如何监控

服务器访问日志中可以筛选:

/wp-json/

重点关注:

  • 同一IP高频枚举路由;
  • 大量请求用户接口;
  • 持续尝试不同ID;
  • 高频POST或DELETE请求;
  • 异常状态码;
  • 不符合业务规律的国家和地区;
  • 短时间内大量认证失败。

不能因为某个IP访问wp-json就直接判定恶意。搜索引擎、监控服务和合法应用也可能使用REST API,需要结合请求频率、路由和响应状态判断。

十一、REST API安全配置清单

  • 不直接禁用全部REST API;
  • 隐藏不需要公开的用户接口;
  • 自定义路由必须设置permission_callback
  • 使用current_user_can()检查能力;
  • 对文章、用户和订单执行对象级权限判断;
  • 外部调用使用应用密码或可靠认证方式;
  • 全站启用HTTPS;
  • 不在前端暴露凭据;
  • 对高成本接口设置限流;
  • 删除不再使用的插件接口;
  • 测试管理员和低权限用户;
  • 监控wp-json异常请求。

常见问题

/wp-json/可以访问是否代表网站不安全?

不代表。REST API是WordPress核心功能。安全风险取决于接口是否暴露敏感数据,以及写入操作是否进行身份和权限检查。

是否应该完全关闭WordPress REST API?

通常不建议。区块编辑器、WooCommerce和多种插件依赖REST API。应限制具体敏感路由,而不是全局关闭。

隐藏用户接口能阻止暴力破解吗?

不能完全阻止。攻击者还可能从作者页等位置推测用户名。应同时使用强密码、多因素认证和登录限流。

permission_callback可以使用__return_true吗?

公开只读接口可以在明确评估后使用,但任何涉及敏感数据或写入操作的接口都必须执行实际权限检查。

REST Nonce是否等同于登录认证?

不是。Nonce主要降低跨站请求伪造风险,仍需登录Cookie或其他认证机制,并使用用户能力检查控制权限。

  • 广告合作

  • QQ群号:4114653

温馨提示:
1、本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。邮箱:2942802716#qq.com(#改为@)。 2、本站原创内容未经允许不得转裁,转载请注明出处“站长百科”和原文地址。