我一直在阅读有关<iframe>
标记的HTML5添加内容。其中一个补充是包含沙盒标志,允许加载到iframe
的文档与其父浏览器上下文进行交互。
阅读完一些文档后,我正在寻找一些清晰度。我已阅读allow-same-origin
标志的MDN's说明:
允许将内容视为来自其正常来源。如果 不使用此关键字,嵌入的内容被视为存在 来自独特的起源。
在阅读W3C's规范之后,我认为并不是很有帮助,有帮助:
... [我可以用来嵌入来自第三方网站的内容, 沙箱以防止该网站打开弹出窗口等, 不阻止嵌入式页面与其进行通信 发起站点,使用数据库API存储数据等。
我的问题是关于MDN所指的&#34;正常起源&#34;根据W3C的规范:当参考&#34;正常来源&#34;是MDN声明<iframe>
标记中包含的文档内容被视为共享文档所源自的页面的来源,例如, YouTube视频相信 - 并且可以如此沟通 - 它仍然是YouTube的一部分?或者,<iframe>
文档是否可以访问父浏览器上下文?
答案 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
,则这些请求将被视为跨域请求,因此这些请求可能会被浏览器阻止-除非资源具有允许跨源请求的标头。