是否可以限制/wp-json请求的Access-Control-Allow-Origin?

时间:2021-03-25 作者:aalbagarcia

我的任务是管理由其他团队开发和配置的WordPress网站。在一次基本的安全扫描中,我意识到https://www.mywordpress.com/wp-json 不会出于某种原因限制原点。

curl -H "Origin: https://www.thewrongorigin.com" -I https://www.mywordpress.com/wp-json
HTTP/2 200
server: nginx
date: Mon, 22 Mar 2021 11:02:54 GMT
content-type: application/json; charset=UTF-8
vary: Accept-Encoding
access-control-expose-headers: X-WP-Total, X-WP-TotalPages, Link
access-control-allow-headers: Authorization, X-WP-Nonce, Content-Disposition, Content-MD5, Content-Type
allow: GET
access-control-allow-origin: https://www.thewrongorigin.com
access-control-allow-methods: OPTIONS, GET, POST, PUT, PATCH, DELETE
access-control-allow-credentials: true

… other headers here…
查看响应,并使用不同的URL作为源,看起来我的WordPress安装正在设置标题access-control-allow-origin 无论请求的来源是什么。我希望得到以下标题的响应:

curl -H "Origin: https://www.thewrongorigin.com" -I https://www.mywordpress.com/wp-json
HTTP/2 200
...
access-control-allow-origin: https://www.mywordpress.com
我想做的是修改我的WordPress并设置标题Access-Control-Allow-Origin: https://www.mywordpress.com 对于URLhttps://www.mywordpress.com/wp-json.

我的问题是:

可以这样设置限制原点吗access-control-allow-origin: * 可以停止工作吗?有这样的插件吗我有过编码和系统管理员的工作经验,但我对WordPress还是相当陌生的。

2 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

首先,这是有意的行为,如中所述的懒散讨论中所述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连接到您的网站,如果您只允许来自一个来源的请求,则无法连接到您的网站WordPress HTTP API, 没有将源标题设置为站点的URL。这非常罕见,但并非不可能Access-Control-Allow-Origin 不会保护您的数据。服务器欺骗源代码并向API发出请求并获取数据是很平常的。此标头不是身份验证安全措施,因此如果您想从外部锁定API,则此标头不是实现此目的的方法。

SO网友:Drew Kirkpatrick

仅供参考,CORS不用于CSRF保护。设置CORS策略是有选择地删除安全控制。您的意思是,如访问控制允许源代码所示,允许其他一些站点与您的WordPress站点进行交互。

如果将访问控制允许凭据设置为true,则这可能会变得危险。

这将告诉用户的浏览器在跨源请求中包括任何会话cookie。

假设WordPress根据请求源自动设置CORS策略(有些URL会在WordPress中这样做)。我正在恶意网站上请求JavaScript。com在后台访问somewordpresssite。com。恶意网站发出的JavaScript请求。com自动将原点设置为恶意网站。com。Somewordpressite。com响应CORS策略:

Access-Control-Allow-Origin: https://maliciouswebsite.com
Access-Control-Allow-Credentials: true
太好了。现在我欺骗一个登录SomeWordPress网站的用户。com访问恶意网站。当他们浏览我的恶意页面时,我可以让JavaScript向somewordpresssite上的URL发出请求。使用CORS策略的com。受害者的web浏览器会很高兴地将他们的会话附加到这些JavaScript请求,所以我作为受害者访问wordpress网站。

我的恶意JavaScript可以读取受害者会话中的页面,并使用CORS策略向这些页面发出请求。我可以自己轻松地读取CSRF令牌,并根据需要重新发送带有请求的令牌。当您拥有JavaScript的读访问权限时,很容易绕过CSRF控件。WordPress有很多这样的例子:https://github.com/hoodoer/WP-XSS-Admin-Funcs/blob/943a34c29524c4cdf02bdb1f20d5e6fe6d1cc487/wpXssAdminFuncs.js

相关推荐

WordPress REST-API将图像上传到ACF

我使用Wordpress Rest API创建了自己的API。我成功地将所有数据保存在wordpress后端,但我不知道如何获取和保存文件/图像中的数据。 register_rest_route( \'mlcs/v1\', \'/save_data\', array( \'methods\' => \'POST\', \'callback\' => array( $this, \'save_data_post\' ),