Overview
dsh-netguard
README / EN
Package documentation
Registry summary
dsh.pub verifies the pinned bundle contract, runtime facts, and distribution semantics. The complete README remains in the source repository.
Read the full README on GitHubLIMITATIONS
Known limitations
**没防住的部分,写清楚比假装防住了强** 1. **DNS 解析与实际连接之间的时间差(TOCTOU)**。这里查一次 DNS、判定通过, 然后交给 fetch 自己**再查一次**才连。攻击者如果用一个 TTL=0 的域名, 可以让第一次查到公网、第二次查到内网 —— 这是 DNS rebinding 的第二种形态, **本插件挡不住**。真正的修法是把解析结果钉住(自己实现 dispatcher / connect 钩子, 连那个 IP 而不是再查一次名字),或者连上之后核对对端地址。 Node 的全局 fetch 不给这个钩子,所以这里留了 `fetchImpl` 注入点,宿主可以接自己的实现。 2. **代理**。如果宿主注入了一个走代理的 fetch,本插件的判定是在**代理之前**做的, 它只描述"目标地址",管不了代理那边怎么解析、怎么连。 另外 Node 的 fetch 默认不读 `HTTP_PROXY` / `HTTPS_PROXY`,但这个行为取决于运行时版本 —— 别指望这一层替你管代理。 3. **内容本身**。它只管"能不能去、拿多大",不管"拿回来的东西写了什么"。 拉回来的页面里完全可以写"忽略你之前的所有指令"。工具的描述和返回值末尾都提醒了这一点, 但那是一句提醒,不是一道防护。 4. **不是浏览器**。`<meta http-equiv="refresh">`、JS 跳转、Service Worker 这些 客户端侧的重定向不归它管(fetch 也看不到)。 5. **公网地址上的内网内容**。攻击者自己那台公网服务器完全可以反代到内网 —— 从地址层面看不出任何问题。这一层挡不住,也不该指望它挡。 6. **端口黑名单是近似,不是完整**。`8081`、`9090`、`5000` 这些也可能挂着内网服务。 想更严就自己往 `blockedPorts` 里加。 7. **IPv6 只放 `2000::/3`**,极少数合法的特殊写法会被误挡(被挡了会报 `RESERVED`,能改)。 8. **没有速率/并发限制**。它回答的是"能不能去这个地址",不回答"去多少次"。 真要做配额得在外面加。 9. **只做 GET**,不支持上传、POST、流式长连接。 10. **DNS 层不做 DNSSEC 验证**,系统解析器返回什么就判什么。 (不过 CNAME 链不影响结论:判的是最终地址。)
