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



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

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

"cross-domain-content": ["https://www.example.com"]

这是我manifest.json文件。

{
"manifest_version": 2,
"name": "Test Extension",
"version": "1.0",
"content_scripts": [
{
"matches": ["*://*/*"],
"all_frames": true,
"js": [
"js/main.js"
]
}
],
"permissions": [
"*://*/*",
"<all_urls>",
]
}

这是我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);
}

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

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

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

此外,如果有人可以参考或提供一些以这种方式修改 iframe 内容的示例,我们将不胜感激。

无法直接访问跨域内容

直接访问跨域内容是不可能的,或者至少不应该。虽然可能有一种方法可以绕过此限制(我没有详尽地查看),但它不是故意的,会被视为错误。

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

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

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

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

最新更新