我在不同的域中使用下面的iframe
,但是不知何故,父窗口在Chrome和Firefox中都被重定向了。这不是应该由于跨域策略而被阻止吗?
我可以通过将 sandbox=""
属性添加到iframe
来阻止它,但我仍然很好奇为什么这是可能的。
<html>
<body>
<iframe src="http://www.samplicio.us/router/default.aspx?SID=0db760c8-4858-4773-9e67-ca7e2cdb3cba&PID=7525e17a-a799-416c-bf84-4ea2e75ac332&AGE=24&GENDER=1&HISPANIC=1ÐNICITY=1&STANDARD_HHI_US=3" />
</body>
</html>
虽然同源策略确实会阻止从跨域框架访问Window
属性,但 location
属性是一个特殊的例外。
来自 MDN 文章的跨源脚本 API 访问部分,了解同源策略。
JavaScript API,如
iframe.contentWindow
、window.parent
、window.open
和window.opener
允许文档直接相互引用。当两个文档的源不同时,这些引用提供对Window
和Location
对象的非常有限的访问,如下两节所述。
跨源窗口:
MDN 列出了以下方法和属性或Window
对象允许跨源,符合规范。
方法:
-
window.blur
-
window.close
-
window.focus
-
window.postMessage
属性:
-
window.closed
(只读) -
window.frames
(只读) -
window.length
(只读) -
window.location
(读/写) -
window.opener
(只读) -
window.parent
(只读) -
window.self
(只读) -
window.top
(只读) -
window.window
(只读)
跨源位置:
此外,根据规范,还允许Location
对象的以下属性。
方法:
-
location.replace
属性:
-
URLUtils.href
(只写)
总结:
正如您在上面看到的,window.location
可以跨域进行读/写访问。在同源策略下,允许一个帧重新分配另一个帧的location
属性。使用 sandbox
属性是在现代浏览器中阻止此类跨源框架访问的正确方法。
您可能还有兴趣阅读OWASP点击劫持防御备忘单页面,其中包含有关这种防止网站被框定的技术的信息,以及一些可以在旧版浏览器中使用的不太受影响的对策。