前一阵子,公安局里给我打电话,指出我的网站存在严重安全隐患。我一看,果然!问题出在 WordPress 的一个默认功能上,它可能会让你的网站用户登录名大白于天下!

😨 什么漏洞这么可怕?
这事儿得从 WordPress 的 REST API 说起。简单来说,REST API 就像一个“万能接口”,方便各种程序调用 WordPress 的数据。但从 4.7.0 版本开始,这个接口出了个岔子,导致任何人都能通过一个简单的链接,看到你网站上所有用户的登录名!
🔗 漏洞链接长这样:
https://你的博客域名.com/wp-json/wp/v2/users/
只要把“你的博客域名.com”换成实际网址,就能看到一串用户列表,里面明晃晃地写着每个用户的登录名(slug)!
😱 天呐,这不等于把家门钥匙挂在网上吗?
我当时的心情,真是可以用“哭死”来形容。°(°¯᷄◠¯᷅°)°。 不过,更让我感动的是,现在的网警叔叔们不仅负责,还这么懂技术,竟然能发现这个漏洞并及时提醒站长!
🛠️ 三种方法,紧急修复你的 WordPress 网站!
作为一名“挨踢”人,修复漏洞的重任自然落到了我头上。别慌,我已经总结了三种解决方案,总有一款适合你:
1. 一刀切:屏蔽所有 REST API
如果你的网站不用古腾堡编辑器,或者你的 APP 接口是自己开发的,那就可以直接屏蔽所有 REST API,一了百了:
add_filter('rest_authentication_errors', fn($access)=> new WP_Error('rest_cannot_acess', 'REST API不再提供访问', ['status' => 403]));
2. 精准打击:只屏蔽用户接口
如果不想屏蔽所有接口,只想屏蔽泄露用户信息的接口,可以用这段代码:
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;
});
3. 终极方案:移除用户接口中的登录名
这是最“温柔”的方案,既不屏蔽接口,也不影响正常功能,只是把用户登录名从返回结果中去掉:
add_filter('rest_prepare_user', function($response){
unset($response->data['slug']);
return $response;
});
📢 紧急呼吁:
各位 WordPress 站长们,赶紧检查一下自己的网站,看看有没有中招!如果发现了问题,别犹豫,立刻采取措施修复!
我是选择方案二。具体操作步骤如下:
方案二的代码需要添加到你的 WordPress 主题的 functions.php
文件中,或者通过一个自定义插件来添加。我分别说明一下这两种方式:
方法一:添加到 functions.php
文件 (推荐使用子主题)
- 进入 WordPress 后台: 登录你的 WordPress 管理后台。
- 打开主题编辑器: 在左侧菜单中,找到 “外观” (Appearance) -> “主题文件编辑器” (Theme File Editor) 或 “主题编辑器” (Theme Editor)。
- 选择
functions.php
文件: 在右侧的文件列表中,找到并点击functions.php
文件。 重要提示: 如果你直接修改当前使用的主题的functions.php
,在主题更新后,你的修改会被覆盖。强烈建议创建一个子主题 (Child Theme),并在子主题的functions.php
文件中添加代码。这样可以避免主题更新导致的代码丢失。 如果不清楚如何创建子主题,可以参考WordPress官方文档:https://developer.wordpress.org/themes/advanced-topics/child-themes/ - 添加代码: 在
functions.php
文件的末尾(在?>
之前,如果有的话),粘贴以下代码: - 保存更改: 点击页面底部的 “更新文件” (Update File) 按钮。
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;
});
方法二:通过自定义插件添加 (更推荐)
这种方法更安全,也更易于管理。即使你更换主题,自定义插件中的代码仍然有效。
- 创建插件文件夹: 在你的 WordPress 安装目录下的
wp-content/plugins/
文件夹中,创建一个新的文件夹,例如my-custom-security-plugin
。 - 创建插件文件: 在新创建的文件夹中,创建一个名为
my-custom-security-plugin.php
的文件 (文件名可以自定义,但必须以.php
结尾)。 - 添加插件代码: 使用文本编辑器打开
my-custom-security-plugin.php
文件,并粘贴以下代码:- •
Plugin Name:
插件的名称,可以自定义。 - •
Description:
插件的描述,可以自定义。 - •
Version:
插件的版本号,可以自定义。
- •
- 保存文件。
- 激活插件: 在 WordPress 后台,进入 “插件” (Plugins) 页面,找到你刚刚创建的插件 (My Custom Security Plugin),然后点击 “启用” (Activate)。
<?php
/*
Plugin Name: My Custom Security Plugin
Description: Disables WordPress REST API user endpoints.
Version: 1.0
*/
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;
});
无论你选择哪种方法,完成代码添加后,务必测试一下:
- 1. 在浏览器中访问
https://你的博客域名.com/wp-json/wp/v2/users/
。 - 2. 你应该看到一个错误消息,类似于 “rest_no_route” 或 “404 Not Found”,这表示接口已被禁用。
- 3. 如果仍然能看到用户信息,说明代码没有正确添加或生效,请仔细检查步骤。

强烈建议使用第二种方法(自定义插件),因为它更安全、更灵活,也更容易管理。
使用子主题也是一个很好的选择,可以防止主题更新覆盖你的修改。
但无论哪种方式, 在修改任何代码之前,务必备份你的网站!
原创文章,作者:幸运周,如若转载,请注明出处:https://www.52thing.com/25298.html