默认情况下,WordPress REST API 默认是开放状态的,黑客可以利用WordPress REST API获取我们网站数据或者对我们网站进行一些操作,但是现在有很多程序都是基于Rest API实现的,所以直接禁用显示是不合适的,我们给WordPress Rest API 设置访问权限,来增加我们网站的安全性。
通过代码实现
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',
__('No way! You are not currently logged in.'),
array('status' => 401)
);
}
// Our custom authentication check should have no effect
// on logged-in requests
return $result;
});
代码来源:Simple MU plugin to prevent WordPress REST API access without login · GitHub
代码简单解释
上面代码用于设置 REST API 请求权限,作用是确保只有已登录的用户才能访问 REST API,未登录用户将会收到相应的错误提示。
代码使用add_filter函数添加一个过滤器,当出现 REST API 认证错误时将执行指定的函数。
如果$result为true或者是一个 WordPress 错误对象(WP_Error),则直接返回$result,表示之前的认证检查结果已经被应用,无需修改。
如果还未进行认证检查,会进行以下操作:
如果用户未登录,则返回一个新的WP_Error对象,包含错误代码:rest_not_logged_in、错误消息:No way! You are not currently logged in.、以及状态码为401,表示用户未登录。
对于已登录的用户请求,代码的自定义认证检查不应该对其产生影响,所以直接返回$result。
将上述代码添加到你主题的functions.php文件中即可,流程如下:
编辑当前主题的 functions.php 文件
WordPress网站后台 – 仪表盘 – 外观 – 主题文件编辑器(有的版本可能显示是编辑)>选择主题functions.php文件>添加代码>保存文件:
注意
上面添加到主题functions.php文件的这种方式添加的功能代码只在当前使用主题下有作用,如果你切换了主题,那么这个时候就会失效,所以要注意。
推荐
推荐你使用WPCode 代码片段插件,你可以直接将上述代码添加为一个新的代码片段开启,在不需要的时候也可以直接对这个功能代码选择关闭就行,这个插件可以非常方便的管理在WordPress网站上的功能代码,如下示例:
这个插件它的代码库中还有许多使用的功能代码片段,你可以选择你用得上的然后导入、选择开启就可以了,如下示例:
关于这个插件的介绍推荐你看我之前文章:WordPress代码片段插件 WPCode。
通过插件实现
WordPress禁用或者是给设置Rest API 访问权限的权限有挺多的,这里我推荐三个,下面会对它们进行简单的描述,你可以根据我给出的描述和自己实际的需求进行选择:
Disable WP REST API
这个插件做了一件事:为没有登录WordPress的访问者禁用WP REST API。 无需配置。
此插件仅使用22行短代码(小于2KB)。 所以它是超轻量级、快速且高效。
如果你只是单纯的需要对于没有登录WordPress的访问者禁用WP REST API,那么就建议你使用这个插件即可。
WordPress插件库地址:Disable WP REST API – WordPress plugin | WordPress.org
Disable REST API
插件自己的描述是:用于控制对 WordPress REST API 访问的最全面的插件!
WordPress插件库地址:Disable REST API – WordPress plugin | WordPress.org
我用了下确实是不错,Disable REST API可以对不同的用户角色进行控制不空的权限,还可以对WordPress REST API进行节点的细分权限控制,安装后启用,在WordPress后台》设置》Disable REST API>进入到设置页面:
WordPress REST API Authentication
WordPress REST API Authentication是一款给WordPress REST API增加身份验证的插件,也可以管理公开访问的节点,具体看下图吧:
WordPress插件库地址:WordPress REST API Authentication – WordPress plugin | WordPress.org
我觉得一般应该是用不上的,WordPress从 5.6 开始,附带了应用程序密码的功能,使用这个应该就可以了,可以从编辑用户页面(wp-admin -> Users -> Edit User)生成。
然后在请求的时候,设置为http请求头Authorization字段的参数:
curl简单示例,只需将 USERNAME、PASSWORD 和 HOSTNAME 换成它们各自的值::
curl --user "USERNAME:PASSWORD" https://HOSTNAME/wp-json/wp/v2/users?context=edit
相关资料
REST API Handbook | Developer.WordPress.org
Authentication – REST API Handbook | Developer.WordPress.org