document.domain = document.domain做什么?

mjs*_*mjs 86 javascript orbited

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

document.domain = document.domain;
Run Code Online (Sandbox Code Playgroud)

在加载任何其他JS之前.(参见文档.)

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

小智 198

我实际上写了这段代码.

当尝试执行跨子域/端口彗星时,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),然后所有内容都匹配,并且跨端口/子域框架通信正常工作.

  • 有怪"隐藏"的端口是如何工作的MDN另一种解释:https://developer.mozilla.org/en/Same_origin_policy_for_JavaScript (6认同)

cwe*_*kly 36

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

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

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

  • 您的第一句话是了解此问题的极为重要的细节.谢谢! (7认同)

Mig*_*ing 9

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

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

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

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

  • 这并不能解释为什么`document.domain = document.domain`不是*NOOP. (6认同)

Cha*_*lie 6

document.domain如果没有明确设定是直接从实际的URL默认.浏览器将记录是否document.domain已从URL中作为默认值或是否已明确设置.两者必须是同一域的默认值,或者两者都必须显式设置为同一域才能使其工作.如果一个是默认值并且一个是显式设置的,则如果读取则两个匹配,则仍然禁止这两个页面彼此交谈.

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