0

根据this article on MDN,使用postMessage将消息传入和传出chrome中的内容脚本是不安全的,因为无法正确定义源属性,并且targetOrigin难以安全地传递到潜在的恶意网站。这是否仍然如此。是否有其他方法来确认接收到的消息的来源,并且仅将消息发送给特定的内容脚本?或者有没有其他方法可以完全使用内容脚本?来自Chrome扩展内容脚本的postMessage的安全性?可能的选择?

回答

1

MDN文章中的“chrome”并不是指“Google Chrome”,而是指使用Chrome特权运行的扩展程序代码(look here用于Firefox中其他含义的“chrome”)。

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

如果你想发送消息到另一个内容脚本(在相同的标签),那么你有两个选择:

  1. 如果帧位于不同的起源,或者如果内容脚本位于在不同的选项卡中,则必须将消息发送到背景页面,后者依次使用Chrome extension message passing API将消息传递到目标内容脚本。
  2. 如果通信帧位于相同的原点,则它们的变量可以直接共享,而无需使用消息传递API。请参阅使用topparent<HTMLIFrameElement>.contentWindowframes[index]

另一个(的hackish)的方式来获得从一个内容脚本到另一个消息他们window对象是通过chrome.storage API。在接收端,绑定一个chrome.storage.onChanged事件。要“发送”消息,请使用chrome.storage.local.set。一旦有(未)收到消息,请不要忘记删除键值对。

相关问题