在 CORS 请求上 POST 之前使用 OPTION 请求的原因是啥? [复制]

Posted

技术标签:

【中文标题】在 CORS 请求上 POST 之前使用 OPTION 请求的原因是啥? [复制]【英文标题】:What is the reason behind using OPTION request before POST on CORS requests? [duplicate]在 CORS 请求上 POST 之前使用 OPTION 请求的原因是什么? [复制] 【发布时间】:2016-11-17 10:12:20 【问题描述】:

当调用不同的域时,在实际的POSTUPDATEPUTDELETE 请求之前发送OPTION 请求的原因是什么? (所以关于 CORS 请求)我知道它应该检查服务器是否可以处理真正的请求,但为什么不立即发送真正的请求呢?

我想过的一些原因:

    查看是否支持该方法 发送真正的请求会返回相同的状态码,所以 无需先发送OPTION 请求。 检查用户是否允许发送请求 没有任何意义,因为OPTION 请求没有发送任何身份验证标头 防止服务器负载过重 没有意义,因为检查身份验证规则是在处理数据之前。 检查是否允许请求的标头和来源 这就是它现在的工作方式,但为什么不直接发送请求,我们可以从真实请求中读取错误。 如果不处理,则阻止发送帖子数据 这是有效的唯一原因。使用选项请求将防止不必要地将发布数据发送到服务器。但是我认为这在 99% 的情况下都不是问题,因为只发送了一小部分数据。

有人能解释一下浏览器供应商在调用不同域时实现OPTION 请求的原因吗?

【问题讨论】:

【参考方案1】:

CORS 基本上是一种浏览器安全功能,而不是服务器端。

默认情况下,浏览器不会允许某些跨源请求。您正在与之交谈的服务器可以发布使用跨源请求是否安全,但理解和使用该信息的是客户端,因此提供保护而不是服务器。

所以对于 GET 请求,您可以获取资源,检查 CORS 标头,然后根据标头决定是否处理它。漂亮又简单。

对于 POST (或其他更改)事件,它不是那么简单。您发出 POST 请求,服务器对其进行处理(请记住,服务器不关心 CORS,只关心浏览器)并发回响应。浏览器看到 CORS 未启用并忽略响应,但到那时为时已晚 - POST 请求已在服务器端处理,所有被阻止的是显示已处理的结果。因此,例如,对于在线银行应用程序,恶意转账请求意味着资金将被转账,但您的浏览器将忽略“资金转账成功”响应 - 重要的是,随着资金消失和恶意请求,损害已经造成无论如何都可能会忽略响应!

因此,在您知道响应中的 CORS 标头是什么之前,您无法发送请求 - 这需要发送请求!鸡和蛋的情况。

因此浏览器会向同一地址发送一个 OPTIONS 请求,该地址不会像 POST 请求那样更改任何内容,但确实会返回 CORS 标头。之后浏览器知道发送真实请求是否安全。

顺便说一句,服务器没有实现 CORS 安全性的原因是,更改 Referrer 标头非常容易,因此无论如何它都不会提供任何保护。服务器将具有其他安全功能(例如检查会话是否有效并被授权发出请求),但 CORS 旨在防止的攻击是这些无济于事的攻击(例如用户 is 已登录到他们在另一个选项卡上的网上银行)。

【讨论】:

以上是关于在 CORS 请求上 POST 之前使用 OPTION 请求的原因是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

[转] 由Request Method:OPTIONS初窥CORS

CORS Post 请求在本地工作但不在服务器上

appgyver 的 CORS 问题?

Cors Post 请求上的 Axios 网络错误,状态码为 200

POST AJAX 请求被拒绝 - CORS?

Laravel Cors 中间件不适用于 POST 请求