postMessage目标源-window.parent.origin与“*”

3

window.parent.postMessage(message, window.parent.origin)window.parent.postMessage(message, '*')更安全吗?

我们有一个被父级框架加载的iframe组件。该框架可以来自任何地方(我们的Web应用程序是共享组件,可以从我们主产品的任何客户端安装中访问)。因此,除非我们保留某种允许来源的数据库,否则我们无法事先知道谁加载了我们。

我们正在向父级框架发送postMessage(),并且我们无法事先知道目标来源,因此我使用了'*'。我的一位同事建议我改用window.parent.origin,但据我所知,这具有相同的效果-postMessage将检查目标来源是否与自身相同!更不用说跨域时会失败。

那么我错过了什么吗?使用window.parent.origin是否比通配符提供更高的安全性?


如果您没有提供特定的来源,我可能会将您的组件嵌入到 我的 页面中,然后我的页面将成为通过 postMessage 发送的任何内容的接收者 - 是否可能泄漏敏感数据,这取决于您的判断。(当然,仅仅从父级获取来源也无法解决这个问题。) - CBroe
说实话,window.parent.origin选项确实会限制您自己的域,因此是更安全的选择,但可能不是您想要的。您不能设置一些API密钥系统,以便使用您组件的页面可以发布吗? - Kaiido
2个回答

5
通配符"*"可能是危险的,如果父页面被重定向到一个恶意网站,该网站可能会接收到包含敏感数据的消息。
在这种情况下,parent.origin不能提供任何安全保障。理想情况下,应该使用组件服务器来检测和验证父窗口的来源。

1
parent.origin 会更安全吗?这才是这里所问的问题。 - Kaiido
在这种情况下,parent.origin 不会提供任何安全保障。理想情况下,应该使用组件的服务器来检测和验证父窗口的来源。 - Taras Romaniv

1

使用window.parent.postMessage(message, window.parent.origin)window.parent.postMessage(message, '*')更安全吗?

这取决于您所面临的危险以及您认为应用程序的安全使用情况。

假设您的 iframe 托管在域 A 上,并从域 B 调用。如果在此情况下,从您的 iframe 发送消息到父级被认为是危险的,则window.parent.postMessage(message, window.parent.origin)window.parent.postMessage(message, '*')更加安全。

window.parent.origin用作targetOrigin不会向托管在与 iframe 域不同的域上的父级提供任何数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接