安全禁用 WP REST API

更新于 2025年4月17日 WordPress 教程

安全禁用 WP REST API

我正在考虑提高我的 WordPress 网站的安全性,并且在这样做的过程中遇到了默认启用的 WP REST API(如果我没记错的话,从 WP 4.4 开始)。

禁用它的安全方法是什么?

这里的“安全”是指它不会导致意外的副作用,例如不会破坏任何其他 WP 核心功能。

一种可能的方法是使用.htaccess重写规则,但令人惊讶的是,我没有找到任何关于这样做的“官方”说明。

非常感谢任何帮助或建议:)

更新:第 3 方插件不是我正在寻找的解决方案。 虽然我知道有很多它们可以解决任务,但它们包含许多会降低网站速度的额外功能。 我希望有一个解决此问题的单行解决方案,而无需额外插件的开销。

更新 2:以下是 WordPress 的官方意见:https://developer.wordpress.org/rest-api/using-the-rest-api/frequently-asked-questions/#can-i-disable-the-rest-接口

据此,Wordpress 团队希望未来的 WP 功能依赖于新的 REST API。 这意味着没有保证安全的方法来禁用 REST API。

我们只是希望有足够的安全专家来处理 WP 安全。

更新 3:

WordPress API 手册中提供了一种解决方法 – 您可以要求对所有请求进行身份验证

这确保禁用对您网站的 REST API 的匿名访问,只有经过身份验证的请求才能工作。

解决方案

从作者的原始问题中,我选择了来自 wordpress 官方建议的选项 2( https://developer.wordpress.org/rest-api/using-the-rest-api/frequently-asked-questions/#can-i -disable-the-rest-api )。 所以只需放入你的functions.php,让只有登录的用户使用其余的api(但只需交叉检查原始链接,以防我的代码块过时;)): UPD(01-10-2021):

add_filter( 'rest_authentication_errors', function( $result ) {
    // If a previous authentication check was applied,
    // pass that result along without modification.
    if ( true === $result || is_wp_error( $result ) ) {
        return $result;
    }

    // No authentication has been performed yet.
    // Return an error if user is not logged in.
    if ( ! is_user_logged_in() ) {
        return new WP_Error(
            'rest_not_logged_in',
            __( 'You are not currently logged in.' ),
            array( 'status' => 401 )
        );
    }

    // Our custom authentication check should have no effect
    // on logged-in requests
    return $result;
});

您可以为 localhost 以外的请求禁用它:

function restrict_rest_api_to_localhost() {
    $whitelist = [ '127.0.0.1', "::1" ];

    if( ! in_array($_SERVER['REMOTE_ADDR'], $whitelist ) ){
        die( 'REST API is disabled.' );
    }
}
add_action( 'rest_api_init', 'restrict_rest_api_to_localhost', 0 );

毕竟,禁用 REST API 并不是一个坏主意。 它居然在所有网站上打开了一个巨大的漏洞!

在 wordpress 4.4 中有一种方法

在这里, 我找到了一个可能的.htaccess解决方案,但应该结合.htaccess文件中的任何其他内容进行仔细测试(例如,wordpress 本身添加的漂亮 url 规则):

# WP REST API BLOCK JSON REQUESTS 
# Block/Forbid Requests to: /wp-json/wp/
# WP REST API REQUEST METHODS: GET, POST, PUT, PATCH, DELETE
RewriteCond %{REQUEST_METHOD} ^(GET|POST|PUT|PATCH|DELETE) [NC]
RewriteCond %{REQUEST_URI} ^.*wp-json/wp/ [NC]
RewriteRule ^(.*)$ - [F]

一个非常激烈的方法,也是在你的根目录中有一个404.html网页,然后添加这一行:

# WP REST API BLOCK JSON REQUESTS 
# Redirect to a 404.html (you may want to add a 404 header!) 
RewriteRule ^wp-json.*$ 404.html

注意,除非你使用静态页面,即不涉及wordpress函数,如果你想返回404错误并带有适当的错误页面,这是一个完全独立的话题,涉及到Wordpress时会出现很多问题

接受的答案会禁用来自未经身份验证的用户的所有 API 调用,但现在很多插件都依赖于该 API 的功能。

禁用所有调用将导致意外的站点行为,在我使用此代码时也会发生这种情况。

例如,ContactForm7 使用此 API 将联系信息发送到 DB(我认为)和 ReCaptcha 验证。

我认为最好为未经身份验证的用户禁用一些(默认)端点,如下所示:

// Disable some endpoints for unauthenticated users
add_filter( 'rest_endpoints', 'disable_default_endpoints' );
function disable_default_endpoints( $endpoints ) {
    $endpoints_to_remove = array(
        '/oembed/1.0',
        '/wp/v2',
        '/wp/v2/media',
        '/wp/v2/types',
        '/wp/v2/statuses',
        '/wp/v2/taxonomies',
        '/wp/v2/tags',
        '/wp/v2/users',
        '/wp/v2/comments',
        '/wp/v2/settings',
        '/wp/v2/themes',
        '/wp/v2/blocks',
        '/wp/v2/oembed',
        '/wp/v2/posts',
        '/wp/v2/pages',
        '/wp/v2/block-renderer',
        '/wp/v2/search',
        '/wp/v2/categories'
    );

    if ( ! is_user_logged_in() ) {
        foreach ( $endpoints_to_remove as $rem_endpoint ) {
            // $base_endpoint = "/wp/v2/{$rem_endpoint}";
            foreach ( $endpoints as $maybe_endpoint => $object ) {
                if ( stripos( $maybe_endpoint, $rem_endpoint ) !== false ) {
                    unset( $endpoints[ $maybe_endpoint ] );
                }
            }
        }
    }
    return $endpoints;
}

有了这个,现在唯一打开的端点是插件安装的端点。

有关您站点上活动的端点的完整列表,请参阅https://YOURSITE.com/wp-json/

根据您的要求随意编辑$endpoints_to_remove数组。

如果您有自定义帖子类型,请确保也将这些全部添加到列表中。

就我而言,我还将默认端点前缀wp-json更改为mybrand-api 。 这应该对发出数千个蛮力请求的机器人起到威慑作用。

这是我所做的:

// Custom rest api prefix (Make sure to go to Dashboard > Settings > Permalinks and press Save button to flush/rewrite url cache )
add_filter( 'rest_url_prefix', 'rest_api_url_prefix' );
function rest_api_url_prefix() {
    return 'mybrand-api';
}

使用插件“禁用 REST API ”,您可以选择要启用的 API,例如联系表 7 API。 查看插件的设置 (yoursite.com/wp-admin/options-general.php?page=disable_rest_api_settings)

如果要完全禁用WordPress REST API使用以下代码:

// Disable WordPress REST API
remove_action( 'init', 'rest_api_init' );
remove_action( 'rest_api_init', 'rest_api_default_filters', 10 );
remove_action( 'rest_api_init', 'register_initial_settings', 10 );
remove_action( 'rest_api_init', 'create_initial_rest_routes', 99 );
remove_action( 'parse_request', 'rest_api_loaded' );
add_filter('rest_enabled', '__return_false');
add_filter('rest_jsonp_enabled', '__return_false');

你可能还喜欢下面这些文章

Auditor:WordPress 文章内容安全审核插件Auditor:WordPress 文章内容安全审核插件

本插件可以识别文章中的敏感信息,如果文章存在敏感信息,文章将会自动移动到安全的敏感隔离区,禁止任何形式的前台访问。

WordPress小说主题wpnovo,支持多语言、付费阅读、VIP会员功能的精美小说模板WordPress小说主题wpnovo,支持多语言、付费阅读、VIP会员功能的精美小说模板

//demo.imwpweb.com/wpnovo/多设备支持主题支持PC和移动端界面,独立设置,互不干扰。移动端首页(右)图:小说页面PC端和移动端的展示付费订阅主题支持付费订阅功能,支持付费单章订阅、整本小说订阅模式。

WordPress自动内链插件 WPKAL ,网站全自动增加锚链接必备插件WordPress自动内链插件 WPKAL ,网站全自动增加锚链接必备插件

什么是内链内链,顾名思义就是在同一网站域名下的内容页面之间的互相链接(自己网站的内容链接到自己网站的内部页面,也称之为站内链接)。自动内链工作原理简单来说,我们设定一些词表以及词表对应的链接,比如词是wordpress插件,链接是http

WordPress 敏感词违禁词屏蔽插件 WPWJC 介绍与下载WordPress 敏感词违禁词屏蔽插件 WPWJC 介绍与下载

这款插件的核心功能就是一点:找出文章中的违禁词、敏感词等措辞不当的词语,替换成你设置的更合适的词或者直接替换“*”号。请注意,需要同时下载站长工具箱和违禁词屏蔽插件,安装插件时也需要两个插件同时安装。

WordPress 文章自动配图、缩略图插件 WPAC 介绍与下载WordPress 文章自动配图、缩略图插件 WPAC 介绍与下载

2、自动生成的图片并非真实在磁盘中的图片,而是动态生成的,如果保存到磁盘会占用大量空间,这个空间没必要浪费,因此修改主题代码,直接将缩略图的地址改为wpac自动生成的缩略图地址是一个非常好的方案。

WordPress 相关文章插件 wprecWordPress 相关文章插件 wprec

wprec利用相似度算法计算每篇文章之间的相似度,找到与当前文章最相似的一些文章,展现在文章底部作为相关文章。我们知道,相关推荐插件推荐的原理是根据当前文章的特征(文章的高权重标签),从文章库中召回相关文章,再根据相关性评分,最后选出To