为啥CORS从浏览器发送而不是从终端发送时会阻止我的Http请求
Posted
技术标签:
【中文标题】为啥CORS从浏览器发送而不是从终端发送时会阻止我的Http请求【英文标题】:Why does CORS block my Http request when sent from the browser but not from the terminal为什么CORS从浏览器发送而不是从终端发送时会阻止我的Http请求 【发布时间】:2021-07-23 14:32:08 【问题描述】:我对 CORS 提供的安全性有点困惑。下面是两个几乎相同的 HTTP 请求,一个有效,一个无效,一个是通过 curl 另一个是浏览器中的 javascript。
终端
$ curl https://www.google.com/
--> Returns a page
浏览器:
// Open the console in the browser (or spin put localhost)
const xhr = new XMLHttpRequest();
xhr.open("GET", "https://www.google.com");
xhr.send();
--> CORS Error
再试一次:
const xhr = new XMLHttpRequest();
xhr.open("GET", "https://www.google.com");
xhr.setRequestHeader("Access-Control-Allow-Origin", "*");
xhr.setRequestHeader("Access-Control-Allow-Methods", 'GET,PUT,POST,DELETE,PATCH,OPTIONS');
xhr.setRequestHeader("Access-Control-Allow-Headers", 'Origin,Authorization,Content-Type,X-Auth-Token');
xhr.setRequestHeader("Access-Control-Allow-Credentials", 'true')
xhr.send();
--> CORS Error still
所以我猜测 google.com 服务器已将其设置为仅接受来自 google 域的请求。但是,当我从不属于谷歌域的终端卷曲时,我会收到带有 html 等的 200 响应。
那么为什么服务器会响应我没有域的终端,而当我在浏览器中使用javascript时没有响应?
谢谢^.^
【问题讨论】:
How much research effort is expected of Stack Overflow users? “在 Stack Overflow 上提问应该是你寻找答案过程中的最后一步” 使用我的搜索引擎快速搜索“CORS”给出了我在第一个结果的第一段中给出答案。 【参考方案1】:CORS 是浏览器提供的一项功能。 CORS 是一种机制,旨在允许代表您发出请求,同时阻止流氓 JS 发出的某些请求,并且在您向以下位置发出 HTTP 请求时触发:
-
不同的域(例如,example.com 上的站点调用 api.com)
不同的子域(例如,example.com 上的站点调用 api.example.com)
不同的端口(例如,example.com 上的站点调用 example.com:3001)
不同的协议(例如,https://example.com 的站点调用 http://example.com)
请查看附件-https://medium.com/@baphemot/understanding-cors-18ad6b478e2b
【讨论】:
【参考方案2】:CORS 是最终由您的浏览器实现的安全功能。这就是为什么您在从终端卷曲时永远不会看到 CORS 错误的原因。另见:this post from mozilla
上面写着:
跨域资源共享 (CORS (en-US)) 是一种机制,它使用额外的 HTTP 标头告诉浏览器让在一个源(域)上运行的 Web 应用程序有权访问来自服务器的选定资源不同的起源。
【讨论】:
以上是关于为啥CORS从浏览器发送而不是从终端发送时会阻止我的Http请求的主要内容,如果未能解决你的问题,请参考以下文章
Firebase https onCall 功能被 cors 阻止
AspNetCore 上 localhost 的 CORS 策略阻止
使用 PHP 的 mail() 从命令行工作,而不是从 Apache,知道为啥吗?