当前位置: 首页 > 知识库问答 >
问题:

在发布CORS请求之前使用OPTION request的原因是什么?[副本]

孙辰阳
2023-03-14

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

我考虑过的一些原因:

  • 查看是否支持该方法
  • 没有任何意义,因为没有授权头与OPTION请求一起发送
  • 没有意义,因为检查身份验证规则是在处理数据之前。
  • 这就是它现在的工作方式,但是为什么不发送请求呢?我们可以从真实的请求中读取错误
  • 这是唯一有效的理由。使用options request将防止不必要地向服务器发送post数据。然而,我认为这在99%的时间里都不是问题,因为只发送了一小部分数据

有人能解释一下为什么浏览器供应商在调用其他域时执行选项请求吗?


共有1个答案

全飞扬
2023-03-14

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

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

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

对于POST(或其他变化)事件来说,这并不是那么简单。您发出POST请求,服务器处理它(记住服务器不关心CORS,只关心浏览器)并发送回响应。浏览器看到CORS未启用并忽略响应,但此时已经太迟了-POST请求已在服务器端处理,阻止的只是显示已处理的结果。因此,对于网上银行应用程序,例如,恶意转账请求意味着资金将被转账,但您的浏览器将忽略“资金转账成功”响应-这是一件大事,因为钱已经用完了,所以造成了损失,而且恶意请求很可能会忽略响应!

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

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

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

 类似资料:
  • 当我使用离子服务时,我不断收到以下错误。。。 对飞行前请求的响应未通过访问控制检查:请求的资源上不存在“访问控制允许来源”标头。起源http://localhost:8100因此不允许访问。 它只出现在“post”请求中。我的“get”请求没有任何错误。我看过代理的文档,但我并不打算走这条路。我目前正在使用CORS Chrome插件作为解决办法,但很快将会运送到移动设备(离子视图)进行测试,我相信

  • 在哪些情况下,应该使用? 是否只是为了合法性问题? 如果是,那么问题是什么? 因为我仍然使用开发我的所有项目

  • 问题内容: 我见过很多人声称您应该在选择查询中专门为想要的每一列命名。 假设我仍然要使用所有列,为什么我不使用? 即使考虑问题* SQL查询-从视图选择或从视图*选择col1,col2,’colN,我也不认为这是完全相同的副本,因为我正从略有不同的观点着手解决这个问题。 我们的原则之一是在优化之前就不进行优化。考虑到这一点,在被证明是资源问题或架构几乎是固定的之前,似乎应该使用 首选的 方法。众所

  • 这是我在koa项目中实现的一个post请求,功能是读取本地文件并写入数据, 在前端调用axios.post去请求这个api的时候,除了第一次一定成功外,如果操作的快一点的话,后续的请求就全部502了, 这是什么原因,请求如何解决? fs.writeFileSync('./app/data/upload_resource.txt', JSON.stringify(data)) // 排查后发现, 如

  • 问题内容: 当我尝试运行程序时,出现以下错误 请帮忙 问题答案: 从Javadoc: 如果Java虚拟机找不到声明为native的方法的适当本机语言定义,则抛出该异常。 这是与JNI相关的错误。loadJacobLibrary试图加载名为jacob-1.14.3-x86的本机库,但在java.library.path定义的路径上找不到该库。启动JVM时,应将此路径定义为系统属性。例如 在Windo

  • 在这里抛出RejectedExecutionException是否有其他原因? java.util.concurrent.RejectedExecutionException:任务java.util.concurrent.FutureTask@4194a5f0被java.util.concurrent.ThreadPoolExecutor@41a36e90拒绝[终止,池大小=0,活动线程=0,排队

  • 跨源资源共享是一种允许web页面对另一个域(从wikipedia)进行XMLHttpRequest的机制。 最近几天我一直在摆弄CORS,我想我已经很好地理解了一切的工作原理。 所以我的问题不是关于CORS/preflight是如何工作的,而是关于将preflight作为一种新的请求类型背后的原因。我看不出为什么服务器A需要向服务器B发送一个预置(PR)来了解真实的请求(RR)是否会被接受-B当然

  • 问题描述: 我在尝试将springboot应用集成到另一个容器中时候,计划是将springboot应用的日志统一到另一个容器中进行管理,所以,特别处理了下springboot org.springframework.boot.loader.LaunchedURLClassLoader 的委托加载关系,将若干日志package委托 parent加载: 比如: 由于遗漏了 ch.qos.logback