响应头设置 Access-Control-Allow-Origin 的意义何在?

12 天前
 raw0xff

服务端响应头设置 Access-Control-Allow-Origin 貌似只是告诉客户端一个白名单,让客户端自觉建立连接,那如果客户端不自觉呢?服务端是不是还需要对 origin 进行判断来决定是否拒绝访问?那 Access-Control-Allow-Origin 的意义何在?

2202 次点击
所在节点    程序员
25 条回复
lisxour
12 天前
这些头绝大部分情况下是针对于浏览器的
Quarter
12 天前
这个本来就是双端一起努力的结果,所以才好推广官方浏览器,不要用不知道哪里下载的浏览器,以及,如果你自己开发一个浏览器,其实可以绕过很多安全策略的,比如 ssl 证书检测、跨域策略等等
DOLLOR
12 天前
1 、标准的 web 浏览器是自觉的,不自觉的浏览器没人敢用。

2 、非必要,但可以。取决于你的网站对安全的需求。

3 、意义是区分资源所有者。
web 是利用域名来区分服务提供商的。
自己网站只能访问自己的接口,自己的接口只能被自己的网站访问,是天经地义的事情。
Puteulanus
12 天前
对 origin 进行判断也没用,后端安全的一个原则就是客户端发过来的所有东西都可能是不可信的
cors 头不是用来保证后端安全的,是给后端一个操纵前端(浏览器)行为的 API
codehz
12 天前
其实这些限制是保护普通用户的,不然人家在钓鱼网站里弄几个请求(同时带第三方网站的 cookie )把你钱转走了就出大问题了,客户端的话,系统也直接不让你访问其他应用的数据
Akitora
12 天前
这是给标准浏览器看的
raw0xff
12 天前
@Puteulanus
“后端安全的一个原则就是客户端发过来的所有东西都可能是不可信的” 学到了。
“是给后端一个操纵前端(浏览器)行为的 API” 操控换成约束也不对,毕竟无法约束更无法操控,像 @Quarter 说的“是双端一起努力的结果”比较贴切。
ShineyWang
12 天前
君子协定
正规浏览器都会有 cors 报错

postman 这种就不会管

所以假如你信任你的电脑,信任你安装的浏览器
那这个就是有效的
huijiewei
12 天前
不自觉的客户端谁敢用啊。真是的
Y25tIGxpdmlk
12 天前
那是告诉正规的浏览器的,正规浏览器都会遵守这个规定,不然用户数据就得不到保障了。

chrome 也可以用--disable-web-security 这个命令关闭安全设置。

当然你自己写的各种 py ,或者其他脚本,可以随便忽视这个头。
restkhz
12 天前
楼主感到疑惑:貌似只是告诉客户端一个白名单让客户端自觉连接,服务端是不是还要判断 @$%^&%
楼主可能知道这是什么,但是不知道这个目的是什么...我们从头来说吧

5 楼说了安全问题。是的。如果 A 网站能读取浏览器保存的 B 网站的 Cookie ,或者 A 网站的脚本能随意让浏览器对 B 网站发起请求(比如转账操作),是不是不安全?

于是搞了一个同源策略。如果非同源,即便要求发 Ajax 也会拒绝。非同源就 0 信任。
但是这样的同源策略是否有些过于严格?

如果我前后端分离,我域名或者端口就是不一样怎么办?我前端就是需要加载别的域名的 API 怎么办?反正我就是要加载非同源的东西,你一个同源策略因为安全问题就把它堵死了?搞得 AJAX 用不了。

楼主说的 Access-Control-Allow-Origin 这就来了。
后端需要告诉浏览器,哪个前端网站你可以信任,在他的页面可以给我发请求,我们是一家的。

这是设置一种因为信任而可以设置安全例外的做法。

客户端不自觉?那是客户端有安全缺陷。你做网站的恐怕做不了太多。
AoEiuV020JP
12 天前
就是表个态而已,chrome 完全可以用插件或者启动参数关闭 cors 错误,
保护的是懵懂的用户,避免误上套壳网站比如 iframe 嵌套你的网站,这种用户数据有泄露风险,设置那个就会报错 cros ,
ochatokori
12 天前
浏览器就是自觉,减少让你点个链接就被黑了的情况
importmeta
12 天前
这个只针对浏览器, 但不针对 Postman 这种.
xiangyuecn
12 天前
不是为了限制,这个头存在的意义是为了解除限制,允许别人访问你的资源,默认拒绝
xy2401
12 天前
代理检测:在线检测您是否在使用 Clash
Clash 检测工具的原理
https://v2ex.com/t/1076961
之前的帖子正好于此有关

搞清楚 客户端 a 网站 / 服务端 b 网站 / 浏览器 这三方谁有可能恶意
IvanLi127
12 天前
这个保护的是终端用户,减少用户成为肉鸡的可能,保护用户的信息安全,大概这意思。和服务端的安全嘛...没啥关系
iOCZS
12 天前
你要明白,发送请求的是浏览器,跨域也是浏览器的限制,浏览器是诚实的,不诚实的是你的脚本
raw0xff
11 天前
@restkhz 特别喜欢能够站在提问者角度讲解的答主,感谢。
浏览器访问 a 网站时 a 网站的脚本访问 b 网站,无论是 post get 还是 options ,是否响应是 b 网站自身逻辑说的算的,即便 Access-Control-Allow-Origin:* 也只是告诉浏览器 b 允许所有来源访问,至于如何响应是看代码。那么 b 网站设置 Access-Control-Allow-Origin 和 Access-Control-Allow-Methods 的意义是啥?后端不可能只声明不处理,curl postman 就能钻空子,声明了还是需要处理,那为啥还要声明?一定是某个场景需要,我就这点没搞懂。
xxxccc
11 天前
@raw0xff 本质上是为了 css 攻击的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1088029

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX