Firefox WebExtension - 如何获取和修改跨域iframe的内容

Big*_*ger 10 javascript iframe firefox jquery firefox-addon-webextensions

我想知道如何在Firefox WebExtension中访问和修改JavaScript中跨域iframe的内容.我理解普通JavaScript的局限性,修改跨域iframe会是一个XSS漏洞,但我相信在WebExtension中有一些我无法找到的方法.我相信这是因为旧版扩展清单具有允许权限部分中的跨域内容的选项.

查看旧版FireFox扩展的旧代码时,似乎有以下方式为某些网站提供跨域内容选项.虽然对于新的FireFox WebExtension,但这不是文档中列出的功能.

"cross-domain-content": ["https://www.example.com"]
Run Code Online (Sandbox Code Playgroud)

这是我的manifest.json档案.

{
  "manifest_version": 2,
  "name": "Test Extension",
  "version": "1.0",
  "content_scripts": [
    {
      "matches": ["*://*/*"],
      "all_frames": true,
      "js": [
        "js/main.js"
      ]
    }
  ],
  "permissions": [
    "*://*/*",
    "<all_urls>",
  ]
}
Run Code Online (Sandbox Code Playgroud)

这是我的main.js档案.

// Code is being run within an iframe ("all_frames": true)
if (window != window.top) {
  // Attempt to log the source of the parent iframe
  // If cross domain, met throws - Error: Permission denied to access property "frameElement"
  console.log(window.parent.frameElement.src);
}
Run Code Online (Sandbox Code Playgroud)

正如您在main.js文件中看到的那样,当尝试打印父iframe的源时,会抛出错误,如下所示.

错误:拒绝访问属性"frameElement"的权限

我想知道如何允许FireFox WebExtension访问和修改跨域iframe的内容.我不确定是不是在清单中没有放下正确的权限,或者我必须使用WebExtension API或其他什么,我就是找不到任何东西.

另外,如果有人可以参考或提供一些以这种方式修改iframe内容的例子,那将非常感激.

Mak*_*yen 6

无法直接访问跨域内容

直接访问跨域内容是不可能的,或者至少不应该是可能的。虽然可能有办法绕过这个限制(我没有仔细研究过),但这不是故意的,会被认为是一个错误。

与其他类型的 Firefox 扩展不同,WebExtensions 被授予最多一个域访问内容的权限。这与您指定"<all_urls>""*://*/*"在您的manifest.json 中 无关permissions。指定多个域权限不会打开对跨域内容的访问。开放对跨域内容的访问将是一个更复杂的问题,它可能有自己的一组与安全相关的错误。因此,在您的域中指定多个域permissions仅允许您将脚本/CSS 注入多个匹配的 URL,而无需对跨域内容进行特殊访问。因此,不应有直接访问跨域 iframe 中或来自跨域 iframe 的内容的方法。

必须使用在该框架中注入的脚本来访问跨域内容

如果您想访问该跨域内容,您必须在您希望访问的 iframe 或顶级窗口中注入一个脚本。如前所述,您注入此类脚本/CSS 的能力是由permissions. 然后,您可以使用消息传递(从/到顶部框架/子框架中的内容脚本,或通过后台脚本中继)在您注入跨域框架的脚本之间进行通信。

鉴于您已经将脚本注入<all_urls>, 和all_frames,您只需要实现上述它们之间的通信方法之一。然后您需要从其他脚本请求您需要的信息,或者将信息传递给其他脚本进行处理。