【问题标题】:Chrome extension safely communicate from executed script to background scriptChrome 扩展从执行的脚本安全地通信到后台脚本
【发布时间】:2023-03-10 13:35:01
【问题描述】:

我正在开发一个在当前标签页中打开 iframe 的 chrome 扩展程序。

我需要能够突出显示网页上的某些文本,并将其显示在 iframe 中。

但是,简单地使用 postmessage 是不安全的,因为恶意网站可能会利用这一点向 iframe 发送垃圾邮件。

所以,我认为,我可能是错的,我必须让我执行的脚本将突出显示的文本传输到后台脚本,然后可以将一些脚本注入我的 iframe 以显示文本。

如何在已执行脚本 (chrome.tabs.executeScript) 和后台脚本之间进行通信?

谢谢

【问题讨论】:

    标签: javascript google-chrome-extension


    【解决方案1】:

    假设 iframe 指向web_accessible_resources 中公开的文件,并且其 src 格式正确,例如chrome.runtime.getURL('iframe.html'),此 iframe.html 将在具有 chrome-extension:// URL 的文档中运行,该 URL 与您的后台脚本或 browser_action 脚本具有相同的权限。

    也就是说,这个 iframe 脚本可以直接使用安全的extension messaging

    iframe.html:

    <script src=iframe.js></script>
    

    iframe.js:

    chrome.tabs.getCurrent(tab => {
      chrome.tabs.sendMessage(tab.id, 'getFrameData', {frameId: 0}, processData);
    });
    
    function processData(data) {
      console.log(data);
    }
    

    content.js:

    function createFrame(data) {
      const el = document.createElement('iframe');
      el.src = chrome.runtime.getURL('iframe.html');
      document.body.appendChild(el);
      chrome.runtime.onMessage.addListener(function _(msg, sender, sendResponse) {
        if (msg === 'getFrameData') {
          sendResponse(data);
          setTimeout(() => chrome.runtime.onMessage.removeListener(_));
        }
      });
    }
    

    当然也可以使用基于端口的消息传递。

    【讨论】:

    • 有没有我可以在没有内容脚本的情况下使用执行脚本来做到这一点?据我了解,在页面中执行的脚本无权访问 Chrome API。谢谢!
    • executeScript 中指定的代码按定义是内容脚本。它在同一个独立的内容脚本世界中执行,而不是作为页面脚本,因此它可以像任何其他内容脚本一样访问 chrome.runtime API。
    猜你喜欢
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 2016-09-09
    • 2018-04-11
    • 1970-01-01
    • 2023-03-13
    • 2011-11-02
    • 1970-01-01
    相关资源
    最近更新 更多