首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >利用Chrome扩展绕过iFrame检测

利用Chrome扩展绕过iFrame检测
EN

Stack Overflow用户
提问于 2016-06-03 12:32:22
回答 2查看 6.5K关注 0票数 2

如何使用chrome扩展覆盖window.top对象?

这就是我想要的:

manifest.json

代码语言:javascript
复制
{
  "name": "buster",
  "version": "0.0.41",
  "manifest_version": 2,
  "description": "Removes iframe buster scripts",
  "homepage_url": "http://google.com",
  "background": {
    "scripts": ["background.js"]
  },
  "browser_action": {
    "default_title": "buster buster"
  },
  "permissions": [ "webRequest", "webRequestBlocking", "<all_urls>", "tabs"],
  "web_accessible_resources": [
    "index.html"
  ],
  "content_scripts": [
  {
    "matches": ["*://*/*"],
    "run_at": "document_start",
    "js": ["buster.js"],
    "all_frames": true
  }
  ]
}

background.js

代码语言:javascript
复制
chrome.webRequest.onHeadersReceived.addListener(function (details) {
    return {responseHeaders: details.responseHeaders.filter(function(header) {
        return ((header.name.toLowerCase() !== 'x-frame-options'));
    })};
}, {
    types: ["sub_frame"],
    urls: ["<all_urls>"]
}, ["blocking", "responseHeaders"]);

chrome.browserAction.onClicked.addListener(function (tab) {
    chrome.tabs.update(tab.id, {url: chrome.extension.getURL("index.html")});
});

buster.js尽我所能:

代码语言:javascript
复制
if (top!=self) {
    alert(location.href);
//console.log(document.head.querySelector("script:not([src])").innerHTML)
    window.self=window.top;

    Window.prototype.__defineGetter__('top',function(){return this;});

    window.top = window.top.window;


    var prevent_bust = 0  
    window.onbeforeunload = function() { prevent_bust++ }  
    setInterval(function() {  
      if (prevent_bust > 0) {  
        prevent_bust -= 2  
        window.top.location = 'http://httpstat.us/204'  
      }  
    }, 1) 
}

index.html --我以stackoverflow.com为例

代码语言:javascript
复制
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title></title>
</head>
<body style="background: #ccc">
    <iframe id="ifr" src="http://stackoverflow.com/questions/37588058/inject-javascript-at-the-very-top-of-the-page-anti-iframe-buster" width="555" height="555"></iframe>
    <!-- http://time.com/4356072/missing-japanese-boy-found-forest/?xid=homepage -->
</body>
</html>

扩展压缩文件

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-03 17:54:11

我迟到了几分钟..。:-)

您需要将"buster.js“注入页面,您将在内容脚本的沙箱环境中执行它。虽然内容脚本可以访问页面的DOM,但它们不共享页面的JavaScript执行环境(window)。这里有一个很好的概述:使用内容脚本将代码插入页面上下文

将您的buster.js更改为此,它将工作:

代码语言:javascript
复制
var el = document.createElement("script");
el.textContent = "if (top !== self) {window.self = window.top;}";
document.documentElement.appendChild(el);
票数 7
EN

Stack Overflow用户

发布于 2016-06-03 17:50:36

AFAIK不能覆盖内容脚本中的window.top。这是因为您的内容脚本运行在一个孤立的世界中,无法使用驻留在页面中的任何JavaScript变量或函数。

来自Chrome扩展文档:

内容脚本在一个称为孤立世界的特殊环境中执行。它们可以访问注入到的页面的DOM,但不能访问页面创建的任何JavaScript变量或函数。在每个内容脚本看来,好像在运行它的页面上没有其他的JavaScript在执行。相反,情况也是如此:在页面上运行的JavaScript不能调用任何函数或访问由内容脚本定义的任何变量。

阅读更多关于执行环境的信息。

编辑:也看这个很好的答案获得更多信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37614493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档