dsh-web-open-access
Removes the login token and the local-network access restriction.
- Stars
- 0
- Language
- JavaScript
- Created
- Sep 6, 2026
- Updated
- Sep 6, 2026
Introduction
dsh-web-open-access
DSH 插件:放开 dsh web 的认证限制, 和 0.0.0.0 的远程访问限制。
- 🔓 认证放开:删除启动 token、签名 cookie、
/api的 401 与 403 Host/Origin 信任篱笆,启动行不再打印?token=; - 🖥️ 远程 == localhost:浏览器端强制"页面拥有本机"语义,解除
isLoopback门控——远程页面也能使用设置(读写并持久化到宿主)、权限预设、欢迎引导等;
⚠️ 安全警告:安装本插件后认证完全关闭;若再按下文把绑定配成
0.0.0.0,web 界面(可执行 shell/文件工具)对任何能到达该主机的网络可达——完全暴露 RCE。仅限可信网络。 移除插件并重启后恢复出厂安全行为。
结构
dsh-web-open-access/ # 本身即 npm 包 @deepseek-ai/dsh-client-connection
├── package.json # 作为 profile 普通依赖安装(非 bundle 层)
├── lib/
│ ├── index.js # 自包含宿主半身:无认证 connection 服务 + /api 路由 + index 注入 ownsHost
│ └── client.js # 原厂浏览器半身的原样拷贝(与安装版逐字节一致,未修改)
└── README.md
适配版本
本插件针对并验证于 DSH 0.1.2-rc.1(dsh --version 查看):
lib/client.js逐字节取自该版本安装里的@deepseek-ai/dsh-client-connection@0.1.2-rc.1/lib/client.js;lib/index.js按该版本 connection 服务的公开调用面(requestRejection/authorizeIndex/authenticatedUrl/rpc.intercept/fetch.register/createSharedFetchHandler//api路由与 bridge 语义)编写。
同 0.1.x 小版本内大概率可用,但契约以 0.1.2-rc.1 为准。DSH 升级后按文末「重新构建浏览器半身」重新拷贝 lib/client.js,并对照新版核对 lib/index.js 的服务面,再验证(免 token、0.0.0.0、设置可读写)。
绑定配置(dsh web 自身,非插件)
--host 0.0.0.0 被 web-startup 有意拦截(program.error: ... for safety),所以绑定必须走 profile 配置层。在 $DSH_HOME/profiles/web/cordis.patch.yml 追加:
- id: webserver
config:
host: '0.0.0.0'
port: !!js ctx.webStartup.port ?? 3080
compression: gzip
compressionLevel: 1
compressionThresholdBytes: 1024
安装
用 dsh plugin 命令把整个插件目录装进 web profile:
dsh plugin --profile web add github:ya-b/dsh-web-open-access
再把上面的 webserver 配置追加到 $DSH_HOME/profiles/web/cordis.patch.yml(绑定 0.0.0.0,见「绑定配置」)。
安装后重启 dsh web(依赖变动不走 patch 热重载;profile patch 变化在 live 重载范围内)。
验证:
dsh --profile web --dump-config # webserver.host == 0.0.0.0(来自 profile 层)
dsh web # 启动行无 ?token=,并打印 (LAN: http://<ip>:<port>)
ss -ltnp | grep 3080 # 0.0.0.0:3080
# 另一台机器浏览器访问 http://<主机局域网IP>:3080 —— 免密、设置可读写并持久化
卸载
dsh plugin --profile web remove @deepseek-ai/dsh-client-connection
# 并从 $DSH_HOME/profiles/web/cordis.patch.yml 删除 webserver 覆盖(或改回 host: '127.0.0.1')
# 重启后恢复:仅 127.0.0.1 + token/401/403 完整安全行为
为什么这样设计(机制说明)
- 认证:token/cookie/篱笆全部硬编码在
@deepseek-ai/dsh-client-connection,无开关。web 的浏览器模块图(15 个dsh.client.inject边)要求图里存在 id 为@deepseek-ai/dsh-client-connection的条目,所以不能简单换行名——而是同名安装替换包:loader 从 profile 优先解析该名字到我们的包,宿主半身不再认证,浏览器半身仍是原厂 transport。 - 远程 == localhost:
lib/client.js与安装版逐字节一致,不加任何字节。改由宿主半身在webserver/index-inject事件里推一条global行,把<script>globalThis["__DSH_TRANSPORT__"] = {"ownsHost":true}</script>渲染进 index 的<head>;浏览器内核在文档末尾的__DSH_BOOT_READY__后才激活插件,所以该脚本必然先于 Connection 客户端apply执行 →ctx.connection.isLoopback恒为 true,解除设置/持久化/权限预设等"限回环"门控。createWebConnectionRpc(undefined, undefined)回落页面原生 fetch,行为不变。
已知边界
- 版本耦合:本插件适配 DSH
0.1.2-rc.1(见「适配版本」);DSH 升级后需重新构建lib/client.js并核对lib/index.js服务面。 - 目录选择器:绑 0.0.0.0 后
directory-picker-auto自动退回浏览器browse后端(原生 OS 选择器在远程场景不适用),不影响功能。 --host/--trusted-hostflag:--host 0.0.0.0被 web-startup 拒绝;绑定改由 profile 配置决定。认证关闭后--trusted-host亦无意义(篱笆已移除)。