跨域
什么是同源策略
限制一个源加载的文档或脚本与来自另一个源的资源进行交互。要求源相同才能正常进行通信,即协议、域名、端口号(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 | https://www.a.com/b.js ---> http://www.a.com/a.js |
- 域名和域名对应 ip
1 | http://70.32.92.74/b.js ---> http://www.a.com/a.js |
- 同一域名,不同端口
1 | http://www.a.com:8000/a.js ---> http://www.a.com/b.js |
- 不同域名
1 | http://www.cnblogs.com/a.js ---> http://www.a.com/b.js |