前言¶
DeepSeek Harness(DSH)Desktop 每次启动会在 127.0.0.1 上绑定一个随机端口,并为该 Host 设置名为 dsh-auth-* 的认证 Cookie。浏览器不按端口隔离 Cookie,旧端口对应的条目又不会自动过期,多次重启后 Cookie 请求头会持续变长,最终在 HTTP 解析阶段触发 431 Request Header Fields Too Large,本地页面表现为认证失败。常见应对是手动清 Cookie 或调大服务端头限制,前者麻烦,后者不触及根因。下面介绍社区插件 dsh-auth-cookie-hygiene:在本地 HTTP 响应里追加过期 Set-Cookie,让浏览器自行删除已停止 Host 留下的 dsh-auth-*,属于预防性缓解,不修改安装包、不读写浏览器 Cookie 库、不碰签名密钥、不关闭认证、也不调大请求头上限。
这是什么¶
dsh-auth-cookie-hygiene 是标准 DSH bundle 插件,维护者为 CECILIALOVE0616,分类为 admin-security,许可证 MIT,当前版本 0.1.1(见仓库 package.json)。它通过 Cordis 挂到 webServer.server,在已认证的首页响应(显式 200/303、非流式)上合并发送过期头;401/403、流式响应会原样放行,原有 Set-Cookie、状态码、Location 与响应体不变。
背景与清理规则¶
DSH 每次新端口都会多留一个 dsh-auth-*,插件只在判定旧端口确实无人监听时才会下发过期头。处理范围限于字面量 127.0.0.1:端口 的本地 HTTP 请求,且请求 Host 端口须与实际监听端口一致。
同时满足以下条件才会被清理:
- 名字为
dsh-auth-*,格式自洽,且名字里的 authority 与其 SHA256 前缀相符(仅自洽性筛选,不验证真实签名); - 该 authority 的端口两次新鲜 TCP 探测均为
ECONNREFUSED,且两次间隔不小于confirmGapMs; - 不是当前 Host,也不是任何正在监听的 Host。
始终保留:当前 Host、其他在监听 Host、v2/API Cookie、非 127.0.0.1 或 HTTPS 形态的 Cookie、畸形/超长/判定不确定的 Cookie。探测超时或其他错误按「未知」处理并保留。
README 明确说明:已大到被 parser 拒绝的请求进不了应用层,插件看不到,必须先离线清一次 Cookie;端口复原/进程切换存在 TOCTOU 窗口;依赖当前版本的 webServer.server 与 v1 Cookie 格式,不承诺跨大版本兼容。
安装与启用¶
插件零运行时依赖,仅使用 Node 内置模块,需要 Node ≥ 22.13。官方 README 未提供 dsh plugin add 一类命令,安装流程如下。
先打包:
git clone https://github.com/CECILIALOVE0616/dsh-auth-cookie-hygiene.git
cd dsh-auth-cookie-hygiene
npm pack # 产出 dsh-auth-cookie-hygiene-<version>.tgz
在 DSH 的 profile 目录(与 cordis.patch.yml 同级)中:
- 安装依赖:
npm install <tgz 路径> - 把同名 bundle 加进 profile 配置的
dsh.profile.bundles - 包内
dsh.bundle.patch指向cordis.patch.yml,由它在配置树中插入 backend 插件,例如:
- insert:
- id: dsh-auth-cookie-hygiene
name: dsh-auth-cookie-hygiene
- 重启 DSH,先走一遍 welcome / account 流程确认登录正常。
安装前备份 profile 并退出 DSH;不要在运行中的 profile 上并发改依赖。卸载时移除 bundle 与依赖再重启,effect 会释放挂钩。
配置¶
全部可选,非法值回落默认值。写在与上述 insert 条目同级的 config 下即可。常用项如下(完整表见仓库 README):
| 键 | 默认 | 说明 |
|---|---|---|
enabled |
true |
关闭后只挂载不清理 |
maxPerResponse |
8 |
单次响应最多下发多少个过期头(1–32) |
maxExtraHeaderBytes |
3072 |
单次响应追加头的字节上限 |
confirmGapMs |
120 |
两次拒绝探测之间的最小间隔 |
confirmTimeoutMs |
700 |
新鲜探测总预算;到点放行 |
probeTimeoutMs |
250 |
单次 TCP 探测超时 |
debug |
false |
输出接入与配置日志 |
不建议放大限额或等待时间:真正约束是浏览器端请求头总大小,不是插件侧参数。单次响应默认最多 8 条过期头,首屏可能清不完大量历史 Cookie,多刷新几次即可。
开发与自测¶
维护者在仓库内提供测试:
npm test # node --test "test/*.test.js"
npm run test:sandboxed # 受限环境下关掉测试进程隔离(Node 24+ 支持)
README 称共 50 项测试,覆盖冷请求、活跃 Host 保留、v2/畸形输入、原登录头合并、401 不变、流式响应、探测超时与卸载放行等;若沙箱不允许 node --test 派生子进程,可改用 npm run test:sandboxed。
适用场景与注意¶
适合长期本地使用 DSH Desktop、频繁重启导致 loopback 认证 Cookie 堆积、希望在不改 DSH 本体的前提下做预防的用户。插件以当前 DSH 进程权限运行,安装前应阅读源码与 MIT 许可证,自行评估是否纳入 profile。
已知限制(摘自 README):
- 不修复已触发的 431,堆积较多时需先退出 DSH 离线清理;
- 无法验证 Cookie 真实性,仅格式自洽 + 端口关闭筛选;
- 探测与删除之间端口重新启用时,可能误过期刚启用的实例,需重新打开登录链接;
- 真实桌面 profile 的长期表现与 DSH 大版本升级兼容性,文档未声称完整验收。
DSH 生态理念是「一切皆插件」;社区目录 SkillHub 插件页 为独立站点,与 DeepSeek / 幻方无官方从属关系。
结尾¶
dsh-auth-cookie-hygiene 针对随机端口 Host 导致的 dsh-auth-* 堆积,用本地响应里的过期 Set-Cookie 做预防性卫生,边界清晰、可配置、可卸载。进一步细节与配置表见 GitHub 仓库 与 SkillHub 目录页。