as7*_*77c 8 javascript dom same-origin-policy
当我测试SOP时,我遇到这种情况,两个文档与我期望的域具有相同的关系,当我尝试获取位置时会引发错误。
重现该问题:
let opened = window.open("https://www.google.com")opened.location.toString(),它将返回正确的位置document.domain = "www.google.com"从第一个选项卡做opened.location.toString(),您将得到一个错误
Uncaught DOMException: Blocked a frame with origin "https://www.google.com" from accessing a cross-origin frame.
at <anonymous>:1:12
Run Code Online (Sandbox Code Playgroud)谁能解释这个奇怪的行为?
此错误不是错误。同源策略是一种安全机制,可确保窗口对象只能访问它们被授权获取的信息。就您而言,这包括访问opened.location.
创建后,两个选项卡具有相同的来源,这允许第一个访问opened.location. 但是在调用 之后document.domain='www.google.com',他们不再这样做了。
“什么?但在两个标签中,window.location.origin是相同的”
是的,但它有点复杂。原点由方案/主机/端口元组定义,有关更多详细信息,请参阅@TheUnknown 的答案。方案和主机一直保持不变,它们是包含在window.location.origin.
要知道的棘手的事情是,对 的任何调用document.domain,包括document.domain = document.domain,都会导致端口号被 覆盖null,从而导致两个选项卡的来源不同,并阻止它们相互传递信息opened.location,从而导致错误。
从 MDN 的同源策略指南中提取的信息