Chrome浏览器扩展:加载隐藏页面(无需iframe)

8
有没有一种方法可以加载一个对用户隐藏的页面?
我无法在后台页面中使用iframe,因为该页面具有破坏框架技术。
我不能使用XHR,因为该页面具有AJAX - 我需要它的(动态生成的)DOM。

那个加载的页面会包含什么?HTML、JS、XML吗? - gaborsch
DOM是通过JavaScript动态生成的,还是事先存在的? - Rob W
该页面包含HTML / JS - 它是互联网上的一个页面。在一系列AJAX调用之后,DOM将会动态生成。 - Chris Broadfoot
曾经有一个名为offscreenTabs的API非常适合这个目的。不幸的是,它已经从Chromium的代码库中移除,因为它已经不再维护了。难道你不能自己做AJAX调用并根据响应构建DOM吗?否则,你就没有任何好的解决方案了(在我看来,创建一个标签然后关闭它并不好)。 - Rob W
“offscreenTabs” 看起来很完美,Rob。不幸的是 AJAX 调用由 GWT 构建,因此解析并不直接,且在未来几乎肯定会发生变化。 - Chris Broadfoot
显示剩余5条评论
2个回答

14

很抱歉,除了插入iframe,您没有其他选择。为了破解iframe buster,您可以采用以下技术:

if (top !== self) {
    top.location.href = location.href;
}

然后通过在iframe上设置sandbox属性来阻止脚本导航:

var frame = document.createElement('iframe');
frame.sandbox = 'allow-scripts';
frame.src = 'data:text/html,<script>' +
    'if (top !== self) { top.location.href = location.href;}' +
    'alert(" (runs the rest of the code) ");' + 
    '</script>';
document.body.appendChild(frame);

若没有任何错误发生,导航将被阻止。但控制台会记录以下消息:

在URL为“(......顶级页面的URL...)”的框架中尝试不安全的JavaScript导航,来自于被沙盒化的框架的URL为“(......帧的URL...)”,该框架试图对顶级窗口进行导航,但“allow-top-navigation”标志未设置。

除非以下情况之一发生,否则这些方法始终有效:

  • 页面包含<meta http-equiv="X-Frame-Options" content="deny">
  • 框架破解脚本实现为if (top === self) { /* run code*/ }

在这些情况下,您无法选择其他选项,只能打开一个新标签页、读取其内容,然后关闭它。请参见chrome.tabs.createchrome.tabs.remove


我将使用 onBeforeRequest 来修改响应,通过重定向到剥离了框架破解代码的 Blob URL 版本。 - Chris Broadfoot
@ChrisBroadfoot 没有必要使用webRequest API。只需阅读原始源代码,去除框架破坏器,然后加载一个带有数据URL的框架:frame.src = 'data:text/html;charset=utf8,' + encodeURIComponent(html); - Rob W
似乎无论如何我都无法显示指向 Blob:URL 的 iframe。 - Chris Broadfoot
@ChrisBroadfoot 答案中的 iframe 打破方法应该适用于您的情况 (https://gist.github.com/broady/28d572afa644b94df322)。如果您想要禁用警报,可以加载一个内容脚本,并注入一个设置 alert 为无操作函数的脚本标签。 - Rob W
似乎绕过X-Frame-Options头部不再起作用了(Chrome 46)。 - cprcrack

2
您可以使用popUnder来加载数据:
var win2;
function loadPopUnder(){
win2 = window.open("about:blank","",
    width=150,height=150,scrollbars=0,resizable=0,toolbar=0,location=0,menubar=0,status=0,directories=0");
    win2.blur();
    window.focus()
}

win2.document.location.href='http://www.exampe.com/url';

实际上,在某些情况下它们可能会在新标签页中打开 - 您必须检查实际行为。

此外,这是一个独立于浏览器的解决方案,具有优势。


1
弹出窗口是一种糟糕的用户体验。如果一个扩展程序在各个地方生成弹出窗口,你会怎么做?Chrome API允许创建非活动标签页。虽然这仍然不太好,但比弹出窗口要好些。 - Rob W
@RobW 我同意这很丑,我只是想记录一下有这样的选项。如果没有其他方法,你仍然可以回退到这个(而且由于offScreenTabs不是100%可靠的,它似乎是一个真正的可能性)。同时我注意到你提出了一个更好的解决方案,所以它可能已经过时了。无论如何,对你的解决方案点赞。 - gaborsch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接