在 <iframe /> 上设置 sandbox="allow-scripts allow-popups allow-same-origin" 安全吗?

Is it safe to have sandbox="allow-scripts allow-popups allow-same-origin" on <iframe />?

我正在我的应用程序中动态创建一个 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>

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

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

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

但是iframe要访问parent的数据,也是需要执行脚本的,所以allow-same-origin没有allow-scripts是无害的

至于 allow-popups,iframe 可以做的不安全的事情不多,除了它可以打开其他 url

正如 Namey 评论的那样,allow-same-origin 不允许将 iframe 视为与父级同源并且可以安全使用(除非父级和 iframe 具有相同的源,请参见: warning on MDN).

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

The framed document is loaded into a unique origin, which means that all same-origin checks will fail; unique origins match no other origins ever, not even themselves. Among other impacts, this means that the document has no access to data stored in any origin’s cookies or any other storage mechanisms (DOM storage, Indexed DB, etc.).

您在 IFrame 上设置了以下 Blob URL/Object-URL。

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

我假设 IFrame 的内容是从 user/uncontrolled 输入生成的,并且可能包含 HTML and/or 脚本。

首先,让我们逐一了解这些内容。

允许脚本

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

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

  • 发出 AJAX 请求,例如fetch,尽管 IFrame 无法读取任何响应。例如向恶意用户的 Web 应用程序发送跨站点请求伪造 (CSRF) 攻击或“phone home”。请注意,与流行的看法相反,AJAX can be sent to any origin (Cross-origin writes are typically allowed),同源策略只阻止读取响应,而不是写入。此外,它只能发送与外部托管网页相同的 CSRF 攻击——如果没有 allow-same-origin.
  • ,它将无法从父级读取令牌的值
  • 使用 document.location 自动引导用户离开页面 - 请注意这是在 IFrame 内,而不是在 IFrame 之外。
  • 托管一个表单(例如询问用户名和密码),以获取用户的凭据,如果攻击者模仿您的外部样式,则尤其有效。请注意,这不需要 allow-forms,因为攻击者可以简单地使用 JavaScript 将数据 POST 发送到他们自己的站点。

允许弹出窗口

允许从链接或 JavaScript 打开新的 windows/tabs。后者还需要设置 allow-scripts

允许同源

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

对于 Blob URLs/Object-URLs,这会影响将 IFrame 设置为具有 the same origin as its parent,因此您可以在您创建的 IFrame 中读取和操作对象。

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


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