
类型: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或其他认证机制,并使用用户能力检查控制权限。

