xbzbing/dsh-password-gate
xbzbing★ 2JavaScript最后同步: 2026-08-14
远程访问开发机使用,这只是一个 dsh 插件的 demo,安全功能只有最简单的频次兜底,切勿直接开放在外网。
README 摘要
dsh-password-gate 为 DeepSeek Harness Web 提供密码登录网关的插件。 dsh web 本身 没有任何认证机制 ——只要能路由到 Web 端口,任何人都可以调用全部 /api RPC(创建 agent、执行 bash、读写文件系统)。本插件在 每一个请求 (HTTP 与 WebSocket,包括直接 POST 到后端接口)之前加一道最小密码门禁。 设计与可行性分析见 docs/PROPOSAL.md。 功能 - 首次打开(尚未设置密码) → 显示"设置密码"页面。设置密码之前,任何功能都不可用。 - 已设置密码 → 显示登录页面。登录成功前,每一个请求都被拦截: - /api/ → 401 - 页面类路径 → 302 /login - WebSocket 升级( /api/events.mux 、 /api/events.host )→ 拒绝连接 - 设置/登录成功 → 直接跳转 dsh 首页( / )。 - 修改密码 → 校验旧密码后更新,并 吊销全部会话 (所有端下线)。 这是真正的服务端门禁,不是仅限前端的 UI 锁:未认证的客户端根本到不了后端。 非安全上下文兼容 :通过 http:// (而非 localhost)访问时,浏览器 Web Crypto 的 crypto.randomUUID 不可用,会导致 dsh 前端报"crypto.randomUUID is not a function"。 插件通过 ctx.webServer.tapIndex() 向每个 index.html 注入基于 crypto.getRandomValues (始终可用)的 polyfill,明文 LAN 部署无需任何额外配置。 工作原理 本插件是标准的 Cordis 插件, 运行在 dsh 进程内 :随 dsh 启动而启动、随 dsh 退出而退出,不需要额外的服务进程,也不 fork 核心。它的 bundle patch 会把真实的 webserver 移到仅回环(loopback)的内部端口,使内部端口无法从远程访问,网关成为唯一入口。 关于转发时的 Host/Origin 改写 :dsh 内部 /api trust fence 的 LAN 信任列表是根据 webserver 的监听地址( 0.0.0.0 )采样的;插件把 webserver 钉在 127.0.0.1 后该列表恒为空,外部地址(LAN IP)的请求会被内部 fence 以 403 拒绝。网关因此在转发时把 Host / Origin 改写为回环地址——安全上成立,因为 fence 的"远程可达性防护"已由网关认证层接管:跨站/DNS-rebinding 请求没有会话 cookie(HttpOnly + SameSite=Strict),在网关层即被拒绝,到不了内…
在 GitHub 查看完整 README →