跨域

刚好这段时间对接其他产品,刚好处理了一下跨域的问题,借此机会稍微更加了解一下跨域(Cross-origin resource sharing)。

搬运搬运…

首先什么是同源策略?

同源策略是一种Web浏览器安全性机制,旨在防止网站相互攻击。

同源策略限制一个源上的脚本访问另一源的数据。源由URI方案,域和端口号组成。

同源策略是一种限制性的跨域规范,它限制了网站与源域外部资源进行交互的能力。起源于多年前的策略是针对潜在的恶意跨域交互(例如,一个网站从另一个网站窃取私人数据)做出的响应。通常,它允许一个域向其他域发出请求,但不允许访问响应。

同源策略它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击。所谓同源是指”协议+域名+端口”三者相同,即便两个不同的域名指向同一个ip地址,也非同源。

同源策略限制以下几种行为:

1
2
3
1.) Cookie、LocalStorage、IndexedDB 等存储
2.) DOM查询
3.) AJAX 请求

但是有三个标签是允许跨域加载资源:

1
2
3
4
5
<img src=XXX> 

<link href=XXX>

<script src=XXX>

常见跨域场景

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
URL                                      说明                    是否允许通信
http://www.domain.com/a.js
http://www.domain.com/b.js 同一域名,不同文件或路径 允许
http://www.domain.com/lab/c.js

http://www.domain.com:8000/a.js
http://www.domain.com/b.js 同一域名,不同端口 不允许

http://www.domain.com/a.js
https://www.domain.com/b.js 同一域名,不同协议 不允许

http://www.domain.com/a.js
http://192.168.4.12/b.js 域名和域名对应相同ip 不允许

http://www.domain.com/a.js
http://x.domain.com/b.js 主域相同,子域不同 不允许
http://domain.com/c.js

http://www.domain1.com/a.js
http://www.domain2.com/b.js 不同域名 不允许

跨域解决方案

1、 通过jsonp跨域
2、 iframe跨域
5、 postMessage跨域
6、 跨域资源共享(CORS)
7、 nginx代理跨域
8、 nodejs中间件代理跨域
9、 WebSocket协议跨域

比较抱歉的是我只用过nginx代理跨域、跨域资源共享(CORS)、WebSocket协议跨域…。

什么是CORS(跨域资源共享)?

在大多数情况下,在用户浏览器中运行的脚本仅需要访问源相同的资源(请考虑首先对服务JavaScript代码的同一后端进行API调用)。因此,JavaScript通常无法访问其他来源的资源,这对安全性而言是一件好事。但是有些情况下需要跨域请求的。例如,不同系统间的一些对接。解决该问题就需要实现CORS,跨域资源共享(CORS)是一种浏览器机制,可实现对位于给定域外部的资源的受控访问。

CORS如何运作

如果不需要cookie的话,整个CORS通信过程都是浏览器自动完成的,前端不需要做额外的编码。浏览器一旦发现请求跨源,就会自动添加一些附加的头信息,复杂请求还会多一次预检的请求,但我们是不用感知的。因此,实现CORS通信的关键是服务器开启CORS。

参考

本文引用的内容,如有侵权请联系我删除,给您带来的不便我很抱歉。