1

我正在开发一个 iframeable 组件,现在偶然发现了一些看起来像安全问题的东西。

我有两个网站:

  • 站点 A,运行在 http://localhost:3002
  • 站点 B,运行在 http://localhost:3000

站点 A 将站点 B 嵌入到 IFrame 中。站点 B 需要使用数据,这应该由站点 A 提供。但是,现在站点 B 仅通过 URL 接受数据,并且由于原始 URL 可能需要身份验证,因此站点 A 获取数据,并将其转换为对象 URL (与URL.createObjectURL),然后通过 提供给站点postMessageB。站点 B 现在应该从该 URL 获取数据并使用它。

但是,站点 B 获取对象 URL 被浏览器阻止:

  • 铬合金:Not allowed to load local resource: blob:http://localhost:3002/<UUID>
  • 火狐:Security Error: Content at http://localhost:3000/... may not load data from blob:http://localhost:3002/<UUID>

据我所知,这些消息未连接到 CSP 或 CORS。但是,我无法理解问题是什么以及它是否可以修复——我一直认为对象 URL 目前没有任何跨站点问题,这正是使用它的原因。

那么为什么会发生这种情况,我能做些什么呢?

4

1 回答 1

2

请参阅https://github.com/w3c/FileAPI/issues/135和其中的参考资料。在实践中存在相同的原产地限制,但这尚未反映在规范中。我们不太可能取消该限制,因为blob:URL 很容易造成内存泄漏。(实际上,我们想对它们施加更多限制:https ://github.com/w3c/FileAPI/issues/153 。)

如果您有一个postMessage()API,您将需要扩展它,您可以通过消息发送 URL 或对象。Blob向实例本身发送消息应该可以工作。

于 2021-07-28T10:56:45.370 回答