首先,这是有意的行为,如中所述的懒散讨论中所述this ticket (这可能已经在其他地方讨论过了,但这是我第一次发现):
tl;dr:CORS是为CSRF保护而构建的,但WordPress已经有了相应的系统(nonces),所以我们;禁用(&Q);CORS,因为它阻碍了其他身份验证方案
。。。
将REST API中的数据公开给allorigins是一个设计决策;您应该能够轻松覆盖插件
所以应该注意的是wp-json/
从所有来源都可以访问,而且它并非天生不安全。
关于您的问题:
可以这样设置限制原点吗?
通过修改WordPress安装本身Absolutely not.您不应该编辑WordPress核心文件。您所做的任何更改都将在WordPress更新时被覆盖,迫使您每次都再次进行更改,这可能会导致您陷入维护自己的WordPress分支的糟糕实践。
如果你想自己修改核心WordPress行为,你需要创建一个plugin, 并使用Hooks API 通过删除和替换操作或筛选值进行更改。
在本例中,您会注意到标头是在rest_send_cors_headers()
作用WordPress通过将其与此行挂钩来运行此函数:
add_filter( \'rest_pre_serve_request\', \'rest_send_cors_headers\' );
根据内联文档,它位于一个函数内,即:
Attached to the {@see \'rest_api_init\'} action to make testing and disabling these filters easier.
因此,如果要修改
rest_send_cors_headers()
您需要创建一个插件,并在该插件中复制
rest_send_cors_headers()
函数转换为具有不同名称的新函数。然后您想用您的版本替换WordPress的版本:
add_action(
\'rest_api_init\',
function() {
remove_filter( \'rest_pre_serve_request\', \'rest_send_cors_headers\' );
add_filter( \'rest_pre_serve_request\', \'my_new_rest_send_cors_headers\' );
}
);
在哪里
my_new_rest_send_cors_headers()
函数的新修改版本的名称。
这样做的后果可能是什么?可能是依赖于标题的插件,如access-control-allow-origin: *
可以停止工作吗?有这样的插件吗?
大多数插件不太可能有问题,因为它们会从同一来源发出请求,但是我可以想到的两种类型的插件会有问题:
使用外部服务的插件。该服务可能希望通过REST API连接到您的网站,如果您只允许来自一个来源的请求,则无法连接到您的网站使用curl或WordPress HTTP API, 没有将源标题设置为站点的URL。这非常罕见,但并非不可能最后一点提出了一个重要问题:设置Access-Control-Allow-Origin
不会保护您的数据。服务器欺骗源代码并向API发出请求并获取数据是很平常的。此标头不是身份验证安全措施,因此如果您想从外部锁定API,则此标头不是实现此目的的方法。