我想知道如何在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内容的示例,我们将不胜感激。
答案 0 :(得分:4)
直接访问跨域内容不是,或者至少不应该是可能的。虽然可能有办法解决这个限制(我没有详尽的看法),但这不是故意的,而且会被视为一个错误。
与其他类型的Firefox扩展不同,WebExtensions被授予最多以域为基础访问内容的权限。这与您在 manifest.json permissions
中指定"<all_urls>"
或"*://*/*"
无关。指定多个域权限不会打开对跨域内容的访问。打开对跨域内容的访问将是一个更复杂的问题,可能会有一组与安全相关的错误。因此,在permissions
中指定多个域只允许您将脚本/ CSS注入多个匹配的URL,而无需对跨域内容进行特殊访问。因此,不应该有一种方法可以直接访问跨域iframe中的内容。
如果要访问该跨域内容,则必须在要访问的iframe或顶级窗口中注入脚本。如上所述,您注入此类脚本/ CSS的能力是permissions
控制的事情之一。然后,您可以使用消息传递(从顶部框架/子框架中的内容脚本,或通过后台脚本中继),以便在跨域框架中注入的脚本之间进行通信。
鉴于您已经将脚本注入<all_urls>
和all_frames
,您只需要实现上面提到的其中一种通信方法。然后,您需要从其他脚本请求所需信息,或将信息传递给其他脚本进行处理。