跨域

什么是同源策略

  限制一个源加载的文档或脚本与来自另一个源的资源进行交互。要求源相同才能正常进行通信,即协议、域名、端口号(HTTP 协议的默认端口是 80)都完全一致。

同源策略限制的内容及原因

限制不同源发请求

  不能向工作在不同源的的服务请求数据(client to server)。
  原因:假设用户登陆了 a.com,同时打开了 b.com,如果没有任何限制,b.com 可以向 a.com 请求到任何信息,进而就可以在 b.com 向 a 发转账请求等。这里是限制了读 u,而没有限制写,因为如果连请求都发不出去了,也就无法做跨域资源共享了,无法读取返回结果,b 就无法继续下一步的操作,如获取转账请求的一些必要的验证信息。

限制跨域的 DOM 读取

  无法获取不同源的 document/cookie 等 BOM 和 DOM,可以说任何有关另外一个源的信息都无法得到 (client to client)。
  原因:如果不限制的话,那么很容易就可以伪装其它的网站,如套一个 iframe 或者通过 window.open 的方法,从而得到用户的操作和输入,如账户、密码。
  小技巧:添加这个 http 头—“X-Frame-Options: SAMEORIGIN”,可以限制别人把你的网站套成它的 iframe。

什么是跨域

  跨域是由浏览器的同源策略引起的,只有源(协议、域名、端口号)相同才能正常进行通信,域名、端口、协议任一不同,都是跨域。跨域只存在于浏览器端,不存在于安卓/ios/Node.js/python/ java 等其它环境。以下列举几种情况都属于跨域:

  1. 同一域名,不同协议
1
https://www.a.com/b.js ---> http://www.a.com/a.js
  1. 域名和域名对应 ip
1
http://70.32.92.74/b.js  ---> http://www.a.com/a.js
  1. 同一域名,不同端口
1
http://www.a.com:8000/a.js  ---> http://www.a.com/b.js
  1. 不同域名
1
http://www.cnblogs.com/a.js  ---> http://www.a.com/b.js

跨域的解决