浏览器扩展 (CrossRider) iframe 来源和 parent 访问

Browser Extension (CrossRider) iframe origin and parent access

我目前正在使用 Crossrider 开发一个扩展。我现在正在使它在 IE 和 Chrome 上也能正常工作。该扩展程序将 IFrame 作为侧边栏添加到每个页面,并从 iframe 与 parent window 交互。为了完成这项工作,我使用 Crossriders "recommendation" 为 iframe 使用数据编码块而不是 URL 来解决同一域的安全问题。

这在 Firefox 中有效(在 IE 中也有一些黑客攻击),但是在 Chrome 中我有以下问题:

Blocked a frame with origin "null" from accessing a cross-origin frame.

根据我的阅读,唯一的解决方法是实际上在同一个域上(不可能,因为该插件适用于每个网站)或使用交叉 window 消息传递(因为我们有丰富的交互parent 很多开销)。所以我的问题是,我如何配置覆盖或任何东西来为 Chrome 修复此问题,有什么办法吗?作为一种快速解决方法,它甚至可以成为我必须在 chrome 中进行的设置。

但总的来说,我认为应该有解决这个问题的方法,因为最后我已经有了对浏览器的完全访问权限,因为安装了扩展程序,所以我想我应该能够以某种方式覆盖它?

通常,iframe 受到浏览器实施的安全策略的保护。因此,在 iframe 和其父页面上的扩展 运行 之间进行交互的最简单方法是在它们之间发送消息。

您可以通过在 IDE 的 Iframes 功能中启用 (Settings >) 运行 来实现这一点,然后区分 iframe 和它的extension.js 代码中的父项。以下示例应该可以帮助您理解总体思路:

extension.js:

appAPI.ready(function($) {
  if (appAPI.dom.isIframe()) {
    // iframe code
    appAPI.message.addListener(function(msg) {
      if (msg.action === 'someAction') {
        ...
        // send response
        appAPI.message.toCurrentTabWindow({
          action:'otherAction',
          response:'otherResponse'
        });
      }
    });
    // end iframe code
    return;
  }
  // Parent window code
  appAPI.message.addListener(function(msg) {
    if (msg.action === 'otherAction') {
      ...
      // send response
      appAPI.message.toCurrentTabIframes({
        action:'someAction',
        response:'someResponse'
      });
    }
  });
});

有关示例中使用的方法的详细信息,请参阅 appAPI.dom.isIframe, appAPI.message.toCurrentTabIframes, and appAPI.message.toCurrentTabWindow

[披露:我是 Crossrider 员工]

您可以使用对象 url 作为您的 iframe src。他们认为与创建页面的来源相同。 https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL