文档:domain 属性

已弃用:此特性不再推荐。虽然某些浏览器可能仍然支持它,但它可能已经从相关的网络标准中删除,可能正在删除过程中,或者可能仅为兼容性目的而保留。请避免使用它,如果可能,请更新现有代码;请参阅本页底部的兼容性表格以指导您的决策。请注意,此特性可能随时停止工作。

Document 接口的 domain 属性获取/设置当前文档来源(origin)的域部分,该域用于同源策略

字符串。

异常

SecurityError DOMException

文档禁止设置其域,例如,它处于沙盒中或具有不透明的来源。详情请参阅“失败”部分

示例

获取域

对于在 URL https://mdn.org.cn/en-US/docs/Web 运行的代码,此示例会将 currentDomain 设置为字符串 "developer.mozilla.org"

js
const currentDomain = document.domain;

此属性的 getter 返回当前文档来源的域部分。在大多数情况下,这将是文档 URL 的主机名部分。但是,也有一些例外情况:

  • 如果页面具有不透明的来源,例如,对于具有数据 URL 的页面,则它将返回空字符串。
  • 如果使用了 document.domain setter,则它将返回已设置的值。

尽管 getter 不像 setter 那样危险,但使用 Location.hostname 属性可能更简单和更有用。这样你就可以完全避免使用 document.domain

js
const currentHostname = location.hostname;

对于 URL https://mdn.org.cn/en-US/docs/WebcurrentHostname 也是字符串 "developer.mozilla.org"。其他提供略微不同信息的替代方案是 Location.host(包含端口)和 Window.origin(提供完整来源)。

设置域

js
document.domain = domainString;

此属性的 setter 可用于更改页面的来源,从而修改某些安全检查的执行方式。它只能设置为相同或父域。例如,如果 https://a.example.comhttps://b.example.com 都使用

js
document.domain = "example.com";

那么它们都修改了它们的来源以具有相同的域,并且它们现在可以直接访问彼此的 DOM——尽管是跨域的,这通常会阻止此类访问。

请注意,将 document.domain 设置为其当前值并非空操作。它仍然会更改来源。例如,如果一个页面设置了

js
document.domain = document.domain;

那么它将被视为与任何其他未进行相同操作的正常同源页面跨源。

废弃

document.domain setter 已废弃。它破坏了同源策略提供的安全保护,并使浏览器中的来源模型复杂化,导致互操作性问题和安全漏洞。

尝试设置 document.domain 是危险的。它开放了从所有子域对页面 DOM 的完全访问权限,这可能不是预期行为。它还会从来源中移除端口组件,因此现在您的页面可以被具有相同 IP 地址或相同主机组件的其他页面访问,即使在不同的端口上。

这在共享主机上尤其不安全。例如,另一个共享主机客户可以在相同的 IP 地址但在不同的端口上托管一个站点,然后设置 document.domain 将移除通常保护您免受该其他客户站点访问您的站点数据的同源保护。

共享主机站点给每个客户一个不同的子域时也会出现类似问题。如果一个站点设置了 document.domain,任何其他子域上的客户现在都可以做同样的事情,并开始访问原始站点的数据。

您不应使用 document.domain 来促进跨域通信,而应使用 Window.postMessage 向其他来源发送异步消息。这种通过消息传递进行的受控访问比 document.domain 导致的所有数据全面暴露要安全得多。

失败

在以下几种情况下,setter 将抛出 SecurityError DOMException