Firefox WebExtension - 如何获取和修改跨域iframe的内容
Firefox WebExtension - How to obtain and modify content of cross domain 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 的源代码时,会抛出如下错误。
Error: Permission denied to access property "frameElement"
我想知道如何允许 FireFox WebExtension 访问和修改跨域 iframe 的内容。我不确定是不是没有在清单中放下正确的权限的问题,还是我必须使用 WebExtension API 或其他东西,我只是找不到任何东西。
此外,如果有人可以参考或提供一些以这种方式修改 iframe 内容的示例,将不胜感激。
无法直接访问跨域内容
直接访问跨域内容是不可能的,或者至少不应该是可能的。虽然可能有解决此限制的方法(我没有详尽地查看),但它不是故意的,会被视为错误。
与其他类型的 Firefox 扩展不同,WebExtensions 被授予访问内容的权限,最多是一个域一个域地访问内容。这与您在 manifest.json permissions
中指定 "<all_urls>"
或 "*://*/*"
无关。指定多个域权限不会打开对跨域内容的访问。开放对跨域内容的访问将是一个更复杂的问题,它可能有自己的一组与安全相关的错误。因此,在 permissions
中指定多个域只允许您将 scripts/CSS 注入多个匹配的 URL,而无需特殊访问跨域内容。因此,不应该有直接访问跨域 iframe 中或来自跨域 iframe 的内容的方法。
必须使用注入该框架的脚本访问跨域内容
如果您想访问该跨域内容,您必须在您希望访问的 iframe 或顶级 window 中注入脚本。如前所述,你注入这种 scripts/CSS 的能力是受 permissions
控制的事情之一。然后,您可以使用消息传递(from/to 顶部 frame/child 框架中的内容脚本,或通过后台脚本中继)在跨域框架中注入的脚本之间进行通信。
鉴于您已经将脚本注入 <all_urls>
和 all_frames
,您只需要实施上述其中一种在它们之间进行通信的方法。然后你需要向其他脚本请求你需要的信息,或者将信息传递给其他脚本进行处理。
我想知道如何在 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 的源代码时,会抛出如下错误。
Error: Permission denied to access property "frameElement"
我想知道如何允许 FireFox WebExtension 访问和修改跨域 iframe 的内容。我不确定是不是没有在清单中放下正确的权限的问题,还是我必须使用 WebExtension API 或其他东西,我只是找不到任何东西。
此外,如果有人可以参考或提供一些以这种方式修改 iframe 内容的示例,将不胜感激。
无法直接访问跨域内容
直接访问跨域内容是不可能的,或者至少不应该是可能的。虽然可能有解决此限制的方法(我没有详尽地查看),但它不是故意的,会被视为错误。
与其他类型的 Firefox 扩展不同,WebExtensions 被授予访问内容的权限,最多是一个域一个域地访问内容。这与您在 manifest.json permissions
中指定 "<all_urls>"
或 "*://*/*"
无关。指定多个域权限不会打开对跨域内容的访问。开放对跨域内容的访问将是一个更复杂的问题,它可能有自己的一组与安全相关的错误。因此,在 permissions
中指定多个域只允许您将 scripts/CSS 注入多个匹配的 URL,而无需特殊访问跨域内容。因此,不应该有直接访问跨域 iframe 中或来自跨域 iframe 的内容的方法。
必须使用注入该框架的脚本访问跨域内容
如果您想访问该跨域内容,您必须在您希望访问的 iframe 或顶级 window 中注入脚本。如前所述,你注入这种 scripts/CSS 的能力是受 permissions
控制的事情之一。然后,您可以使用消息传递(from/to 顶部 frame/child 框架中的内容脚本,或通过后台脚本中继)在跨域框架中注入的脚本之间进行通信。
鉴于您已经将脚本注入 <all_urls>
和 all_frames
,您只需要实施上述其中一种在它们之间进行通信的方法。然后你需要向其他脚本请求你需要的信息,或者将信息传递给其他脚本进行处理。