我正在尝试创建一个可扩展的平台,我的站点将在其中提供模型和一些视图(客户端,在浏览器中),第三方站点也可以添加自己的视图。这里的目标是只有我的模型会向我的服务器发出 HTTP 请求,第三方视图只能对我的平台进行 API 调用,仅此而已(如果他们愿意,他们也可以“打电话回家”,但他们不能碰任何未通过 API 明确向他们公开的内容)。
建议的解决方案是为每个第三方扩展创建一个不可见的 iframe,仅使用postMessage与它们进行通信(编辑:要成为正确的“视图”,它当然必须是可见的,但作为替代方案,它只能具有以下作用“控制器”,将可视组件的呈现委托给主页 - 如果它增加了任何安全优势,则可以使用,但理想情况下没有)。这会正确地“沙箱”代码吗?我假设:
- 由于同源策略,他们将无法访问主页的 DOM,或对其进行任意 JavaScript 调用,或在我的域上发出 Ajax 请求;
- 他们可能会在我的服务器上发出 GET 请求(包括从中加载脚本),但只要我在重要的地方使用 CSRF 令牌就可以了。这种情况与在同一个浏览器中有两个打开的选项卡没有什么不同,其中一个通过其各自的站点进行了身份验证;
- 他们将无法点击劫持用户,
因为如果他们的 iframe 不可见;我还假设他们不能使它们可见或调整它们的大小,因为这将涉及访问父页面的 DOM,这是正确的吗? - 他们可以发送垃圾邮件
Window.alert
(或更糟:)Window.prompt
,console.log
或访问其他“全球”内容。这是迄今为止我发现的更严重的问题,但仍然无法想出防止这种情况的方法。- 澄清:这里的问题是尝试冒充父站点的可能性,例如显示一条要求输入密码的消息。
- 另外,如果我弄错了,请纠正我 - 我假设 iframe 中的 JavaScript 可以平等地访问这些资源,并且父页面无法否认这一点。
- 他们可以嵌入闪存或其他可能存在安全漏洞的插件。然而,它在 iframe 中的事实在任何方面都不会使它变得更糟,还是我弄错了?
这些假设是否正确,还有什么我应该注意的吗?用户需要一定程度的信任(这个想法是每个用户都应该能够在自己的空闲时间选择扩展,无论我的网站是否认可它们,同时最终承担他选择的后果),但是我想尽一切可能减轻这些风险。
更新:我想根据评论者提出的问题稍微澄清一下这个问题。在页面中包含第三方脚本有很多原因 - 广告、分析、与社交网络的交互等。不过,这是一个安全问题,实际上这是人们使用 AdBlock 或 NoScript 的原因之一(因此您可以选择性地选择允许哪些域在您的浏览器中运行代码)。通常,该站点信任包含其脚本的第三方,但并非总是如此(例如,Facebook 应用程序可以由任何人创建 - 但它们在 Facebook 页面内运行),而且我已经看到 iframe 被用于“隔离”第三方——聚会内容。
尽管在浏览器中进行跨站点通信的一种选择是使用 postMessage 来打开两个打开的选项卡(或窗口)来交换消息,但单个页面提供了更无缝的体验。使用 iframe(可见或不可见)的全部含义,以及它在沙盒中对不受信任的内容的可行性,是我在这个问题中的主要关注点,恕我直言也适用于更广泛的受众(见上文段落)。
在我的特殊情况下,我试图避免让嵌入的内容冒充父站点(请参阅上面第 4 个要点中的说明),并尽可能保护用户免受其他滋扰。虽然每个用户都可以选择自己的扩展程序,并最终对后果负责,但我想减轻任何在我能力范围内的已知问题(并尝试对用户进行教育以解决那些无法解决的问题)。