越学越懵,同源策略到底是为了保护浏览器还是服务器?

2021-09-30 09:49:50 +08:00
 James369
按道理讲,同源策略限制浏览器访问不同源的资源,从而保护浏览器端,比如防止 XSS 跨站脚本攻击。
但是,现在服务器又搞了一个 Access-Control-Allow-Origin,那如果恶意攻击的服务器都返回 Access-Control-Allow-Origin:*,那启不是对浏览器很危险?

确实有点懵...
3021 次点击
所在节点    Chrome
13 条回复
mxT52CRuqR6o5
2021-09-30 09:51:21 +08:00
是为了保护用户
mxT52CRuqR6o5
2021-09-30 09:52:27 +08:00
你访问钓鱼网站时,同源策略限制网站无法在后台偷偷调用支付宝转账接口把你的钱转走
James369
2021-09-30 09:54:50 +08:00
@mxT52CRuqR6o5 那 CORS 跨域是否会让同源破防?
mxT52CRuqR6o5
2021-09-30 10:17:06 +08:00
@James369 能具体描述一下你所说的的”同源破防”吗?
tabris17
2021-09-30 10:18:01 +08:00
@James369 这不叫破防,这叫授权跨域
lscexpress
2021-09-30 10:23:57 +08:00
那如果恶意攻击的服务器都返回 Access-Control-Allow-Origin:*,那启不是对浏览器很危险?

大哥,如果是培训班的多写几个项目。如果才进入职场,问问周围同事。浏览器请求服务端,服务端再响应浏览器,不是哪个服务器来请求浏览器。( websocket 不提,websocket 也是浏览器主动建立连接)

好奇是好事,好奇就去看文档,Google 查。
chezs66
2021-09-30 10:27:47 +08:00
首先,浏览器和服务器都没有价值,保护用户才有意义。
考虑两个经典场景
1.用户打开钓鱼网站:钓鱼网站尝试向源站点发起请求,因此一方面需要浏览器主动拒绝 response (同源策略),同时需要服务端防御 CSRF 攻击。
2.用户打开正经网站:部分数据被污染,因此需要防御 XSS 攻击
mxT52CRuqR6o5
2021-09-30 10:32:32 +08:00
@James369
浏览器会默认限制跨域的访问(只有简单请求不会被跨域策略限制),如果确实需要跨域访问,则需要被访问的网站显式的在 response 返回 Access-Control-Allow-XXX 的 header 显式的声明允许谁跨域访问允许怎样的跨域访问
因此服务器无脑返回 Access-Control-Allow-Origin:*确实是很危险的行为
(当然上古时代还有个 jsonp 的跨域方案,现在似乎都不推荐了)
rationa1cuzz
2021-09-30 10:36:37 +08:00
个人理解:首先同源策略是用来保护用户,方式跨站伪造请求和 xss 的,既不是保护浏览器也不是保护服务器。其次,Access-Control-Allow-Origin:*,等于服务器放弃限制,对于一些安全要求不高的无所谓的。
libook
2021-09-30 12:39:40 +08:00
同源策略是用来保护客户端的。

先了解三个基本原理:
1. 浏览器会根据请求的域来记录 Cookies,当发出请求的时候,同样会携带与请求的域对应的 Cookies ;
2. 用户登录会话信息通常记录在 Cookies 中;
3. 每个网页都有一个主要的 Document 对象,而浏览器会将当前页面的域记录在 Document 对象的一个描述当前域的属性中。

假设没有同源策略:
1. 用户在网银网站登录,登录会话存储在网银网站域对应的 Cookie 里;
2. 用户访问钓鱼网站,钓鱼网站直接在浏览器端请求网银接口进行转账,浏览器自动读取了网银网站域的 Cookie,随请求一同发到网银服务器。
3. 网银服务器收到了请求,验证 Cookies 有效,即进行了转账操作。

假设网银接口服务器正确配置了 CORS 头信息,而浏览器的同源策略也能正常工作的话,第 2 步就会变成:
用户访问钓鱼网站,钓鱼网站尝试令浏览器请求网银接口进行转账,浏览器会先向网银网站的服务器询问 CORS 头,得知仅允许网银网站域请求,读取当前网页域为非网银网站域,则拒绝发出请求到网银服务器。

当然 WebStorage 也是按域存储和访问的,只不过不会自动随请求发送而已,会限制同一域的网页才能访问 WebStorage 的内容。

这套机制的有效性,建立在如下基础上的:
1. 用户用的浏览器是正规的、严格按照同源策略标准开发的;
2. DNS 没有被劫持,或开启了 TLS 验证,即不可能伪造相同的域;
3. 接口服务器正确配置了 CORS 头。
以上三项任意一项有问题都会使得同源策略失效。

当然 Web 安全是一套体系,同源策略只是其中一个机制,用于防范某几个安全风险,就像一个拼图,虽然防不了所有的攻击手段,但所有拼图都拼全了就能有完整的防御性了。
James369
2021-09-30 13:51:46 +08:00
@libook 看完你这么一说,我突然有种提壶灌顶的感觉,也就是说服务方 为了确保用户是从自己的网页发起的正当请求(才给放行),其它地方过来的非法请求都可以用 Access-Control-Allow-Origin 来进行屏蔽。 (刚开始我还以为是服务器为了防止第三方盗链或者盗用接口而做的设定)。
那么,也可以想像为什么那么多国内厂商争先恐后的去做浏览器,这个浏览器的权限真是太大太重要了,简直就是一个操作系统。
dengshen
2021-09-30 15:47:57 +08:00
现在网银转账都需要手机验证码了。还会校验 ip 是否是常用的 ip 地址。
alexkkaa
2021-10-28 21:51:47 +08:00
同源是为了在重要页面保证安全。但是在需要某些跨站请求的情况下比如某些 flash flv jsonp 等最好做成一个接口而不是页面 而且可以采取子域名

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

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

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

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

© 2021 V2EX