javascript - JavaScript document.domain Uncaught DOMException: Blocked a frame with origin
问题描述
当我测试 SOP 时,我遇到了这种情况,两个文档与我预期的相同域有关系,当我尝试获取位置时它会引发错误。
要重现问题:
- 打开https://www.google.com
- 从控制台
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
谁能解释这种奇怪的行为?
解决方案
此错误不是错误。同源策略是一种安全机制,可确保窗口对象只能访问它们被授权获取的信息。在您的情况下,这包括访问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 的同源策略指南中提取的信息
推荐阅读
- json - Node JS:将原始 json 的 segemets 与页面源分开的有效方法,这样更容易将键和值分组到数组中
- rest - 如何将 multipart/mixed 嵌入到 multipart/form-data 中?
- javascript - 预渲染 React 应用程序
- javascript - 查找以酶类开头的 div
- mysql - 字段列表中的 MySQL 未知列。触发原因?
- angular - 角度形式验证`min`不起作用
- android - Android 对话框未正确调整大小
- python - 什么时候调用 callable() 仍然会失败?
- javascript - Javascript - 转换隐藏/显示 FX
- vba - 将列表框中的选定行插入工作表