WordPress 完全禁用页头 REST API 输出

2018年11月18日 0 条评论 78 次阅读 0 人点赞

WordPress 从 4.4 版本开始新增的 JSON REST API 功能,通过这个 REST API 可以很轻松的获取网站的数据,可应用于其他网站、手机 APP 或微信小程序等;但对于一般的网站是没有需要的,反而会拖累网站的速度,而且 REST API 采用 GET 请求方式,这就为 DDOS 攻击提供了一个新的攻击途径,所以我们应尽可能的禁止掉这些不必要的功能需求,并且去掉 head 里面输出 wp-json 链接。在此也说下查看 WP JSON REST API 是否开启的方法:http://域名/wp-json/,若输出数据则是开启状态。

在网上搜索了一圈,发现得到的方法基本只适用于 WordPress 4.7 以前的版本,而对于最新版的 WordPress 则毫无办法了... 最后得到如下提示:

自 4.7.0 版本起,已不建议使用 rest_enabled,请换用 rest_authentication_errors。 REST API 不再能被完全禁用,不过您可以用“rest_authentication_errors”过滤器来限制对该 API 的访问。

因此如果我们想兼容所有版本的 WordPress,我们可以直接使用插件Disable REST API来完全禁用 REST API;但我更倾向纯代码的方法,在这里就介绍下代码版兼容所有 WordPress 版本的完全禁用 REST API 或者说移除 head 里面 wp-json 链接的方法。

直接将以下代码添加到主题的 functions.php 文件中即可禁用 JSON REST API :

/**
 * WordPress完全禁用REST API(最新版)- 龙笑天下
 * https://www.ilxtx.com/disable-json-rest-api-in-wordpress.html
 */
// 屏蔽 REST API
if ( version_compare( get_bloginfo( 'version' ), '4.7', '>=' ) ) {
    function lxtx_disable_rest_api( $access ) {
        return new WP_Error( 'rest_api_cannot_acess', '无访问权限', array( 'status' => 403 ) );
    }
    add_filter( 'rest_authentication_errors', 'lxtx_disable_rest_api' );
} else {
    // Filters for WP-API version 1.x
    add_filter( 'json_enabled', '__return_false' );
    add_filter( 'json_jsonp_enabled', '__return_false' );
    // Filters for WP-API version 2.x
    add_filter( 'rest_enabled', '__return_false' );
    add_filter( 'rest_jsonp_enabled', '__return_false' );
}
// 移除头部 wp-json 标签和 HTTP header 中的 link
remove_action('wp_head', 'rest_output_link_wp_head', 10 );
remove_action('template_redirect', 'rest_output_link_header', 11 );

这样在访问 wp-json 的链接时就会提示无权限了。

此外,对于 WP 4.7 以上版本,还有种通过rest_api_init这个钩子来禁用 REST API 的方法,大家也可以尝试并改造下。

/**
 * WordPress完全禁用REST API(最新版)- 龙笑天下
 * https://www.ilxtx.com/disable-json-rest-api-in-wordpress.html
 */
/*禁用未登录的用户*/
add_filter( 'rest_api_init', 'lxtx_rest_only_for_authorized_users', 99 );
function lxtx_rest_only_for_authorized_users($wp_rest_server){
    if ( !is_user_logged_in() ) {
        wp_die('非法操作!');
    }
}

本文文字/代码来自:龙笑天下

Jackwill

这个人太懒什么东西都没留下