为何要跨域
浏览器为了防止csrf(跨站请求伪造),NetScape提出的一个著名的安全策略:同源策略。所谓的同源,指的是协议,域名,端口相同。浏览器处于安全方面的考虑,只允许本域名下的接口交互,不同源的客户端脚本,在没有明确授权的情况下,不能读写对方的资源。
同源三要素
- 协议相同
- 域名相同(域名和对应的ip也被视为不同,因为浏览器不会为你请求dns判断)
- 端口相同
随着互联网的发展,"同源政策"越来越严格。目前,如果非同源,共有三种行为受到限制。
- Cookie、LocalStorage和IndexDB无法读取。
- DOM 无法获取。
- AJAX 请求不能发送。
如何跨域
如果需要跨域请求,那么有如下几种方法:
不同二级域名下cookie共享
如果两个网页一级域名相同,只是二级域名不同,浏览器允许通过设置document.domain共享 Cookie。
设置方法:
#两个网站设置相同的document.domain属性
document.domain = 'example.com';
A网站设置cookie:
document.cookie = "test1=hello";
B网站访问cookie:
var allCookie = document.cookie; //可以获取到
注意:如果共享了cookie,也就意味着只要有一个网站被攻击成功,另一个网站的cookie也将被获取。有黑客论坛专门讲过从其他二级域名下手攻克网站的教程。
这种方法有一定局限性如下:
- 如果修改了document.domain,则在某些机器上的IE678里,获取location.href有权限异常。
- 如果页面修改了document.domain,则它包含的iframe,必须也设domain,才能进行交互。就算是同域的页面也必须要设。
- 这种方法不适用于LocalStorage 和 IndexDB ,要使用其他方法规避。
JSONP
它的基本思想是,浏览器对于带有src的标签,不被同源策略限制,网页通过添加一个