【问题标题】:Is it safe to have sandbox="allow-scripts allow-popups allow-same-origin" on <iframe />?在 <iframe /> 上设置 sandbox="allow-scripts allow-popups allow-same-origin" 是否安全?
【发布时间】:2016-05-14 11:40:29
【问题描述】:

我正在我的应用程序中动态创建一个 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 内容被视为来自同一来源)?

【问题讨论】:

    标签: javascript html security iframe same-origin-policy


    【解决方案1】:

    正如 Namey 所评论的,allow-same-origin 不允许 iframe 被视为与父级相同的来源并且可以安全使用(除非父级和 iframe 共享相同的来源,参见:warning on MDN) .

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

    框架文档被加载到一个唯一的来源,这意味着所有的同源检查都将失败;独特的起源与其他起源不匹配,甚至它们自己也不匹配。除其他影响外,这意味着文档无法访问存储在任何来源的 cookie 或任何其他存储机制(DOM 存储、索引数据库等)中的数据。

    【讨论】:

    • 我明白你在说什么,但不要忘记 blob URL(在 OP 的情况下使用)将具有 same origin as its parent。因此将其与allow-scripts 一起使用是unsafe
    • 编辑:啊,我刚刚正确阅读了您的答案,抱歉:“除非父级和 iframe 共享相同的来源...”我希望我能收回我的投反对票,但由于奇怪的 SO 规则需要修改,抱歉。
    【解决方案2】:

    您在 IFrame 上使用 Blob URL/Object-URL 设置了以下内容。

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

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

    首先,让我们逐一介绍这些内容。

    允许脚本

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

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

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

    允许弹出窗口

    允许从链接或 JavaScript 打开新窗口/选项卡。后者还需要设置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 的该问题的替代解决方案。我不确定您希望从您的问题中使用此值实现什么,但在大多数情况下可以找到替代方案。

    【讨论】:

    • TL;DR: allow-same-originblob: URL 中对于不受信任的内容不安全,因为blob: URL 继承了父文档来源。如果您将不受信任的内容放在另一个顶级域上,然后用iframe 元素框起来,您可以安全地使用allow-same-origin
    【解决方案3】:

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

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

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

    至于allow-popups,iframe 并没有太多不安全的事情,除了它可以打开其他 url 之外

    【讨论】:

    • 但我需要有可能在 iframe 中执行脚本。
    • 我认为这可能是误解了 allow-same-origin 的作用?它不会将 iframe 视为来自与父页面相同的来源。它将 iframe 视为来自同一域与其自身(而不是作为一个唯一托管的页面,未连接到您域中的任何其他内容)。我听说的唯一风险(但没有看到证明)是 iframe 可能会改变自己以删除自己的沙盒。
    • 一个例外是,如果您的沙盒 iframe 不是跨域的(例如,与其父级相同的来源),在这种情况下,它将获得对 localStorage 等内容的访问权限?
    • @Namey window.parent 怎么样?这使您可以在allow-same-origin 开启时访问相当多的内容,尽管风险取决于情况(对于像我的同域插件系统这样的系统,风险是非常 i> 高达window.parent 可以完全控制父页面)
    • @Namey 您必须考虑一种特殊情况:blob: URL 是特殊的,并且继承父文档作为它们的来源:w3c.github.io/FileAPI/#originOfBlobURL - 因此,将不受信任的内容放入 blob: URL在 &lt;iframe&gt;allow-same-origin 中是不安全的,因为这将获得与该 iframe 元素的父级中的相同内容相同的访问权限。
    猜你喜欢
    • 1970-01-01
    • 2014-01-28
    • 2019-12-17
    • 2014-10-15
    • 2013-02-05
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多