背景
wordpress建站系统,客户收到网警安全整改邮件
突然收到了网警的安全整改邮件,心里一下子慌了——自己的网站没乱搞,甚至还没开始运营,怎么就触发安全隐患了

让客户把邮件转发一看,确实有这个问题,并且经过我验证,测试了网上很多使用wp建站的系统
此问题在最新版本WordPress 6.9.1依旧存在,具体表现为
无需登陆情况下
访问:域名/wp-json/wp/v2/users
可列出网站所有用户账号

部分使用宝塔系统的自带防火墙可无解决此问题,但是估计是开了专业的

免费版可以自己加一个伪静态
登陆宝塔后台 → 网站 → 域名 → 伪静态
把下面的代码插入最顶部
# 禁止访问 /wp/v2/users 和 /wp/v2/users/{id}
location ~ ^/wp-json/wp/v2/users(/.*)?$ {
deny all;
return 403; # 返回 403 Forbidden
}
加入后的截图如下

加入后测试访问:域名/wp-json/wp/v2/users

问题已解决
一般来说有点安全意识的站长,为了保证网站安全我们总账号会改个账号,不用admin这类账号,防止网站被爆破密码,毕竟账号知道了只需要猜密码就行
为了彻底解决这个问题,我用AI写了一个wp插件,完整代码在文末

插件安装完成后,再次访问:域名/wp-json/wp/v2/users
提示:
{
"code": "rest_no_route",
"message": "未找到匹配 URL 和请求方式的路由。",
"data": {
"status": 404
}
}
处理完成,将处理结果总结后回复网警即可
可参考我的回复内容
本网站因系统默认开放 /wp-json/wp/v2/users 系列 REST API 用户查询接口,且接口未对访问主体做严格权限校验,存在未授权用户信息枚举漏洞。匿名访问者可通过该接口直接获取网站后台用户账号、用户 ID 敏感信息,存在账号信息泄露安全隐患,不符合网络数据安全管理要求。
处置记录
我方收到贵单位网络安全隐患通知邮件后,第一时间高度重视,立即组织网站运维及技术人员对通知提及的安全风险进行逐条核查确认;
立即开展安全加固处置,通过定制开发专用安全插件,对 /wp/v2/users 相关接口实施严格权限管控
处置完成后对漏洞修复效果进行全面验证,确认用户均无法访问该接口及获取任何用户敏感信息,安全漏洞已彻底修复
经全面回溯核查,本次隐患为程序默认配置导致的安全风险,未发生用户数据泄露、未被恶意利用、未造成其他网络安全危害后果,网站目前运行正常,相关安全风险已完全消除。
源码如下:
大家可以自行下载代码打包成.zip 文件,后台上传即可
<?php
/**
* Plugin Name: Block WP User Enumeration
* Plugin URI: https://www.xiadmin.com/40423
* Description: 阻止通过 REST API /wp/v2/users 端点枚举 WordPress 用户信息,防止未授权访问暴露用户名和 ID。
* Version: 1.0.0
* Author: xiadmin
* License: GPL-2.0-or-later
* Text Domain: block-wp-user-enum
*/
// 防止直接访问插件文件
defined( 'ABSPATH' ) || exit;
// 仅在REST请求时执行过滤,提升精准性
add_filter( 'rest_endpoints', 'bwue_restrict_users_endpoint' );
/**
* 对未授权用户隐藏 /wp/v2/users 及其子路由端点。
* 仅允许拥有 list_users 权限的用户(编辑及以上)访问。
*
* @param array $endpoints 已注册的 REST 端点列表。
* @return array 过滤后的端点列表。
*/
function bwue_restrict_users_endpoint( array $endpoints ): array {
// 仅在REST请求场景下处理,避免非REST请求时不必要的操作
if ( ! defined( 'REST_REQUEST' ) || ! REST_REQUEST ) {
return $endpoints;
}
// 验证用户权限:仅登录且拥有list_users权限的用户可访问
$can_list_users = is_user_logged_in() && current_user_can( 'list_users' );
if ( $can_list_users ) {
return $endpoints;
}
// 1. 移除用户列表主路由
if ( isset( $endpoints['/wp/v2/users'] ) ) {
unset( $endpoints['/wp/v2/users'] );
}
// 2. 移除单用户路由(兼容WP不同版本的正则写法)
foreach ( array_keys( $endpoints ) as $route ) {
// 匹配 /wp/v2/users/ 后跟任意ID格式的路由(兼容\d+或.+正则)
if ( preg_match( '/^\/wp\/v2\/users\/\(\?P<id>.+\)$/', $route ) ) {
unset( $endpoints[ $route ] );
break; // 匹配到后立即退出循环,提升效率
}
}
return $endpoints;
}
