沙盒,IFrame和允许同源

时间:2015-07-02 12:19:10

标签: html html5 iframe

我一直在阅读有关<iframe>标记的HTML5添加内容。其中一个补充是包含沙盒标志,允许加载到iframe的文档与其父浏览器上下文进行交互。

阅读完一些文档后,我正在寻找一些清晰度。我已阅读allow-same-origin标志的MDN's说明:

  

允许将内容视为来自其正常来源。如果   不使用此关键字,嵌入的内容被视为存在   来自独特的起源。

在阅读W3C's规范之后,我认为并不是很有帮助,有帮助:

  

... [我可以用来嵌入来自第三方网站的内容,   沙箱以防止该网站打开弹出窗口等,   不阻止嵌入式页面与其进行通信   发起站点,使用数据库API存储数据等。

我的问题是关于MDN所指的&#34;正常起源&#34;根据W3C的规范:当参考&#34;正常来源&#34;是MDN声明<iframe>标记中包含的文档内容被视为共享文档所源自的页面的来源,例如, YouTube视频相信 - 并且可以如此沟通 - 它仍然是YouTube的一部分?或者,<iframe>文档是否可以访问父浏览器上下文?

2 个答案:

答案 0 :(得分:10)

您无法在iFrame和“父窗口”(来自不同的域)之间访问文档。要在帧之间进行通信,您需要使用postMessage

使用allow-same-origin可以使用例如iFrame中的cookie。

这是了解更好的iFrames沙箱的好方法:http://www.html5rocks.com/en/tutorials/security/sandboxed-iframes/

答案 1 :(得分:4)

阅读LFC的答案后,我仍然有些困惑,但是他们提供的链接给出了很好的解释。这是一个摘要:

假设我们要向我们的网站添加一个推特按钮。我们可以这样做:

<iframe src="https://platform.twitter.com/widgets/tweet_button.html"></iframe>

但是我们可能会给Twitter提供超出其所需权限的权限。因此,我们想对它们进行沙箱处理。 Twitter显然需要知道用户是否已登录(例如,也许这样他们可以在tweet按钮旁边显示您的头像),因此iframe必须能够访问twitter.com cookie和与{ {1}}(本地存储等)。因此,通过设置twitter.com,我们授予iframe使用allow-same-origin中数据的权限。

Twitter可能还需要向twitter.com资源发出请求,如果您未设置twitter.com,则这些请求将被视为跨域请求,因此这些请求可能会被浏览器阻止-除非资源具有允许跨源请求的标头。