document.domain = document.domain 有什么作用?

IT技术 javascript orbited
2021-01-28 12:02:07

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

document.domain = document.domain;

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

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

4个回答

我实际上写了这段代码。

当尝试做跨子域/端口彗星时,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),然后一切都匹配并且跨端口/子域框架通信工作。

啊,所以你是这段令人愤怒的代码的罪魁祸首。多亏了这句话,在运行(和 document.domain 设置)之后,任何动态创建的 iframe 都被设置为跨域,因此无法再访问新创建的 iframe。:/
2021-03-18 12:02:07
@mjs yes :端口号由浏览器单独保存。对 setter 的任何调用,包括 document.domain = document.domain 都会导致端口号被 null 覆盖。因此,不能仅通过在第一个中设置 document.domain = "company.com" 来使 company.com:8080 与 company.com 对话。它必须在两者中设置,以便端口号都为空。
2021-03-21 12:02:07
不幸的是,这个解决方案对我不起作用(有关详细信息,请参阅stackoverflow.com/questions/7796767/...)。将 'document.domain=document.domain' 添加到所有框架不会改变 Chrome 的行为。有任何想法吗?
2021-03-31 12:02:07
此外,我发现如果我为我的 js 设置延迟,我至少会为两个帧获得看起来有效的 URL。但是,一个框架仍然无法访问另一个框架。
2021-04-06 12:02:07
关于奇怪的“隐藏”端口如何在 MDN 上工作,还有另一种解释:developer.mozilla.org/en/Same_origin_policy_for_JavaScript
2021-04-09 12:02:07

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

显式设置该值表示意图与另一个子域(在同一父域下)上的脚本“合作”。

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

我在这个网站上找到了以下信息:devguru更具体地说,这是引用:

此属性设置或返回文档源自的服务器的域名。这默认为从中检索文档的服务器的域名,但可以更改为该名称的后缀(并且只能是后缀)。这允许在从不同服务器交付的文档之间共享脚本属性,安全性允许,前提是它们共享相同的域后缀。

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

我想如果你不接触 document.domain,js 引擎只允许来自同一个域的其他 javascripts。使用该属性,您将能够部署到其他子域,如轨道文档状态。

只是一个疯狂的猜测,但就像我说的,我猜这个属性只有在它被设置为一个值时才会被触发。
2021-03-20 12:02:07
这并不能解释为什么document.domain = document.domain不是一个空操作。
2021-04-06 12:02:07

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

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