dsh-cookie-sentinel:緩解 DSH Desktop 隨機端口下的 dsh-auth Cookie 堆積與 HTTP 431

前言

在 DeepSeek Harness(DSH)Desktop 裏,Host 每次啓動會在本機隨機端口上拉起 Web 服務;@deepseek-ai/dsh-client-connection 會按請求 authority(含端口)爲瀏覽器會話命名 dsh-auth-<sha256("127.0.0.1:<port>")> 形式的 Cookie。Cookie 按 host 存儲、端口不參與區分,且單次頒發的 Cookie 有效期約 30 天。多次啓動後,127.0.0.1 上會殘留大量未過期的 dsh-auth-… 條目。當累計到約 70 條時,請求裏的 Cookie 頭體積可能超過 Node 默認約 16 KiB 的 HTTP 頭上限,Host 在路由之前就返回 431 Request Header Fields Too Large,Electron 歡迎頁側常見 desktop welcome: Web authentication failed。

下面介紹社區插件 dsh-cookie-sentinel(維護者 zhkkjF,分類 admin-security):在 Host 側提高可配置的 header 上限,並在「簽發新 Cookie」的那次 launch-token 響應裏清理其餘陳舊 dsh-auth-…,避免隨機端口場景把桌面鎖在 431 之外。

這是什麼

dsh-cookie-sentinel 是僅作用於 DSH Desktop Host 的插件包(無構建步驟,運行時除 Node 內置模塊外無額外依賴)。它在 apply(ctx) 裏做兩件事:爲在線 http.Server 提高 header 預算;在 connection.authorizeIndex 僅在「mint 新 dsh-auth-… Cookie」的響應上追加對其它同名前綴 Cookie 的 Max-Age=0 刪除。設計約束是 apply 不拋錯——Desktop 會把啓動入口失敗視爲致命,防護插件不能反過來阻止啓動。

生態上 DSH 奉行「一切皆插件」;SkillHub 等社區目錄爲獨立站點,與 DeepSeek / 幻方無資料所述的官方從屬關係。安裝前宜自行審閱源碼與許可證;插件隨當前 DSH 進程權限運行。

故障機理(資料中的描述)

每次啓動使用新 loopback 端口時,都會再留下一條針對當時端口的 dsh-auth-… Cookie,舊條目不會自動消失。請求攜帶的 Cookie 頭隨啓動次數變長,最終在 Node 解析階段觸發 431,認證路由 unreachable。

核心功能

1. Header 餘量(Headroom)

將運行中 http.Server 的 header 上限提高到 128 KiB(可通過配置在 16 KiB–1 MiB 範圍內調整,默認 131072 字節)。Node 對每個新連接讀取 server.maxHeaderSize;在 Cookie 罐已經「脹破」默認 16 KiB 的那一次請求上,仍有機會到達認證路由而不是死在解析器。webServer 服務可能在消費方插件 [Service.init] 完成前就可用,因此若在最長約 10 s 內還拿不到 server 對象,包內會重試。

2. 僅在 mint 響應時修剪(Mint-driven pruning)

包裝 connection.authorizeIndex:僅當該響應 mint 新的 dsh-auth-… Cookie(launch-token 交換)時,對請求中攜帶的其它 dsh-auth-… 名稱追加 Set-Cookie: …; Max-Age=0。Electron 會話會落實刪除,罐內理想情況只保留當前這次啓動的 Cookie。若響應不 mint(例如 401,或之後的 200),不做刪除——避免未來 DSH 改動 Cookie 拼寫時誤刪仍有效的 Cookie。

README 記載的驗證要點包括:70 條 Cookie(約 17,638 字節)返回 401 而非 431;在 128 KiB 配置下約 600 條 Cookie 仍會 431,與邊界一致;合成 mint 場景下 70 條陳舊 Cookie 可產生 1 次 mint + 70 條刪除的 Set-Cookie。

安裝與啓用

可從插件市場安裝,或按 README 直接添加:

dsh plugin --profile <profile> add github:zhkkjF/dsh-cookie-sentinel

將 <profile> 換成你實際使用的 DSH profile 名稱。包爲 host-only,無需單獨 build。

在 profile 配置中插入插件條目(字段名與默認值以 README 爲準):

- insert:
    - id: dsh-cookie-sentinel
      name: dsh-cookie-sentinel
      config:
        maxHeaderSize: 131072   # 16 KiB – 1 MiB, default 128 KiB

審計日誌與觀測

每次啓動會向 ~/.dsh/cookie-sentinel.log 追加日誌行,例如:

2026-11-03T12:15:22.306Z loaded
2026-11-03T12:15:22.307Z ready headerLimit=131072
2026-11-03T12:15:22.315Z pruned=1 host=127.0.0.1:63104

pruned=N 表示 launch-token 響應裏刪除的陳舊 dsh-auth-… 數量。README 說明:首次乾淨啓動之後,後續啓動通常應爲 N=1;若 N 持續增大,表示 Electron 會話未保存刪除指令,需要另尋修復手段。運行中 Chromium 擁有的 Cookie 罐無法從插件內直接讀取,審計日誌是資料支持的觀測方式。

適用場景與注意

  • 適合:長期、多次啓動 DSH Desktop,且遇到或想預防 431 / Web authentication failed、懷疑 dsh-auth-* 在 127.0.0.1 上堆積的 Host 使用者。
  • 不適合當作唯一手段:若日誌顯示 pruned 異常增長,說明刪除未落盤,應結合客戶端/會話側排查,而非單純繼續調大 maxHeaderSize。
  • 安全與管理:分類爲 admin-security;插件修改 Host HTTP 行爲與認證相關鉤子,安裝前請閱讀 index.js 與 cordis.patch.yml。不以資料未記載的用戶案例或反饋作背書。

結尾

dsh-cookie-sentinel 針對 DSH Desktop 隨機端口 + 長壽命 dsh-auth Cookie 的已知組合問題,用「提高 header 上限 + mint 時定點修剪」兩條腿,把 431 擋在認證之前,並把 Cookie 罐拉回當前啓動規模。需要進一步瞭解說明與 issue,見 GitHub 倉庫 與 SkillHub 目錄頁。

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

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

小夜