2

什么是同源

同domain(或ip),同端口,同协议视为同一个域,一个域内的脚本仅仅具有本域内的权限,可以理解为本域脚本只能读写本域内的资源,而无法访问其它域的资源。这种安全限制称为同源策略。

为什么要有同源限制

同源策略的目的主要是为了防止恶意获取/修改网站数据。而这些数据主要包括cookie,LocalStorage,DOM,以及发送的AJAX请求。
假设现在没有同源策略,会发生什么事情呢?大家知道,JavaScript可以做很多东西,比如:读取/修改网页中某个值。恩,你现在打开了浏览器,在一 个tab窗口中打开了银行网站,在另外一个tab窗口中打开了一个恶意网站,而那个恶意网站挂了一个的专门修改银行信息的JavaScript,当你访问 这个恶意网站并且执行它JavaScript时,你的银行页面就会被这个JavaScript修改,后果会非常严重!而同源策略就为了防止这种事情发生。
所以,我们可以知道,同源策略是必须的,但是,有的时候我们还是要规避同源策略的限制,比如说从A网站跳到B网站时,我们要读到A网站的cookie。

document.domain

document.domain属性用来得到当前网页的域名。
我们也可以给document.domain属性赋值,不过是有限制的,你只能赋成当前的域名或者基础域名。
比如:你当前域名是qa-my.test.segmentgault.com
那么你就可以设置

document.domain = ".test.segmentgault.com"

或者

document.domain = "qa-my.test.segmentgault.com"

上面的赋值都是成功的,因为qa-my.test.segmentgault.com是当前的域名,而.test.segmentgault.com是基础域名。
但是下面的赋值就会出来"参数无效"的错误:

document.domain = "google.com"

clipboard.png

因为google.com即不是当前的域名也不是当前域名的基础域名,所以会有错误出现。
这是为了防止有人恶意修改document.domain来实现跨域偷取数据。

利用document.domain 实现共享cookie

Cookie 是服务器写入浏览器的一小段信息,只有同源的网页才能共享。浏览器允许基础域名相同的网站间通过设置document.domain共享 Cookie。
举例来说,A网页是

http://my.segmentfault.com/a.html

B网页是

http://he.segmentfault.com/b.html

那么只要设置相同的document.domain,两个网页就可以共享Cookie。

document.domain = 'segmentfault.com'

现在,A网页通过脚本设置一个 Cookie

document.cookie = "domainTest=hello world"

B网页就可以读到这个Cookie


wupengyu
1.8k 声望166 粉丝

写作是为了更好的思考