WordPress Rest API屏蔽部分接口的方法

WordPress新版本默认开启了Rest API功能,对于大多数站长用不到,而且还容易被DDOS攻击。

本文提供一些屏蔽Rest API接口的方法。

1.全部禁止

add_filter( 'rest_api_init', 'cpury_custom_route', 99 );

function cpury_custom_route($wp_rest_server){
    wp_die('禁止访问!');
}

自定义方法中可以添加过滤条件,比如只允许登录用户访问:

function cpury_custom_route($wp_rest_server){
   if ( !is_user_logged_in() ) {
      wp_die('禁止访问!');
   }
}

注意is_user_logged_in方法仅适用于传统cookie原理网站,而对于JWT令牌网站无效。

2.部分禁止

通过$_SERVER[‘REQUEST_URI’]过滤url,实现禁止访问效果。

function cpury_kill_wp_json_rest_api() {  
    $request_uri = esc_attr( $_SERVER['REQUEST_URI'] );  

    $prefix = '/wp-json/wp/v2/';

    // 直接完全屏蔽的集合
    $forbidden_types = array(
    	$prefix . 'categories',
    	$prefix . 'tags',
    	$prefix . 'pages',
    	$prefix . 'taxonomies',
    	$prefix . 'types',
    	$prefix . 'statuses',
    	$prefix . 'settings',
    	$prefix . 'themes',
    	$prefix . 'block',  // 多个
    	$prefix . 'plugins',
    );

    $flag = false;

    foreach ($forbidden_types as $key => $value) {
		if (strpos($request_uri, $value) !== false && !$flag) {
		    $flag = true;
		} 
    }

    if ($flag) {
        // wp_die( 'Sorry, you are not allowed to access this site.');  
        wp_redirect('/');    // 重定向
        exit();    // 停止执行
    }

}  

WordPress官方Rest API所有接口文档:https://developer.wordpress.org/rest-api/reference/

3.深度改造

WordPress初始化Rest API的源码文件在/wp-includes/rest-api/endpoints/*

公共注册路由的方法是register_routes

通过屏蔽方法内的逻辑,或者借助内置的钩子以达到屏蔽的效果。

(版权归cpury.com所有,转载请注明出处。)