document.domain = document.domain 是什么意思?(涉及IT技术)

95

Orbited的客户端JS组件(一个Comet服务器)要求如果服务器正在运行的域或端口与JS本身不同,则必须执行以下操作:

document.domain = document.domain;

在加载任何其他JS之前运行。(请参阅文档。)

这是做什么的?看起来像一个NOOP!(我已经检查过,事实上是必要的。)

4个回答

209

这段代码是我自己写的。

当尝试跨子域/端口使用comet时,iframe需要与父框架具有相同的document.domain值。不幸的是,浏览器在原始的document.domain值中内部存储了域名和端口。但是javascript中的getter和setter对端口一无所知。因此问题在于:如果顶部框架的document.domain('example.com', 80),底部框架为('comet.example.com', 80),如何使底部框架也变为('example.com', 80)

你无法这样做,因为更改主机名部分必然会将端口设置为null,所以在底部框架中的最佳结果是('example.com', null)。 因此,顶部框架也需要设置为该值,而设置document.domain=document.domain就可以达到这个目的。它将浏览器中的内部表示从('example.com', 80)更改为('example.com', null),然后所有内容都匹配,并且跨端口/子域框架通信正常工作。


很遗憾,这个解决方案对我没有起作用(请参见http://stackoverflow.com/questions/7796767/is-it-possible-to-alter-one-frame-from-another-using-javascript以获取详细信息)。将“document.domain = document.domain”添加到所有框架中并不能改变Chrome的行为。有什么想法吗? - Stephen Gross
此外,我发现如果我为我的js设置延迟,至少两个框架的URL看起来是有效的。然而,仍然有一个框架无法访问另一个框架。 - Stephen Gross
6
这里有一个关于 MDN 上奇怪的“隐藏”端口如何工作的另一种解释:https://developer.mozilla.org/en/Same_origin_policy_for_JavaScript。 - mjs
1
啊,原来是你写了这个让人恼火的代码。由于这一行的存在,在它被执行后(并设置了document.domain),任何动态创建的iframe都会被设置为跨域,因此新创建的iframe将无法再被访问。:/ - crappish
@mjs 是的:端口号由浏览器单独保存。任何调用setter的操作,包括document.domain = document.domain,都会使端口号被重写为null。因此,只有在两个地方都设置document.domain =“company.com”,才能让company.com:8080与company.com通信,而不能仅在第一个地方进行设置。这样,两个端口号都将变成null。 - Royi Namir
请注意,自从https://www.fxsitecompat.com/en-CA/docs/2013/setting-document-domain-in-a-sandboxed-iframe-is-no-longer-allowed/之后,您*应该*将`document.domain = document.domain`放在try-catch块中。 - Mikko Rantalainen

38

浏览器会区分以下两种情况: (a) 当未显式设置document.domain时, (b) 当显式设置了document.domain时.... 即使它们返回的是相同的值。

显式地设置这个值表示有意愿与另一个子域下(同一父域名下)的脚本“合作”。

如果父页面和外部脚本都将document.domain显式设置为相同的值,则可以绕过同源策略限制,每个脚本都可以访问彼此上下文中的所有(本来受限制的)对象和属性。


9
我在这个网站上找到如下信息:devguru。更具体地说,以下是引用内容: 此属性设置或返回文档来源服务器的域名。此默认为检索文档的服务器的域名,但可以更改为此名称的后缀(仅为后缀)。这允许从不同服务器交付的文档之间共享脚本属性(安全性允许),只要它们共享相同的域名后缀。 看起来它允许同一域名下的跨站点脚本攻击(即使子域名不同)。
我认为如果您不触及document.domain,则js引擎仅允许来自同一域的其他javascript。有了该属性,您将能够像orbited文档所述那样部署到其他子域。

6
这并不解释为什么 document.domain = document.domain 不是一个 NOOP。 - Crescent Fresh
1
只是一个猜测,但我想该属性仅在设置为某个值时才会触发。 - Miguel Ping

6
document.domain会从实际URL中获取默认值,如果没有明确设置的话。浏览器会记录document.domain是从URL中获取的默认值还是明确设置的。两者必须都是同一个域名的默认值或都必须明确设置为相同的域名才能正常工作。如果一个是默认值,一个是明确设置的,但读取时两个匹配,则两个页面仍将被禁止彼此通信。

请参见:https://developer.mozilla.org/en-US/docs/DOM/document.domain


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接