Javascript 使用沙盒是否安全;允许脚本允许弹出窗口允许相同来源“;on<;iframe/>;?

Javascript 使用沙盒是否安全;允许脚本允许弹出窗口允许相同来源“;on<;iframe/>;?,javascript,html,security,iframe,same-origin-policy,Javascript,Html,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%; b

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

允许同一来源不安全。这将使iframe能够访问父数据(例如本地存储)

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

但是,对于要访问父级数据的iframe,它还需要执行脚本,因此不使用
允许脚本的
允许相同来源
是无害的


至于
允许弹出窗口
,iframe可以做的不安全的事情并不多,除了它可以打开其他URL这一事实,正如Namey所评论的那样,
允许同一来源
将不允许iframe被视为与父对象来自同一来源,并且可以安全使用(除非父级和iframe共享同一原点,cf:)

如下所述:

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


您在IFrame上设置了以下带有Blob URL/对象URL的集合

  • 允许脚本
  • 允许弹出窗口
  • 允许相同来源
我假设IFrame的内容是由用户/非受控输入生成的,可以包含HTML和/或脚本

首先,让我们一个接一个地看一下

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

使用
仅允许脚本
,任何脚本都可以

  • 使用例如
    fetch
    发出AJAX请求,尽管IFrame无法读取任何响应。例如,发送跨站点请求伪造(CSRF)攻击,或向恶意用户的web应用程序“打电话回家”。请注意,与流行的观点相反,(
    通常允许跨源写入
    ),同源策略仅阻止读取响应,而不是写入。此外,它将只能发送与外部托管网页相同的CSRF攻击-如果不允许同源,它将无法从父级读取令牌值
  • 使用
    文档自动导航用户离开页面。位置
    -注意这是在IFrame内,而不是在IFrame外
  • 托管一个表单(例如,询问用户名和密码),以从用户处捕获凭据,如果攻击者模仿您的外部风格,尤其有效。请注意,这不需要
    允许表单
    ,因为攻击者可以简单地使用JavaScript将数据发布到自己的站点
允许弹出窗口 允许从链接或JavaScript打开新窗口/选项卡。后者还需要设置
allow scripts

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

对于Blob URL/对象URL,这具有将IFrame设置为have的效果,因此允许您在创建的IFrame中读取和操作对象

如果未设置
allow scripts
,则仅允许外部IFrame操作和读取对象,但是,如果使用
allow scripts
,则可以允许IFrame操作和读取父对象(即您的页面)中的对象,这是不安全的



因此,此设置引入了跨站点脚本(XSS)由于代码< >允许脚本> <代码> >代码>允许同一原产地< /代码>。最好是考虑替代的解决方案来解决这个问题,不需要<代码>允许相同的原产地< /代码>。我不确定您希望用这个值来实现您的问题,但是在大多数情况下,可以找到一个替代方案。p> 但我需要有可能在iframe中执行脚本。我知道,这会使它变得不安全:)。但是,为什么需要在iFrame上允许相同的原点?我发现你们需要的一些小案例,我认为这可能是误解了“允许同源”的作用?它不会将iframe视为来自与父页面相同的原点。它将iframe视为来自与其自身相同的域(而不是将其视为唯一托管的页面,不连接到域上的任何其他内容)。我听说(但没有看到演示)的唯一风险是,iframe可能会改变自身以删除自己的沙盒。一个例外是,如果您的沙盒iframe不是跨域的(例如,与其父级相同),在这种情况下,它将获得对本地存储等的访问权。@Namey
window.parent
?当启用“允许相同来源”时,您可以访问相当多的内容,尽管风险取决于具体情况(使用类似于我的同一域插件系统的系统,风险非常高,因为
窗口。父级
完全控制父级页面)。我明白您的意思,但不要忘记blob URL(在OP的案例中使用)我会有这个。因此,将此与
允许脚本一起使用是。编辑:啊,我刚刚正确地阅读了您的答案,对不起:“除非父级和iframe共享同一原点…”