在注入脚本和 Google Chrome 扩展 code/content 脚本之间传递消息的最安全方式是什么?

What is the most secure way of passing messages between an injected script and Google Chrome extension code/content script?

定义: 请从一开始就注意,'injected script'、'extension code' 和 'content script' 我将使用对此 question 的第一个优秀答案中提供的定义。

假设: 如果我直接在我的注入脚本(在 web 区域)中处理机密信息,则不如我在 chrome 中处理机密信息安全:// 内容脚本和扩展代码区域。因此,我应该使用消息传递将机密信息从 web 区域发送到 chrome:// 区域以供处理。

问题:我正在构建一个GoogleChrome扩展,我需要运行对来自的敏感用户数据进行一些操作我注入的脚本。有问题的数据是机密的,我必须尽我所能确保在我对它进行操作之前,除了扩展程序的用户之外,任何人都看不到它。在可用于在注入脚本和扩展 code/content 脚本之间传递消息的 3 种技术(定义如下)中,哪种技术最适合此目的?

我对可用于在注入脚本和扩展 code/content 脚本之间传递数据的 3 种不同技术的理解:

  1. 对于注入脚本和扩展代码(例如后台页面)之间的消息传递,可以使用chrome.runtime API

  2. 对于注入脚本和内容脚本之间的消息传递,可以使用window.postMessage.

  3. 另一种在注入脚本和内容脚本之间传递消息的方法是通过document.dispatchEvent(CustomEvent).

我的理解是,方法 1. 不能用于注入脚本和内容脚本之间的消息传递,而方法 2. 和 3. 不能用于注入脚本和扩展代码之间的消息传递(除非消息由内容脚本转发到例如后台页面)。

虽然您的后台页面/内容脚本中的代码 运行 已完全隔离,但只要您将脚本注入页面上下文 - 您就进入了狂野的西部。任何扩展程序和页面本身都可以访问该上下文,并且可以影响代码的执行方式。

例如,某些扩展程序可以覆盖 chrome.runtime.sendMessage 以发送消息并记录它。这需要认真考虑 - 可能,您已经输了。

也就是说,方法 1 比 2/3 更难破解 - 如前所述,攻击者扩展需要直接更改页面上下文才能进行干扰,而在 DOM 事件的情况下,它可以从其内容脚本的安全性中收听它们 - 事件广播到所有内容脚本上下文。

假设地,您也可以为通道采用某种非对称加密技术——为注入的脚本提供加密密钥,并将解密密钥保存在特权区域中。如果那是唯一被拦截的东西,那可以保护通信,但在某些时候明文数据 存在 在全局上下文中 - 这可能足以让攻击者脚本提取(即,你有假设,在你注入的脚本之前执行)。