漫谈同源策略(SOP)和跨域资源共享(CORS)

前言提要:

​ 面试的时候被问到了是否了解同源策略,并没有了解过 (虽然朋友洋写了文章,但是我当时也没有仔细琢磨)。所以有了这篇文…

​ 据说了解同源策略是十分有必要的,要深入了解XSS/CSRF等web安全漏洞,不了解同源策略如同盲人摸象一般,无法说出全貌,更无法应用其进行打击。所以我之前一直在盲人摸象…

一、同源策略(SOP)

什么是源?

答:源就是主机、协议、端口名的一个三元组;同源策略就是同协议、同端口和同主机的一个三同元组

例如:基础知识(HTTP的默认开放端口为80、HTTPS的默认开放端口443)

image-20220410153534310

源的继承

在页面中通过 about:blankjavascript: 这样的伪URL 执行的脚本会继承打开该 URL 的文档的源,因为这些类型的 URL没有包含源服务器的相关信息,数据完全来自客户端。

例如:about:blank 通常作为父脚本写入内容的新的空白弹出窗口的 URL(例如,通过 Window.open() )。由完全不同的网站创建的所有about:blank文档就都属于同源页面,如果环境适宜,就可以相互通信而完全不受限制了。

IE中的特例

Internet Explorer 的同源策略有两个主要的差异点:

  • 授信范围(Trust Zones):两个相互之间高度互信的域名,如公司域名(corporate domains),则不受同源策略限制。
  • 端口:IE 未将端口号纳入到同源策略的检查中,因此 https://company.com:81/index.htmlhttps://company.com/index.html 属于同源并且不受任何限制。

这些差异点是不规范的,其它浏览器也未做出支持,但会助于开发基于window RT IE的应用程序。

什么是同源策略(详细)?

答:同源策略(Same Origin Policy, SOP)是Web应用程序的一种安全模型,它保证了不同源(Origin,包括域名,端口和协议类型)的 Web 应用之间不能互相干扰。

​ 同源策略主要是限制了页面最后的那个脚本从另一个源加载资源时的行为,这对于防范恶意页面是一种很好的防御机制,如果恶意脚本请求了非同源的一个东西,那么这种行为就很可能因为同源策略的限制被浏览器拒绝,从而在某种程度上缓解了攻击。

​ 在SOP 的限制下,客户端脚本可以通过资源引用或者跨域表单提交向第三方服务器发送GET请求和POST请求,但是却不能读取响应内容。例如,在图1中,a.com网站脚本可以向 b.com 服务器发送 GET 请求,但是浏览器SOP会阻止其读取响应内容。

image-20220410195833772

为什么要有同源策略?

答:同源策略是一个重要的安全基石,它的目的是为了保证用户信息的安全,防止恶意网址窃取数据。

​ 设想一下如果没有同源策略将导致的安全风险:

​ 假设用户在访问银行网站,并且没有登出。然后他又去了任意的其他网站,刚好这个网站有恶意的js代码,在后台请求银行网站的信息。因为用户目前仍然是银行站点的登陆状态,那么恶意代码就可以在银行站点做任意事情。例如,获取你的最近交易记录,创建一个新的交易等等。因为浏览器可以发送接收银行站点的session cookies,在银行站点域里。访问恶意站点的用户希望他访问的站点没有权限访问银行站点的cookie。当然确实是这样的,js不能直接获取银行站点的session cookie,但是他仍然可以向银行站点发送接收附带银行站点session cookie的请求,本质上就像一个正常用户访问银行站点一样。关于发送的新交易,甚至银行站点的CSRF(跨站请求伪造)防护都无能无力,因为脚本可以轻易的实现正常用户一样的行为。所以如果你需要session或者需要登陆时,所有网站都面临这个问题。

同源策略到底限制了什么?

答:同源策略只作用于实现了同源策略的WEB客户端上,它限制了一个源上的脚本访问来自另一个源的数据。

我们会发现SOP其实在防止CSRF上的作用非常有限,CSRF的请求往往在发送出去的一瞬间就达到了攻击的目的比如发送了一段敏感数据或者请求了一个具体的功能,是否能读取回复其实并不是那么重要(唯一的作用是可以防止CSRF请求读取异常源的授权Token),另外一般静态资源通常不受同源策略的限制,比如png/jpg/css/js等

跨域资源共享(CORS)

在某些情况下同源策略太严格了,给拥有多个子域的大型网站带来问题。如果非同源,共有三种行为受到限制

  • Cookie、LocalStorage 和 IndexDB 无法读取。

  • DOM 无法获得。

  • AJAX 请求不能发送。

虽然这些限制是必要的,但是有时很不方便,合理的用途也受到影响。下面,我将详细介绍,如何规避上面三种限制的技术方法:跨域资源共享(CSRS)

CORS是什么?

答:跨来源资源共享(Cross-Origin Resource Sharing(CORS))是使用额外HTTP标头来让目前浏览网站的user agent能获得访问不同来源(网域)服务器特定资源之权限的一种浏览器机制。

​ CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。

​ 整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。

​ 因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。

CORS的工作原理?

答:CORS 的基本原理是,第三方网站服务器生成访问控制策略,指导用户浏览器放宽 SOP 的限制,实现与指定的目标网站共享数据。具体工作流程可分为三步,如图2所示:

  1. 请求方脚本从用户浏览器发送跨域请求。浏览器会自动在每个跨域请求中添加Origin头,用于声明请求方的源。
  2. 资源服务器根据请求中Origin头返回访问控制策略(Access-Control-Allow-Origin响应头),并在其中声明允许读取响应内容的源。
  3. 浏览器检查资源服务器在Access-Control-Allow-Origin头
  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1erkeU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值