41

如何跨域请求

 3 years ago
source link: http://www.cnblogs.com/vinter/p/12952239.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

为何要跨域

浏览器为了防止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也将被获取。有黑客论坛专门讲过从其他二级域名下手攻克网站的教程。

这种方法有一定局限性如下:

  1. 如果修改了document.domain,则在某些机器上的IE678里,获取location.href有权限异常。
  2. 如果页面修改了document.domain,则它包含的iframe,必须也设domain,才能进行交互。就算是同域的页面也必须要设。
  3. 这种方法不适用于LocalStorage 和 IndexDB ,要使用其他方法规避。

JSONP

它的基本思想是,浏览器对于带有src的标签,不被同源策略限制,网页通过添加一个


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK