我正在开发一个扩展程序,有时会在iframe中显示一些网站。我已经绕过了X-FRAME-OPTIONS问题,但现在我仍然坚持简单 iframe破坏代码,例如:
if (top != self) {
document.getElementsByTagName("html")[0].style.display = "none";
top.location.replace(location);
}
我正在尝试在页面的顶部注入javascript以覆盖window.top对象,但是document_start
已经来不及注入它,即alert()
之前从未被调用过破坏者脚本运行:
chrome.webRequest.onCompleted.addListener(function(details) {
if (isEnabled) {
chrome.tabs.executeScript(details.tabId, {frameId: details.frameId, runAt: "document_start", code: "alert('asas');"});
}
}, {
types: ["sub_frame"],
urls: ["<all_urls>"]
});
有什么方法吗?
谢谢
答案 0 :(得分:1)
问题可能是chrome.webRequest.onCompleted.addListener
侦听器异步
document_start
在创建任何DOM 之前注入代码,因此这不是导致问题的原因。我在玩游戏并试图回答this question时验证了这一点。
这里的问题是chrome.webRequest.onCompleted.addListener
是异步的,这意味着当执行回调(以及你的chrome.tabs.executeScript
)时,浏览器已经开始构建DOM。
您可以首先使用"content_scripts"
中的manifest.json
直接将脚本注入所有相关的iframe,而不是使用编程注入。我还没有验证这一点,但是你也可以尝试使用。您可能已经在监听chrome.webRequest.onHeadersReceived
选项从"blocking"
监听器注入脚本,这允许你同步处理请求onHeadersReceived
,无论如何都要删除X-Frame-Options
标题。
修改强>
阻止onHeadersReceived
侦听器中的编程注入是不可能的。 Chrome会返回有关权限不足的错误 - 可能是因为此时尚未知道此URL(标头可能会导致重定向)。