dsh-auth-cookie-hygiene: Setting Expiration Headers for Local Authentication Cookies of Stopped Hosts

前言

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 端口须与实际监听端口一致。

同时满足以下条件才会被清理:

  1. 名字为 dsh-auth-*,格式自洽,且名字里的 authority 与其 SHA256 前缀相符(仅自洽性筛选,不验证真实签名);
  2. 该 authority 的端口两次新鲜 TCP 探测均为 ECONNREFUSED,且两次间隔不小于 confirmGapMs;
  3. 不是当前 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 同级)中:

  1. 安装依赖:npm install <tgz 路径>
  2. 把同名 bundle 加进 profile 配置的 dsh.profile.bundles
  3. 包内 dsh.bundle.patch 指向 cordis.patch.yml,由它在配置树中插入 backend 插件,例如:
- insert:
    - id: dsh-auth-cookie-hygiene
      name: dsh-auth-cookie-hygiene
  1. 重启 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 目录页。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye