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

答案 0 :(得分:4)
如Namey所言,allow-same-origin
不允许将iframe与父对象视为同一来源,并且可以安全使用(除非父对象和iframe具有相同的来源,请参见:{{ 3}})。
如warning on MDN所述:
带框架的文档被加载到唯一的原点中,这意味着所有相同来源的检查都将失败;独特的起源从未与其他起源相匹配,甚至连他们自己也没有。除其他影响外,这意味着文档无权访问存储在任何原始Cookie或任何其他存储机制(DOM存储,索引数据库等)中的数据。
答案 1 :(得分:1)
allow-same-origin
不安全。这将使iframe可以访问父数据(例如本地存储)
同样allow-same-origin
将允许iframe向父母的api发出ajax请求,这也可能是有害的。
但是,要使iframe访问父数据,还需要执行脚本,因此allow-same-origin
没有allow-scripts
是无害的
至于allow-popups
,iframe可以做的事情并不多,除非它可以打开其他网址
答案 2 :(得分:1)
您在IFrame上使用Blob URL / Object-URL进行了以下设置。
allow-scripts
allow-popups
allow-same-origin
我假设IFrame的内容是从用户/不受控制的输入生成的,并且可能包含HTML和/或脚本。
首先,让我们一步一步地进行这些操作。
这允许IFrame中的JavaScript代码运行。这可能很危险,具体取决于设置的其他值。
仅使用allow-scripts
,任何脚本都可以
fetch
,尽管IFrame无法读取任何响应。例如将跨站点请求伪造(CSRF)攻击或“电话回家”发送到恶意用户的Web应用程序。请注意,与流行的观点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 URL / Object-URL,这具有将IFrame设置为具有the same origin as its parent的效果,因此使您可以在创建的IFrame中读取和操作对象。
在没有设置allow-scripts
的情况下,所有这些操作本身就是允许您的外部IFrame操纵和读取对象,但是,如果使用allow-scripts
,这可以允许IFrame操纵和读取父对象,即您的页面不安全。
因此,由于allow-scripts
和allow-same-origin
,此设置在您的应用程序中引入了跨站点脚本(XSS)漏洞。最好考虑不需要allow-same-origin
的替代解决方案。我不确定您希望从这个问题中获得什么价值,但是在大多数情况下可以找到替代方法。