浅谈一下浏览器的同源策略

150 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情 今天分享一些数据库的一些小知识。

同源策略是一个重要的安全策略,它用于限制一个origin的文档或者它加载的脚本如何能与另一个源的资源进行交互。 它能帮助阻隔恶意文档,减少可能被攻击的媒介。

同源策略是指在Web浏览器中,允许某个网页脚本访问另一个网页的数据,但前提是这两个网页必须有相同的URI、主机名和端口号,一旦两个网站满足上述条件,这两个网站就被认定为具有相同来源。此策略可防止某个网页上的恶意脚本通过该页面的文档对象模型访问另一网页上的敏感数据。

同源策略对Web应用程序具有特殊意义,因为Web应用程序广泛依赖于HTTP cookie来维持用户会话,所以必须将不相关网站严格分隔,以防止丢失数据泄露。

值得注意的是同源策略仅适用于脚本,这意味着某网站可以通过相应的HTML标签访问不同来源网站上的图像、CSS和动态加载脚本等资源。而跨站请求伪造就是利用同源策略不适用于HTML标签

总的来说同源策略是用来保护客户端的一种措施。

要搞清楚这里面的缘由需要先了解三个基本概念:

  1. 浏览器是会根据请求的域来记录 Cookies的,当发出请求时,同样会携带与请求的域对应的 Cookies ;
  2. 用户登录的会话信息一般都是记录在 Cookies 中;
  3. 浏览器会将当前页面的域记录在 Document 对象的一个域的属性中。

如果没有了同源策略会出现如下一些问题:

  1. 当你在银行网站登录的时候,登录后该网站的域会记录在cookie中记录登录会话;
  2. 当你访问钓鱼网站的时候,钓鱼网站直接在浏览器端请求英航转账接口进行转账,浏览器自动读取了银行网站域的cookie,并向银行服务器发送请求;
  3. 银行服务器收到了请求,验证 Cookies 有效,将你的钱统统转走。

如果银行网站的服务器正确的配置了CORS信息头,而浏览器的同源策略正常工作的话就不会出现这种问题,就会变成:当你访问钓鱼网站时,钓鱼网站尝试让浏览器请求银行的转账接口进行转账,浏览器会向银行服务器询问CORS头,得到的回复回事仅支持网银网站域请求,则会拒绝该次请求。

当然这套机制是建立在用户浏览器是严格按照同源策略开发,且DNS没有被劫持,且服务器正确配置了CORS头的前提下才是有效的。

当然 Web 安全是一套体系,同源策略只是其中一个机制,用于防范某几个安全风险,就像一个拼图,虽然防不了所有的攻击手段,但所有拼图都拼全了就能有完整的防御性了。

为了确保用户是来自自己网页的合法请求,可以通过Access-Control-Allow-Origin来阻止来自其他地方的非法请求。 那么,你也可以想象一下,为什么这么多国内厂商都争先恐后地做浏览器。 这个浏览器的权限实在是太大太重要了,简直就是个操作系统。