首页 > 解决方案 > JavaScript document.domain Uncaught DOMException: Blocked a frame with origin

问题描述

当我测试 SOP 时,我遇到了这种情况,两个文档与我预期的相同域有关系,当我尝试获取位置时它会引发错误。

要重现问题:

  1. 打开https://www.google.com
  2. 从控制台let opened = window.open("https://www.google.com")
  3. 从同一个窗口执行opened.location.toString()这将返回正确的位置
  4. 从第二个选项卡的控制台做document.domain = "www.google.com"
  5. 从第一个选项卡做opened.location.toString(),你会得到一个错误

    Uncaught DOMException: Blocked a frame with origin "https://www.google.com" from accessing a cross-origin frame.
    at <anonymous>:1:12
    

谁能解释这种奇怪的行为?

标签: javascriptdomsame-origin-policy

解决方案


此错误不是错误。同源策略是一种安全机制,可确保窗口对象只能访问它们被授权获取的信息。在您的情况下,这包括访问opened.location.

创建后,两个选项卡具有相同的来源,允许第一个选项卡访问opened.location. 但是在调用 to 之后document.domain='www.google.com',他们不再这样做了。

“什么?但在两个选项卡中,window.location.origin都是相同的”

是的,但它有点复杂。来源由方案/主机/端口元组定义,有关更多详细信息,请参阅@TheUnknown 的答案。方案和主机始终保持不变,并且它们是包含在window.location.origin.

要知道的棘手的事情是,任何对 的调用document.domain,包括document.domain = document.domain,都会导致端口号被 覆盖null,从而导致两个选项卡的来源不同,并阻止它们相互通信信息opened.location,从而导致错误。

从 MDN 的同源策略指南中提取的信息


推荐阅读