我希望在网页与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
部分中指定的用于指定网站的网站只允许使用子域通配符,而问题域需要允许动态列表网站,无法在扩展程序的清单中进行硬编码。
答案 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);