You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ChromeOS自助服务终端应用如何绕过framekiller限制?

解决ChromeOS Kiosk模式下Frame Killer检测的方案

一、提前注入脚本,劫持核心属性读取

你的原有脚本失效大概率是因为注入时机太晚,网站已经先执行了frame killer检测;或者网站通过严格引用缓存了top/self的值,直接赋值无法覆盖。可以通过以下方式优化:

  1. 修改扩展manifest,确保脚本在页面最早期注入
    在manifest.json中配置content script的run_at为document_start,让脚本在页面DOM构建前就执行:
"content_scripts": [
  {
    "matches": ["<all_urls>"],
    "js": ["buster.js"],
    "run_at": "document_start",
    "all_frames": true
  }
]
  1. 重写top/self/parent的属性读取逻辑
    用Object.defineProperty劫持这些属性的getter,让任何读取操作都返回当前窗口,确保self === top始终为true:
// buster.ts
Object.defineProperty(window, 'top', {
  get: () => window,
  configurable: true
});
Object.defineProperty(window, 'self', {
  get: () => window,
  configurable: true
});
Object.defineProperty(window, 'parent', {
  get: () => window,
  configurable: true
});

这种方式能绕过大多数基于属性比较的frame killer,因为无论网站什么时候读取这些值,都会得到当前窗口的引用。

二、用Declarative Net Request直接修改网站响应

如果脚本注入仍无效,可以通过Chrome扩展的declarativeNetRequest API,在网站内容到达浏览器前就修改掉frame killer代码:

  1. 在manifest中添加权限
"permissions": ["declarativeNetRequest"],
"host_permissions": ["<all_urls>"]
  1. 创建规则重写响应内容
    在rules.json中添加规则,匹配网站中的frame killer代码并替换:
[
  {
    "id": 1,
    "priority": 1,
    "action": {
      "type": "modifyResponse",
      "response": {
        "replace": [
          {
            "regex": "if\\s*\\(self\\s*!==\\s*top\\)",
            "replaceWith": "if(false)"
          }
        ]
      }
    },
    "condition": {
      "urlFilter": "*",
      "resourceTypes": ["main_frame", "sub_frame"]
    }
  }
]

这个规则会把所有if(self !== top)的判断替换成if(false),直接跳过frame killer逻辑。

三、改用Tab API替代iframe方案

既然你的应用本质是简易浏览器,可考虑放弃iframe,直接用Chrome扩展的tabs API打开外部网站:

  1. 在manifest中添加tabs权限
"permissions": ["tabs"]
  1. 在扩展后台脚本中创建标签页
// background.ts
chrome.tabs.create({ url: "https://target-website.com" });

在Kiosk模式下,只要扩展拥有tabs权限,就能直接控制标签页,完全规避iframe相关的所有限制,包括frame killer。需要注意的是,托管Chromebook的Kiosk模式需要提前配置扩展的权限白名单。


原脚本失效原因分析

你之前的脚本存在两个问题:

  • 注入时机默认是document_idle,此时网站可能已经执行了frame killer检测;
  • 直接赋值window.self = window.top的方式,无法覆盖网站提前缓存的top引用(比如网站脚本开头就执行const _top = top,后续用_top比较)。

内容的提问来源于stack exchange,提问作者nikitakot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 08:35:24