根据this article on MDN ,使用 postMessage 在 chrome 中与内容脚本之间传递消息并不安全,因为无法正确定义源属性,并且其 targetOrigin 很难安全地传递到潜在的恶意站点。这仍然是真的吗?是否有其他方法可以确认收到消息的来源,并仅将消息发送到特定的内容脚本?或者除了完全使用内容脚本之外还有其他选择吗?
最佳答案
MDN 文章中的“chrome”并不是指“Google Chrome”,而是指以 Chrome 权限运行的扩展代码(look here 表示“chrome”在 Firefox 中的其他含义)。
在 Google Chrome/Chromium 中,内容脚本在 different environment 而非网页中运行(这意味着内容脚本中的 window
与网页中的 window
不同)。
但是,当您从内容脚本向页面发送消息时,event.source
将与页面的 window
相同。因此,要验证消息是否确实是从同一页面内的(内容)脚本发送的,您可以使用 if (event.source === window) { ... }
。
如果您想将消息发送到另一个内容脚本(在同一选项卡中),那么您有两个选择:
- 如果框架位于不同的来源,或者内容脚本位于不同的选项卡中,则您必须向后台页面发送消息,后台页面又使用 Chrome extension message passing API 将消息传递到目标内容脚本.
- 如果通信帧位于同一源,则它们的变量可以直接共享,而无需使用消息传递 API。使用
window
、top
、parent
、<HTMLIFrameElement>.contentWindow
等引用它们的frames[index]
对象。
从一个内容脚本向另一个内容脚本获取消息的另一种(黑客)方法是通过 chrome.storage
API。在接收端,绑定(bind) chrome.storage.onChanged
事件。要“发送”消息,请使用 chrome.storage.local.set
。一旦您收到(未)收到消息,请不要忘记删除键值对。
关于javascript - Chrome 扩展内容脚本之间的 postMessage 安全性如何?可能的替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21368187/