iframe 的奇怪跨域问题

Strange cross-domain issue with iframe

本文关键字:问题 iframe      更新时间:2023-09-26

我在不同的域中使用下面的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&ETHNICITY=1&STANDARD_HHI_US=3" />
</body>
</html>

虽然同源策略确实会阻止从跨域框架访问Window属性,但 location 属性是一个特殊的例外。

来自 MDN 文章的跨源脚本 API 访问部分,了解同源策略。

JavaScript API,如iframe.contentWindowwindow.parentwindow.openwindow.opener允许文档直接相互引用。当两个文档的源不同时,这些引用提供对WindowLocation对象的非常有限的访问,如下两节所述。

跨源窗口:

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点击劫持防御备忘单页面,其中包含有关这种防止网站被框定的技术的信息,以及一些可以在旧版浏览器中使用的不太受影响的对策。