如何从(ny)网页到Chrome扩展程序进行安全通信

时间:2015-01-19 12:21:42

标签: javascript security google-chrome google-chrome-extension postmessage

我希望在网页与Chrome扩展程序之间进行安全通信。经过相当多的检查和黑客攻击后,这似乎至少是不平凡的,如果不是完全不可能的话。

我想在网页中(某些JavaScript)向扩展程序的后台页面(当它正在运行时)发送消息(请注意,网页启动了通信,这非常不典型!)。我发送扩展一些凭据(因此需要一个安全的通道!)然后如果这些凭据有效(由后台页面中的逻辑确定),那么后台页面应返回一些(JSON)值,网页可以然后显示。

我已经有一些代码可以检查当前浏览器是否为Chrome以及用户是否安装了所述扩展程序(如果不是,则为他/她安装一些用户界面等等)

我还使用window.postMessage运行了一些通信。它从网页脚本向扩展内容脚本发布消息,然后从那里传播到后台页面。但是,this MDN page引用不安全:

  

..建议现在使用postMessage chrome:页面进行通信;使用不同的方法(例如打开窗口时的查询字符串)与Chrome窗口进行通信。

(此评论位于页面底部附近的Using window.postMessage in extensions部分)

这似乎是健全的建议,因为似乎没有办法排除使用postMessage发送的数据可能被浏览器中的另一个窗口/标签拦截而不是到达扩展名的可能性。所以这个漏洞可以被利用。

在我的情况下使用查询字符串作为MDN文章建议是不可能的,因为后台页面在开始时加载(尚未存在URL参数)。

我的推理是否清晰?是否有任何Chrome扩展专家有建议?

注意:建议使用externally_connectable docs但是docs matches部分中指定的用于指定网站的网站只允许使用子域通配符,而问题域需要允许动态列表网站,无法在扩展程序的清单中进行硬编码。

1 个答案:

答案 0 :(得分:4)

您需要使用"externally_connectable"通讯方式。

如果您的扩展程序声明它想要与某个域(您需要在清单中列出)进行通信,那么chrome.runtime.sendMessage将会暴露给页面上下文。

然后,在您的页面上,您可以通过以下方式传递信息:

var extensionID = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";

if(chrome && chrome.runtime && chrome.runtime.sendMessage) {
  // There is an extension that declared this page in externally_connectable
  chrome.runtime.sendMessage(extensionID, data);
} else {
  // Either this is not Chrome, or no extension wants to listen
}

在扩展程序方面,您将获得chrome.runtime.onMessageExternal event

中的数据

如果您愿意,您可以与chrome.runtime.connect建立双向长期连接。

Chrome会确保只有具有给定ID的扩展程序才会收到您的消息。这将保护您免受其他网页的窃听,但请注意,任何扩展都可以有足够的力量来附加/修改您的网页脚本并获取该数据。


由于问题已更新为“没有固定的网站列表”要求,因此有另一种解决方案。内容脚本可以使用DOM事件与页面脚本进行通信。它们不会泄漏到其他页面,但同样,它不能防止其他扩展。

有关详情,请参阅this answer;我将在此处留下一段代码片段作为示例。

// Content script
//Listen for the event
window.addEventListener("PassToBackground", function(evt) {
  chrome.runtime.sendMessage(evt.detail);
}, false);

// Page context
var message = {/* whatever */};
var event = new CustomEvent("PassToBackground", {detail: message});
window.dispatchEvent(event);