有很多WordPress初学者,赖胖也是一样查了一些教程,觉得 WordPress REST API 应该禁用。也有人不敢随便禁止它,担心会产生不良后果。本文将介绍一下WordPress REST API究竟是干嘛的,应不应该禁用它,或者什么情况下可以禁用。
WordPress REST API 有什么作用?
API 是应用程序编程接口。REST,代表“REpresentational State Transfer”,是一组概念,用于将应用程序的数据建模和访问为相互关联的对象和集合。WordPress REST API 提供代表帖子、页面、分类法和其他内置 WordPress 数据类型的 REST 端点 (URL)。
WordPress REST API 为应用程序提供了一个接口,通过发送和接收JSON(JavaScript 对象表示法)对象形式的数据来与您的 WordPress 站点进行交互。
它是WordPress Block Editor的基础,同样可以使您的主题、插件或自定义应用程序提供新的、强大的界面来管理和发布您的网站内容。
通俗一些的讲,它就是一个接口
如WordPress默认的块编辑器,就会用到它,它是WordPress Block Editor的基础。如果这个接口被关闭或出现故障,就会出错。
还有一些基于WordPress开发插件,或基于WP的APP、小程序等,也会通过REST API与WordPress进行通信。
结论就是 WordPress REST API 并不是一个无用的功能。
到底需不需要禁用REST API?
虽然 WordPress REST API 很棒,但由于它是一个接口,并且通过URL可以进行调用。我们可以在自己的网站上试试:https://www.yousite.com/wp-json/
这个Url,看看会返回什么。
如果访问https://www.yousite.com/wp-json/wp/v2/users
,则会返回网站所有注册用户的用户名、ID、描述、头像等信息,返回如下示例:
[
{
"id": 1,
"name": "admin",
"url": "https://test.zhanzhangb.com",
"description": "",
"link": "https://test.zhanzhangb.com/author/test/",
"slug": "test",
"meta": [],
"_links": {
"self": [
{
"href": "https://test.zhanzhangb.com/wp-json/wp/v2/users/1"
}
],
"collection": [
{
"href": "https://test.zhanzhangb.com/wp-json/wp/v2/users"
}
]
}
}
]
得到这些信息后,恶意攻击者可以开始猜测 WordPress 网站上所有用户名的密码(暴力攻击)。
默认状态下,如不禁用REST API会有以下风险
- 会透露WordPress站点的很多敏感信息,不利于安全。
- 当该URL有访问,会运行WordPress的大量程序脚本。如有人不断高频率扫描该URL,甚至会导致网站运行缓慢或卡死。
最佳的处理方法是默认禁用,但对相应用户或插件应用开放其访问权限。
如何正确禁用REST API,以及哪些情况需要开放权限?
常见需要使用REST API的应用是以下这些:
- Gutenberg 块编辑器使用 REST API在页面编辑和发布编辑时进行通信。如果完全禁用它,会得到一个错误:“更新失败。”
- Yoast SEO 和 Ryte 仪表板小部件。
- Jetpack
- Wordfence
- JetMenu
- Customer Reviews for WooCommerce
- 各种 WooCommerce 仪表板小部件。
如果以上插件与功能均仅网站管理员才有权限可使用的话,那么可以将REST API的非管理员权限禁用。
推荐使用Perfmatters插件对REST API进行安全操作,具体方式如下图:
使用 Perfmatters 禁用 WordPress REST API
如果要针对某插件或应用程序的API排除禁用,则可以在functions.php文件中,或使用或使用代码片段插件(推荐)插入以下代码:
add_filter('perfmatters_rest_api_exceptions', function($exceptions) {
$exceptions[] = '需要排除的api';
return $exceptions;
});
验证效果
当在未登录状态下,再次访问https://www.yousite.com/wp-json/
或https://www.yousite.com/wp-json/wp/v2/users
,如设置正确将得到以下提示并返回401状态码:
{
"code": "rest_authentication_error",
"message": "很抱歉,您没有发出 REST API 请求的权限。",
"data": {
"status": 401
}
}