Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何实现从(纽约)网页到Chrome扩展的安全通信_Javascript_Security_Google Chrome_Google Chrome Extension_Postmessage - Fatal编程技术网

Javascript 如何实现从(纽约)网页到Chrome扩展的安全通信

Javascript 如何实现从(纽约)网页到Chrome扩展的安全通信,javascript,security,google-chrome,google-chrome-extension,postmessage,Javascript,Security,Google Chrome,Google Chrome Extension,Postmessage,我想在网页和Chrome扩展之间进行安全通信。经过相当多的检查和黑客攻击,这似乎至少是不平凡的,如果不是完全不可能的话 我想在扩展从网页中的某个JavaScript运行时向其后台页面发送消息。请注意,该网页会启动通信,这是非常不典型的!。我向分机发送了一些凭据,因此需要一个安全通道!然后,如果这些凭证是由后台页面中的逻辑确定的有效凭证,那么后台页面应该返回一些JSON值,然后web页面可以显示这些值 我已经有了一些代码,可以检查当前浏览器是否是Chrome,用户是否安装了所述扩展,如果不是,还可

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

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

我已经有了一些代码,可以检查当前浏览器是否是Chrome,用户是否安装了所述扩展,如果不是,还可以安装一些UI,等等

我还使用window.postMessage运行了一些通信。它将一条消息从网页脚本发布到扩展内容脚本,然后从那里传播到后台页面。但是,作为报价,这是不安全的:

。。建议暂时不要使用postMessage与chrome:pages进行通信;当窗口打开时,使用不同的方法(如查询字符串)与Chrome窗口通信

此注释位于页面底部附近扩展名中使用window.postMessage的部分

这似乎是一个合理的建议,因为似乎没有办法排除使用postMessage发送的数据可能被浏览器中的另一个窗口/选项卡截获,而不是进入扩展。因此,可以利用此漏洞

在我的情况下,使用MDN文章所建议的查询字符串是不可能的,因为背景页是在开始时加载的,并且还没有URL参数

我的推理正确/清楚吗?有没有Chrome扩展专家有什么建议

注意:建议使用外部可连接的文档,但如“指定网站的匹配”部分中所述,仅允许子域通配符,问题域要求允许动态网站列表,不能在扩展的清单中硬编码。

您需要使用通信方法

如果您的扩展声明它希望与您需要在清单中列出的特定域通信,则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.connect建立双向长期连接

Chrome将确保只有具有给定ID的分机才能收到您的消息。这将保护您免受其他网页的窃听,但请注意,任何扩展都有足够的能力连接/修改页面脚本并获取数据

由于该问题已更新,没有固定的场地清单要求,因此有另一种解决方案。内容脚本可以使用DOM事件与页面脚本通信。它们不会泄漏到其他页面,但同样,这不能防止其他扩展

有关更多详细信息,请参阅;我将在这里留下一个代码片段作为示例

// 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);
你需要使用沟通的方法

如果您的扩展声明它希望与您需要在清单中列出的特定域通信,则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.connect建立双向长期连接

Chrome将确保只有具有给定ID的分机才能收到您的消息。这将保护您免受其他网页的窃听,但请注意,任何扩展都有足够的能力连接/修改页面脚本并获取数据

由于该问题已更新,没有固定的场地清单要求,因此有另一种解决方案。内容脚本可以使用DOM事件与页面脚本通信。它们不会泄漏到其他页面,但同样,这不能防止其他扩展

有关更多详细信息,请参阅;我将在这里留下一个代码片段作为示例

// 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);

感谢您快速而详细的回复!我读了Chrome扩展文档中的“消息”部分,我想我还记得这样的事情。但遗憾的是,没有一个固定的网站列表,我们希望能够与我们的扩展通信。这必须是可配置的,因为它会随着时间的推移不断增加。所以我们不能在清单中静态列出它们。也许我应该在我的问题陈述中提到这一点,但是现在你的答案对于其他没有这个限制的人来说当然是有价值的。我可能会爱上你
请在POC阶段完成此操作。感谢您快速而详细的回复!我读了Chrome扩展文档中的“消息”部分,我想我还记得这样的事情。但遗憾的是,没有一个固定的网站列表,我们希望能够与我们的扩展通信。这必须是可配置的,因为它会随着时间的推移不断增加。所以我们不能在清单中静态列出它们。也许我应该在我的问题陈述中提到这一点,但是现在你的答案对于其他没有这个限制的人来说当然是有价值的。我可能会在POC阶段使用这个。