搞网站安全要趁早,WordPress用户接口防护指南
搞网站最怕黑客惦记,最近发现WordPress自带的REST API有个暗门,游客居然能直接通过/wp-json/wp/v2/users
接口查到管理员账号!这就像把大门钥匙挂在门把手上,哪个站长能安心?今天教大家几招防贼秘籍,保证让那些想偷账号的龟儿子摸不着门路。

三级防护看菜下饭(适合单用户网站)
第一招适合个人小站,直接在主题的functions.php里加个「门禁系统」。就像在村口设个关卡,不是本村人一律拦在外头。贴这段代码后,游客访问任何API接口都会吃闭门羹:
add_filter('rest_authentication_errors', function($result) {
if (!empty($result)) return $result;
if (!is_user_logged_in()) {
return new WP_Error('rest_blocked', '访问受限', array('status' => 403));
}
return $result;
});
企业站要精准设防(适合多用户网站)
公司网站讲究精细化管理,就像高档小区要有访客登记。用这个代码只屏蔽用户列表接口,其他功能照常运转,管理员在后台操作也不受影响:
add_filter( 'rest_endpoints', function( $endpoints ){
if ( isset( $endpoints['/wp/v2/users'] ) && !current_user_can('activate_plugins') ) {
unset( $endpoints['/wp/v2/users'] );
}
return $endpoints;
});
脱敏处理保平安(例如本站主题功能依赖REST API,只隐藏用户名)
要是主题功能依赖API,咱就玩个「隐身术」。把用户名、个人链接这些敏感信息藏起来,用户ID这些不痛不痒的留着也不打紧:
add_filter( 'rest_prepare_user', function($response){
$data = $response->get_data();
unset($data['slug'],$data['link']);
$response->set_data($data);
return $response;
});
本站使用的是(直接拒绝users api)
要是主题功能依赖API,咱就玩个「隐身术」。把用户名、个人链接这些敏感信息藏起来,用户ID这些不痛不痒的留着也不打紧:
add_filter('rest_endpoints', 'refuse_rest_api_users', 10, 3);
function refuse_rest_api_users($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;
}
防护效果验真章
改完代码记得用curl -I 你的域名/wp-json/wp/v2/users
或者浏览器输入你的域名/wp-json/wp/v2/users
测测效果。要是返回403状态码,说明防护生效了。再搭配个Disable REST API插件,那安全系数就跟武汉长江大桥的桥墩一样扎实!