使用JavaScript,为什么看起来你可以使用window对象在页面之间传递值?

时间:2016-01-18 23:38:47

标签: javascript security

我正在HTML页面上进行一些实验,并说如果我做了

name = "hmm";
console.log(name);

然后我将其加载到Google Chrome中,并自然地显示"hmm"

问题是,如果我删除第一行或将其注释掉,并重新加载页面,它将再次显示"hmm"。如果我创建了另一个网页index2.html,并且只打算

console.log(name);

并将浏览器中的网址从index.html更改为index2.html,它会再次显示"hmm"

所以我认为这是由于window.name具有此值。但是,我从来不知道两个页面可以分享这样的价值。我认为window对象应该重新开始,不应该超过......

仅在name时发生。 foo不会发生这种情况,但我认为即使name也不应该继续使用。

发生了什么事?什么是跨网站(跨域?)真的不应该发生,即使它是同一个网站,应该吗?

1 个答案:

答案 0 :(得分:1)

  

我从来不知道两个页面可以共享这样的值。

呀。通常情况下,他们不会。这只是因为您使用了特定的变量名if(in.hasNextLine()) { s = in.nextLine(); if(s.length() > n) s = s.substring(0, n); // Cut the string so it is of the desired length else { for(int i = 0; i < n - s.length(); i++) s += " "; // Add spaces until the string is of the desired length } } ,并在全局范围内使用它,它与同名的name属性相同。

window是一个奇怪的事情,可以追溯到跨文档脚本的早期。作为一种设计,它今天没有任何意义,但它很难摆脱旧的网络行为。

当Netscape在Navigator 2.0中引入JavaScript和框架时,安全性并不是第一优先。网络是一个不同的,威胁较小的地方,出于商业原因,他们更关心的是在浏览器中添加任何和所有可能的功能,而不是设计一个连贯和安全的平台。

同源政策尚未处于起步阶段,并未被视为必不可少的基本保障措施,在设计更好,更宽松的情况下更是一种不受欢迎的阻碍。他们有一种黑名单的本能:添加功能并允许默认访问,除非它被证明是一个安全问题。

弹出窗口中的window.name属性反映了被调用以打开它的window.name方法的name参数;在框架上,它反映了包含它的window.open(或name)元素的<frame>属性。预计脚本将希望通过<iframe>访问和导航相关窗口(甚至是子窗口,例如帧内的帧),甚至跨越不同的域,甚至在导航原始文档时也是如此。(*)

因此,name的许多属性(包括window)可以从原点外部访问,并且兼容性remain there today,包含一系列复杂的警告和限制源于无休止的浏览器安全漏洞。

(*事实证明没有多少人愿意这样做,但他们确实希望能够在不同域的两个窗口之间传递字符串数据。这些天我们只会使用{{1这是为了这个明确的目的而设计的,但当时唯一的方法就是使用对双方都是读写的唯一属性name。这是笨拙且有限的,但有一些现有的网站做到了这一点,使得从网络平台上删除非常困难。)

Upshot:将内容放入window.postMessage可能会产生无法预料的后果,因此请尽量将全局变量保持在绝对最小值,并避免使用name等现有属性。