document.domain = document.domain的作用是什么?


90

Orbited(Comet服务器)的客户端JS组件要求,如果服务器在JS本身的不同域或端口上运行,则必须执行

document.domain = document.domain;

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

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

Answers:


202

我实际上写了这段代码。

尝试做跨子域/端口彗星时,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),然后一切都匹配了,跨端口/子域框架通信正常进行。


不幸的是,该解决方案不适用于我(有关详细信息,请参见stackoverflow.com/questions/7796767/…)。将'document.domain = document.domain'添加到所有框架不会改变Chrome的行为。有任何想法吗?
斯蒂芬·格罗斯

另外,我发现,如果我为我的js设置了延迟,那么我至少会获得两个框架的有效URL。但是,一个框架仍然无法访问另一框架。
斯蒂芬·格罗斯

6
在MDN上,还有一个关于奇怪的“隐藏”端口如何工作的解释:developer.mozilla.org/en/Same_origin_policy_for_JavaScript
mjs 2012年

1
嗯,所以您是这段令人发指的代码的罪魁祸首。多亏了上述一行,在运行(并设置了document.domain)之后,所有动态创建的iframe都被设置为跨域,因此无法再访问新创建的iframe。:/
崩溃

@mjs yes:端口号由浏览器单独保存。对setter的任何调用(包括document.domain = document.domain)都会导致端口号被覆盖为null。因此,不能仅通过在第一个中设置document.domain =“ company.com”来使company.com:8080与company.com进行通信。必须在两者中都设置它,以便端口号都为空。
罗伊·纳米尔

38

浏览器区分(a)未显式设置的document.domain和(b)未显式设置的document.domain ...,即使它们返回相同的值。

明确设置该值表示打算与另一个子域(在同一父域下)的脚本“合作”。

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


9

我在此站点上找到了以下信息:devguru。更具体地说,这是报价:

此属性设置或返回文档所源自的服务器的域名。该默认值是获取文档的服务器的域名,但可以更改为该名称的后缀(仅后缀)。这允许在不同服务器提供的文档共享相同的域后缀的情况下,在不同服务器之间共享脚本属性和安全性。

在我看来,它允许跨站点脚本编写相同的域(即使子域不同)。

我想如果您不触摸document.domain,则js引擎仅允许来自相同域的其他javascript。有了该属性,您将能够部署到其他子域,例如轨道文档状态。


6
这并不能解释为什么document.domain = document.domain不是一个空操作。

1
只是一个疯狂的猜测,但是就像我说的那样,我猜该属性仅在将其设置为值时才触发。
Miguel Ping 2009年

6

document.domain如果没有明确设定是直接从实际的URL默认。浏览器将记录document.domainURL的默认设置或是否已明确设置。两者都必须是同一域的默认值,或者两者都必须显式设置为同一域才能起作用。如果默认设置为一个,并且显式设置为一个,则两个都匹配(如果已读取),则仍将禁止两个页面相互交谈。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.