新闻详情

新闻详情

首页 / 资讯中心 / 详情

零脚本、零跟踪、零网络请求:kage sanitize层如何把页面的JavaScript彻底“切除“

发布时间:2026/11/15 3:08:32来源:尧图网络
零脚本、零跟踪、零网络请求:kage sanitize层如何把页面的JavaScript彻底“切除“
零脚本、零跟踪、零网络请求kage sanitize层如何把页面的JavaScript彻底切除【免费下载链接】kageShadow any website for offline viewing, with the JavaScript stripped out项目地址: https://gitcode.com/gh_mirrors/kage6/kagekage是一个开源的离线网页镜像工具它用真实无头浏览器渲染页面然后把JavaScript 彻底移除kage sanitize 层连同 CSS、图片、字体一起落到本地得到一份零脚本、零跟踪、零网络请求的离线副本。本文带你走读它的 sanitize/ 包看看这个切除到底是怎么做到的。为什么另存为不等于拥有这个网页现代网页早已不是一张纸而是一个薄客户端你看到的文字和图片大半是浏览器现场执行 JavaScript 之后拼出来的。用浏览器另存网页保存下来的往往是一个依赖脚本和网络的残骸——打开后是一屏空白或一个永远转圈的加载动画页面上的统计脚本仍会尝试回连已经不存在的服务端任何埋点、Cookie 追踪代码都原封不动地跟着文件走了。换句话说你保存的不是页面而是一把需要对方服务器配合才能打开的锁。kage 选择了另一条路让页面先把 JS 跑完、把最终形态定格下来然后再把 JavaScript 整体切除。留下来的就是一张照片a photograph, not a program——它长得和原站一样但不运行任何代码。负责这一步的就是 sanitize 层。kage sanitize 层在克隆流水线中的位置kage 的完整流水线只有五步sanitize 处于关键的第四环种子URL ─▶ 无头Chrome渲染 ─▶ 快照最终DOM ─▶ 切除JS(sanitize) ─▶ 资源本地化 ─▶ 写入磁盘实现上非常克制sanitize不是用正则搜罗HTML 字符串而是用golang.org/x/net/html把文档解析成一棵 DOM 树然后逐节点遍历、精准删除最后再渲染回 HTML。这个差别很重要——正则方案永远防不住嵌套和变形而树遍历不会。入口就两个函数位于 sanitize/sanitize.goStrip接收原始 HTML 字节解析→清理→渲染一步到位CleanTree接收一棵已解析的 DOM 树原地清理。克隆器用它这样 HTML 只解析一次资产链接重写asset/ 包和 JS 切除可以共享同一棵树省掉一次昂贵的解析。调用点在克隆器的页面写入路径上见 clone/cloner.goasset.RewriteHTML(root, j.u, sink) // 先把链接改成本地路径 sanitize.CleanTree(root, sanitize.Options{ KeepNoscript: c.cfg.KeepNoscript, MobileReadable: c.cfg.MobileReadable, Banner: cloned by kage from j.u.String(), })注意顺序先本地化链接再切除脚本。这样即使某个资源是脚本加载的影子页面里已经留下的 DOM 结构也安然无恙。六类切除sanitize 到底删了什么核心遍历逻辑在clean函数中sanitize/sanitize.go它自顶向下走遍整棵树对每个节点做判定。以下是它处理的六类目标1.script标签连根拔起所有script元素被整节点删除不管它是内联代码还是src引用外部 JS。这是零脚本的主力。2.on*事件处理器逐属性剥离div onclick...、body onload...这类内联事件处理器是最容易漏掉的 JS 藏身地。stripHandlerssanitize/sanitize.go扫描每个元素的全部属性凡是on开头的一律删除——onclick、onerror、onmousewheel一个不留。3.javascript:URL改写为无害形式a hrefjavascript:doEvil()是第三种执行路径。neutralizeJSURLssanitize/sanitize.go检查 8 种可能携带 JS 的属性href、src、action、poster、background等命中javascript:前缀的是href→ 改写为#链接还在但不再执行其他属性 → 整个属性直接丢弃。4. IE 条件注释堵住暗渡陈仓的通道这是 sanitize 层最见功力的一处。老式 IE 条件注释!--[if lt IE 9]...![endif]--在标准解析器眼里只是一条评论而评论里可以藏一个完整的script src...——纯按元素遍历的清理器永远看不见这个脚本。sanitize 的策略干脆利落识别到条件注释标记整条评论直接删掉sanitize/sanitize.go。而条件注释公开显示的那部分内容存放在兄弟节点里不受影响照留不误。5.meta refresh跳转JS 版本必删meta http-equivrefresh是无需脚本的跳转/刷新机制。目标里含javascript:的无论如何都删普通定时跳转默认也删除非你显式开启KeepMetaRefresh选项——离线副本不该自己动起来。6. 离线死链preconnect/preload等提示符link relpreconnect、dns-prefetch、modulepreload以及预加载.js文件的preload/prefetch——这些资源提示在线上是性能优化离线后全是指向空气的请求。isDeadLinksanitize/sanitize.go把它们识别出来并移除从根源上保证零网络请求。切除之外sanitize 还在默默修补sanitize 不只是减法还有几处贴心的加法让离线副本在任何阅读器里都自洽操作作用补charset声明若源站只在 HTTP 头里声明了编码保存为独立文件后会丢失、导致乱码。sanitize 会在head顶部补一个meta charsetutf-8让页面自我描述noscript解包可选默认删除noscript开启KeepNoscript后会把其中的真实内容解包保留——专为那些把正文藏在 JS 检测后面的老站移动端可读注入可选MobileReadable会为 90/00 年代表格布局老站注入viewport和一段 CSS放大字体、让固定像素表格变流式、隐藏离线无用的图片地图导航克隆横幅在文档头部插入一条 HTML 注释标注由 kage 从某 URL 克隆方便日后溯源保留清单同样明确样式表、图片、字体、表单、以及全部语义化标记原封不动——布局完整存活只是不再运行。一次切除的账单Report 统计结构每次清理都会生成一份Reportsanitize/sanitize.go逐项计数ScriptsRemoved删了多少scriptHandlersRemoved剥了多少on*属性JSURLsNeutralized改写/丢弃了多少javascript:URLMetaRefreshRemoved、DeadLinksRemoved、CondCommentsRemoved跳转、死链、条件注释各删了多少NoscriptRemoved/NoscriptUnwrappednoscript的去向CharsetAdded是否补了编码声明。这份账单既会出现在克隆运行的汇总统计里也是测试断言的依据——每一项切除都有据可查而不是感觉删干净了。测试如何保证切得干净sanitize/sanitize_test.go 覆盖了全部关键路径用例名本身就是一份清单TestStripRemovesAllJS—— 脚本、处理器、javascript:URL 一网打尽TestConditionalCommentScriptRemoved—— 条件注释里的暗藏脚本被清除TestConditionalCommentRevealedContentKept—— 而公开显示的内容完整保留TestKeepNoscriptUnwraps—— 解包模式工作正常TestDoctypePreservedAndBannerFollowsIt—— 横幅永远插在!DOCTYPE之后避免把老阅读器逼进怪异模式TestCharsetAddedWhenMissing/TestCharsetNotDuplicated—— 编码声明补而不重。想动手验证克隆一个站点后打开任意.html文件搜索script结果应当为空——而页面的图片、排版、链接却都在原位。结语一张照片而不是一个程序回到开头的问题为什么另存为保存不住网页因为网页的生命在 JavaScript 里而脚本既不能离线存活也带着跟踪与回连的副作用。kage 的 sanitize 层给出的答案是先让真实浏览器把页面活完定格下人类实际看到的那个 DOM再用树遍历把这个 DOM 里的所有执行能力——脚本标签、内联处理器、javascript:链接、条件注释后门、meta 跳转、死掉的资源提示——逐类切除。最终落盘的.html文件✅零脚本script与on*属性一个不剩✅零跟踪埋点代码根本不存在于文件里✅零网络请求预连接与预加载提示已清除CSS/图片/字体全部本地化✅自洽可读编码声明补齐任何离线阅读器kage 自带 viewer、Kiwix 等打开即所得。正如 sanitize/sanitize.go 包注释里那句话——a photograph, not a program一张照片而不是一个程序这就是离线镜像的完整体。更多使用方式可参考 clone/ 目录下的爬虫实现与 docs/content/ 中的完整指南。【免费下载链接】kageShadow any website for offline viewing, with the JavaScript stripped out项目地址: https://gitcode.com/gh_mirrors/kage6/kage创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

【外设】之大彩串口显示屏 2026/11/14 3:51:47

【外设】之大彩串口显示屏

大彩串口屏初步使用 1 .官网下载 STM32 屏幕 GUI 设计资料 http://www.gz-dc.com/category/typeid/4112 找到 STM32 Keil 工程,移植相关代码因项目而异进行移植,由于项目简单,本人只对用到的指令接口进行修改。 比如:注意事项&…

阅读更多 →
无法下载Windows系统iso文件 2026/11/15 2:04:12

无法下载Windows系统iso文件

当我遇到这个问题的时候,我打开了一个网站: 登录 然后我打算下载的时候: 突然那个官方的连接就可以下载了:

阅读更多 →
【清华代码熊】DeepSeek V4.1 Flash 后训练详解 2026/11/14 10:11:15

【清华代码熊】DeepSeek V4.1 Flash 后训练详解

📌 上期解析了 DeepSeek V4.1 Flash 模型架构改进,本期解析 DeepSeek V4.1 Flash 预训练/后训练技术: 🌟 预训练:45T 文本 多模态混合语料、直接训练 sparse attention(取消 DeepSeek V4 的 dense 冷启动&…

阅读更多 →
Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ... 2026/11/14 17:14:38

Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ...

文章主要内容和创新点 主要内容 本文聚焦于多模态大语言模型(MLLM)强化学习(RL)训练中的效率问题,提出了一个名为Shuffle-R1的框架。研究发现,当前RL训练存在两个关键缺陷: 优势值坍缩(Advantage Collapsing):批次中大多数优势值集中在零附近,导致有效梯度信号被淹…

阅读更多 →
PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction 2026/11/14 16:35:50

PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction

一、文章主要内容总结 本文聚焦于利用大型语言模型(LLMs)实现个人身份信息(PII)脱敏的研究,旨在解决传统脱敏方法(如基于规则的系统、领域特定命名实体识别(NER)模型)泛化能力差、跨格式/跨语境适应性弱的问题。 研究通过全面评估多种LLM架构(包括密集型LLM(D-LLM…

阅读更多 →
LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model 2026/11/14 3:51:43

LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model

文章主要内容和创新点 主要内容 本文聚焦于二进制图像-文本相关性评估任务(判断图像与文本“相关”或“不相关”),针对该任务中文本格式多样、相关性定义随场景变化等挑战,提出了基于多模态大语言模型(MLLM)的解决方案LLaVA-RE。 模型设计:LLaVA-RE基于LLaVA 1.5架构,…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉