在<iframe />上使用sandbox =“ allow-scripts allow-popups allow-same-origin”是否安全?

Kos*_*ika 3 html javascript security iframe same-origin-policy

我在应用程序中动态创建一个iframe,结果如下所示:

<iframe src="blob:http%3A//localhost%3A9292/0194dfed-6255-4029-a767-c60156f3d359" 
        scrolling="no" sandbox="allow-scripts allow-popups allow-same-origin" 
        name="sandbox" style="width: 100%; height: 100%; border: 0px;"></iframe>
Run Code Online (Sandbox Code Playgroud)

具有这样的沙盒配置是否安全(特别是允许将iframe内容视为来自同一来源)?

Sil*_*Fox 11

您在 IFrame 上设置了以下带有 Blob URL/Object-URL 的内容。

  • allow-scripts
  • allow-popups
  • allow-same-origin

我假设 IFrame 的内容是从用户/不受控制的输入生成的,并且可能包含 HTML 和/或脚本。

首先,让我们一一回顾一下。

允许脚本

这允许 IFrame 内的 JavaScript 代码运行。这可能很危险,具体取决于设置的其他值。

只有allow-scripts这样,任何脚本都可以

  • 使用eg 发出AJAX 请求fetch,尽管IFrame 无法读取任何响应。例如,向恶意用户的 Web 应用程序发送跨站点请求伪造 (CSRF) 攻击或“打电话回家”。请注意,与普遍看法相反,AJAX 可以发送到任何来源( Cross-origin writes are typically allowed),同源策略仅阻止读取响应,而不阻止写入。此外,它只能发送与外部托管网页相同的 CSRF 攻击 - 如果没有allow-same-origin.
  • 自动引导用户离开页面document.location- 请注意,这是在 IFrame 内,而不是在 IFrame 之外。
  • 托管一个表单(例如要求用户名和密码)来捕获用户的凭据,如果攻击者模仿您的外部风格,则特别有效。请注意,这并不需要allow-forms,因为攻击者可以简单地使用 JavaScript 将数据 POST 到他们自己的站点。

允许弹出窗口

允许从链接或 JavaScript 打开新窗口/选项卡。后者也需要allow-scripts设置。

允许同源

如果文档的来源兼容,则允许使用相同的来源。请注意,这不会覆盖任何默认来源 - 也就是说,攻击者无法在 IFrame 中托管 Twitter.com 并使用它来访问页面内受害者的 cookie 或 CSRF 令牌,也不能简单地加载 Twitter.com并假装内容是从与父级相同的来源生成的。

对于 Blob URL/Object-URL,这会影响将 IFrame 设置为与其父级具有相同的起源,从而使您可以读取和操作您创建的 IFrame 中的对象。

如果没有allow-scripts设置,这一切本身就是允许您的外部 IFrame 操作和读取对象,但是,这样allow-scripts可以允许 IFrame 操作和读取父级(即您的页面)中的对象,这是不安全的。


因此,由于allow-scripts和,此设置会在您的应用程序中引入跨站点脚本 (XSS) 缺陷allow-same-origin。最好考虑不需要的替代解决方案来解决这个问题allow-same-origin。我不确定您到底希望通过问题中的这个值实现什么目标,但在大多数情况下可以找到替代方案。


小智 7

正如Namey所评论的那样,allow-same-origin不允许将iframe与父对象视为同一来源,并且可以安全使用(除非父对象和iframe具有相同的来源,请参见:MDN警告)。

https://www.html5rocks.com/zh-CN/tutorials/security/sandboxed-iframes/#granular-control-over-capabilities中所述

带框架的文档被加载到唯一的原点中,这意味着所有相同来源的检查都将失败。独特的起源从未与其他起源相匹配,甚至连他们自己也没有。除其他影响外,这意味着文档无权访问存储在任何原始Cookie或任何其他存储机制(DOM存储,索引DB等)中的数据。

  • 我明白你在说什么,但不要忘记 blob URL(如在 OP 的情况下使用的)将具有[与其父级相同的起源](https://w3c.github.io/FileAPI/#originOfBlobURL )。因此,将其与“allow-scripts”一起使用是[不安全](/sf/answers/4370210911/)。 (2认同)

Boi*_*dru 3

allow-same-origin不安全。这将使 iframe 能够访问父数据(例如本地存储)

allow-same-origin允许 iframe 向父级的 api 发出 ajax 请求,这也可能是有害的。

然而,对于 iframe 访问父级的数据,它还需要执行脚本,所以allow-same-origin没有allow-scripts是无害的

至于allow-popupsiframe,除了它可以打开其他url之外,没有什么不安全的事情可以做

  • 我认为这可能误解了allow-same-origin 的作用?它不会将 iframe 视为与父页面来自同一来源。它将 iframe 视为来自**与其本身**相同的域(而不是像它是唯一托管的页面,不连接到域上的任何其他内容)。我听说过(但没有看到证明)的唯一风险是 iframe 可能会改变自身以删除自己的沙箱。 (18认同)