跨域系列之(一)

2018-03-22  本文已影响0人  罗茂琛

最近或多或少经常看到跨域操作,自己也没有有个时间去专门研究透彻这一块,所以打算借此机会,好好研究一番,并为此写几篇博文,这也算巩固一下这方面的基础知识。

不过讲跨域之前就有必要先了解是什么导致了跨域才能清求,答案就是 浏览器的同源策略

那么何为 "" 呢?
首先看看RFC6454里有定义URI源的算法定义。

源包括协议、域名、端口号
标准浏览器下查看源的方式:location.origin
ie浏览器下不支持此种方式,但我们可以使用“ location.protocol查看协议、location.hostname查看域名、location.port查看端口号 ” 来查看源。

原文给出的例子:

例子 总结起来只有三个值一样,才属于同源,像图片中上面三个网址属于同源,下面的则不是。再给个具体的例子巩固下:

解决了什么是 下来就是什么是同源策略
一样来看看这篇文章的定义.

In computing, the same-origin policy is an important concept in the web application security model. Under the policy, a web browser permits scripts contained in a first web page to access data in a second web page, but only if both web pages have the same origin. An origin is defined as a combination of URI scheme, host name, and port number. This policy prevents a malicious script on one page from obtaining access to sensitive data on another web page through that page's Document Object Model.

同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源。所以lmc.com下的js脚本采用ajax读取szu.com里面的文件数据是会报错的。

• 不受同源策略限制的:
1、页面中的链接,重定向以及表单提交是不会受到同源策略限制的。
2、跨域资源的引入是可以的。但是js不能读写加载的内容。如嵌入到页面中的<script src="..."></script>,<img>,<link>,<iframe>等。

那么现实生活中,我们往往不能仅仅满足于同源之间资源共享,那么如何突破同源策略呢?

一、降域
对于主域相同而子域不同的例子,可以通过设置document.domain的办法来解决。具体的做法是可以在http://www.a.com/a.htmlhttp://script.a.com/b.html两个文件中分别加上document.domain = ‘a.com’;然后通过a.html文件中创建一个iframe,去控制iframe的contentDocument,这样两个js文件之间就可以“交互”了。当然这种办法只能解决主域相同而二级域名不同的情况,如果你异想天开的把script.a.com的domian设为alibaba.com那显然是会报错地!代码如下:

www.a.com上的a.html

document.domain = 'a.com';
var ifr = document.createElement('iframe');
ifr.src = 'http://script.a.com/b.html';
ifr.style.display = 'none';
document.body.appendChild(ifr);
ifr.onload = function(){
    var doc = ifr.contentDocument || ifr.contentWindow.document;
    // 在这里操纵b.html
    alert(doc.getElementsByTagName("h1")[0].childNodes[0].nodeValue);
};

script.a.com上的b.html document.domain = 'a.com';

问题:
1、安全性,当一个站点(b.a.com)被攻击后,另一个站点(c.a.com)会引起安全漏洞。
2、如果一个页面中引入多个iframe,要想能够操作所有iframe,必须都得设置相同domain。

上一篇下一篇

猜你喜欢

热点阅读