Chrome 扩展内容脚本之间的 postMessage 安全性如何?可能的替代方案?

Ale*_*exZ 1 javascript security postmessage google-chrome-extension content-script

根据MDN 上的这篇文章,使用 postMessage 在 chrome 中与内容脚本之间传递消息并不安全,因为无法正确定义源属性,并且其 targetOrigin 很难安全地传递到潜在的恶意站点。这仍然是真的吗?是否有其他方法可以确认收到消息的来源,并仅将消息发送到特定的内容脚本?或者除了完全使用内容脚本之外还有其他选择吗?

Rob*_*b W 5

MDN 文章中的“chrome”并不是指“Google Chrome”,而是指以 Chrome 权限运行的扩展代码(看这里了解“chrome”在 Firefox 中的其他含义)。

在 Google Chrome / Chromium 中,内容脚本在与网页不同的环境中运行(这意味着内容脚本中的脚本与网页中的window脚本不同)。 但是,当您从内容脚本向页面发送消息时,将与页面的消息相同。因此,要验证消息是否确实是从同一页面内的(内容)脚本发送的,您可以使用window
event.sourcewindowif (event.source === window) { ... }.

如果您想将消息发送到另一个内容脚本(在同一选项卡中),那么您有两个选择:

  1. 如果框架位于不同的来源,或者内容脚本位于不同的选项卡中,那么您必须向后台页面发送消息,后台页面又使用 Chrome扩展消息传递将消息传递到目标内容脚本API将消息传递到目标内容脚本。
  2. 如果通信帧位于同一个源,那么它们的变量可以直接共享,而无需使用消息传递API。window使用topparent<HTMLIFrameElement>.contentWindowframes[index]等引用其对象。

将消息从一个内容脚本发送到另一个内容脚本的另一种(黑客)方法是通过 API chrome.storage。在接收端,绑定一个chrome.storage.onChanged事件。要“发送”消息,请使用chrome.storage.local.set。一旦您收到(未收到)消息,请不要忘记删除键值对。