Repository navigation
Replies: 1 comment
补充:临界值实测与 rc.5 代码级确认在原帖基础上补充本机(Windows 11 26H2 / 0.2.1-rc.5)的实测数据,供参考与交叉验证。 1. 临界值精确吻合按
71 条 = 16186 字节,与原帖中 netlog 抓到的 2. 本次实测:63 条时已到临界边缘本机在清理前一刻为 63 条,Cookie 头 14362 字节,余量仅 2022 字节 ≈ 再启动 8 次即越线。按日均 10 次启动计,不到一天就会触线,与「约 25~30 天后崩溃」的普遍描述相比,高频重启用户的实际危险期短得多。 清理前后:
3. 新发现:认证 cookie 是明文落盘的本机库中 即 Chromium 的 4. 根因的代码级复核(rc.5 仍未修复)对 0.2.1-rc.5 的
同时验证:库中 62/62 条的名字均满足 5. 附:审计 / 清理脚本为定位本问题写了个小工具(无需依赖,Node 22+ 的 需注意两点实测结论:
脚本核心逻辑(可直接内联使用): // Chromium 时间戳列是 17 位微秒值,超出 JS 安全整数,直接 SELECT 会抛
// "Value is too large to be represented as a JavaScript number",需 CAST 成 TEXT
const rows = db.prepare(`
SELECT name, length(value) AS vlen FROM cookies
`).all();
// 精确估算 Cookie 头(Chromium 落盘时 encrypted_value 为空,明文在 value 列)
const auth = rows.filter(r => r.name.startsWith('dsh-auth-'));
const header = auth.reduce((s, r) => s + r.name.length + 1 + r.vlen, 0)
+ Math.max(0, auth.length - 1) * 2;
db.prepare("DELETE FROM cookies WHERE name LIKE 'dsh-auth-%'").run();
db.exec('VACUUM');6. 一点补充
|
Uh oh!
There was an error while loading. Please reload this page.
环境
系统环境
OS:Windows 11 26h2 专业版 x64,Build 26300(10.0.26300.9711)
app: @deepseek-ai/dsh-desktop 0.2.1-rc.3
electron: 44.7.0
node: 24.21.0 (Desktop Host 内置运行时)
渲染进程 UA 中的 Chromium 版本:152.0.7977.130
安装方式:官方 NSIS 安装包,路径
C:\Users\<user>\AppData\Local\Programs\DeepSeek Harnessdsh home:默认
%USERPROFILE%\.dsh(desktop profile,含若干第三方社区插件;已确认与本问题无关)触发场景
概述
dsh 桌面版每次启动都会向 Electron 持久 cookie 库写入一个名为
dsh-auth-<哈希>的认证 cookie(Max-Age 30 天)。哈希包含本次启动的随机端口,导致 cookie 名字每次都不同、旧 cookie 永不被覆盖。对重启频率较高的用户(日均启动约 3 次以上,约 20~30 天后),cookie 累积使Cookie请求头超过 host 侧 Node http 服务器的 16KB 请求头上限,host 对所有认证请求返回431 Request Header Fields Too Large,桌面端启动即崩(desktop welcome: Web authentication failed),且崩溃循环自增强:每次失败的重试也会再存入一个新 cookie,因此一旦越线永远无法自愈,只能手动清库。该问题与第三方插件无关,由 host 的 cookie 设计直接导致;Windows / Linux 均可复现。
复现步骤
自然复现:30 天内启动超过约 65~71 次(本次事故实测第 71 条时崩溃;社区独立对照测得 60 条通过、71 条崩溃)。
快速复现:
%APPDATA%\@deepseek-ai\dsh-desktop\Network\Cookies(Windows),向cookies表插入约 70 行记录:host_key='127.0.0.1'、name各不相同且以dsh-auth-为前缀(模拟历史堆积),其余字段取任意合法值;观察证据:以
DeepSeek Harness.exe --log-net-log=netlog.json启动,netlog 中可看到:当前行为
host 下发的认证 cookie(实测抓包):
value 解码后为
{"version":1,"authority":"127.0.0.1:50629","issuedAt":…,"expiresAt":…}—— authority 已在 value 中,名字里再哈希一次端口纯属冗余,却带来了"每次启动新增一个 cookie"的副作用。崩溃时统计持久库:共 71 个 cookie,全部是
dsh-auth-*,71 个名字互不相同,平均每个在请求头中占 ~228 字节,Cookie头合计 16186 字节,加上 Host/UA 等其余头后超过 16384(Node 默认max-http-header-size)。Electron 主进程启动流程
connectDesktopWelcome(lib/main.js:8886)对该请求只检查response.ok,收到 431 即抛错,桌面端进入崩溃弹窗:自增强:即使最终 431,首个 303 响应携带的新
set-cookie已写入持久库,所以每次失败重试(崩溃弹窗 Restart、手动重开、第三方重启工具)都会使堆积 +1,问题不可逆。期望行为
启动流程不应受历史 cookie 累积影响,认证 cookie 不应无界堆积。建议任选其一(均可根治):
Max-Age/Expires):该 cookie 只需存活单次运行——渲染进程对 host 的所有请求都经主进程转发并手动附带 cookie 头(set-cookie本就对 renderer 屏蔽),不依赖持久 jar;每次启动 ready.url 都带新 token 重新认证。此项改动最小。dsh-auth):Chromium cookie 按 host 存储、本就不区分端口,固定名每次启动会被重签的 cookie 自然覆盖;实测带不带 cookie 访问?token=均返回 303 + 新 cookie,旧 authority 残留值不会造成 401。connectDesktopWelcome之前清理同 origin 下dsh-auth-*前缀的残留 cookie。临时解决(供社区参考):完全退出 dsh 后用 SQLite 工具打开上述 Cookies 库执行
DELETE FROM cookies WHERE name LIKE 'dsh-auth-%';。已有相关讨论(供去重合并)
同一根因(按报告时间排序;均已确认、暂未修复、暂无官方成员回应):
host:portdsh-auth-*撑爆 Host 头限制(431)…\Network\Cookies)与去 token 边界实测相关症状、不同根因(排查时注意区分):
All reactions