dsh-api-runner 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +35 -4
- package/client/client.js +673 -329
- package/package.json +6 -4
- package/scripts/check-leak.mjs +150 -0
- package/src/db.js +543 -37
- package/src/main.js +77 -13
- package/src/ops.js +46 -8
- package/test/client.mjs +41 -2
- package/test/db.mjs +190 -24
- package/test/plugin.mjs +76 -50
- package/test/security.mjs +200 -0
package/README.md
CHANGED
|
@@ -44,7 +44,7 @@ DSH 插件:把「后端接口清单」「本地服务启停」「日志增量
|
|
|
44
44
|
dsh plugin --profile web add dsh-api-runner
|
|
45
45
|
```
|
|
46
46
|
|
|
47
|
-
npm 上已发布 `dsh-api-runner@0.3.
|
|
47
|
+
npm 上已发布 `dsh-api-runner@0.3.1`,这条是推荐路径,也是 DSH「插件中心」里一键安装的形式。
|
|
48
48
|
|
|
49
49
|
### 从 GitHub 源码安装
|
|
50
50
|
|
|
@@ -77,6 +77,23 @@ DSH 会把仓库 clone 到 profile 的 `node_modules` 下。写成带包名的
|
|
|
77
77
|
|
|
78
78
|
数据本身不用迁移:之前被抹掉的 `query` 需要你重新填一次(或从 YAML 恢复)。
|
|
79
79
|
|
|
80
|
+
### 从 0.3.0 升级到 0.3.1
|
|
81
|
+
|
|
82
|
+
0.3.1 加了**按项目的数据库授权**和一批修复,**需要硬刷新页面**:
|
|
83
|
+
|
|
84
|
+
1. **数据库默认拒绝访问**。连接创建后处于「未授权」状态,必须到「数据库 → 项目授权」里
|
|
85
|
+
给当前项目授权(未授权 / 只读 / 读写)。未授权的连接模型完全看不见,也查不了。
|
|
86
|
+
2. **模型侧永远只读**。即使授权了「读写」,工具调用也只允许查询语句;
|
|
87
|
+
写数据只能在面板里由人操作。
|
|
88
|
+
3. **毁灭性操作一律拒绝**:`DROP` / `TRUNCATE` / 无 `WHERE` 的 `DELETE` 和 `UPDATE`,
|
|
89
|
+
即使有读写权限也拦。请到数据库客户端人工处理。
|
|
90
|
+
4. **修复**:编辑连接后点「测试」会报「连接池别名已存在」(达梦);试连没有超时上限,
|
|
91
|
+
最长要等 60 秒且期间其它按钮不可点。现在试连 15 秒超时,且只锁「测试」按钮。
|
|
92
|
+
5. **面板 UI 重做**:统一配色分层、圆角、阴影;响应查看的切换条与一级标题胶囊彻底分开命名。
|
|
93
|
+
6. **支持 URL 直连**:连接可填整条 URL(如 `dm://user:pass@host:5236`),密码加密保存、界面只显示打码。
|
|
94
|
+
|
|
95
|
+
升级后你之前建的连接会变成「未授权」,需要到「项目授权」里点一下「只读」或「读写」。
|
|
96
|
+
|
|
80
97
|
### 从 0.2.x 升级到 0.3.0
|
|
81
98
|
|
|
82
99
|
0.3.0 新增数据库能力,**需要硬刷新页面**,且有两个注意点:
|
|
@@ -389,22 +406,36 @@ action=db, db_action=query, connection_id=<id>, sql="SELECT * FROM t WHERE id =
|
|
|
389
406
|
|
|
390
407
|
### 安全设计
|
|
391
408
|
|
|
409
|
+
**四层防线,任何一层不通过就拒绝。**
|
|
410
|
+
|
|
411
|
+
| 层 | 项 | 做法 |
|
|
412
|
+
| --- | --- | --- |
|
|
413
|
+
| 1 | 项目授权 | **默认拒绝**。连接创建后是「未授权」,必须到面板「项目授权」里给当前工作空间授权(未授权 / 只读 / 读写)。未授权的连接模型完全看不见(连 `describe` 都不列出),也查不了 |
|
|
414
|
+
| 2 | 模型侧只读 | 工具调用**固定** `readonly: true`,不接受参数里的 `db_readonly=false`。模型无论怎么构造参数都写不了数据——写操作只能由人在面板里做 |
|
|
415
|
+
| 3 | SQL 性质 | 全串扫描(剔除字符串与注释)拦危险关键字;识别 `WITH ... DELETE`、`FOR UPDATE`、`INTO OUTFILE`、`load_file()`;`PRAGMA` 区分只读与赋值式;多语句一律拒绝 |
|
|
416
|
+
| 4 | 毁灭性操作 | 即使有读写授权,`DROP` / `TRUNCATE` / 无 `WHERE` 的 `DELETE` 和 `UPDATE` / `GRANT` / `REVOKE` 仍一律拒绝 |
|
|
417
|
+
|
|
418
|
+
其余:
|
|
419
|
+
|
|
392
420
|
| 项 | 做法 |
|
|
393
421
|
| --- | --- |
|
|
394
422
|
| 密码存储 | AES-256-GCM 加密,密钥由机器特征派生。**落盘文件与任何返回值里都没有明文**,列表只给掩码 |
|
|
423
|
+
| URL 模式 | 整条连接串加密保存,界面回显打码成 `dm://user:***@host:port` |
|
|
395
424
|
| SQL 注入 | 一律参数化(`?` / `$1` / `:1`),`db_params` 传值,**不要拼字符串** |
|
|
396
425
|
| 多语句 | 只允许单条。用「跳过字符串/注释」的扫描判断,所以 `WHERE note = 'a;b'` 不会被误判 |
|
|
397
|
-
|
|
|
398
|
-
| 超时 | 默认 30s,超时报错而不是卡死 |
|
|
426
|
+
| 超时 | 查询默认 30s;**试连 15s**(交互动作,不能等驱动自己卡 60 秒) |
|
|
399
427
|
| 结果集 | 默认上限 1000 行,超出截断并提示真实总行数 |
|
|
400
428
|
| 错误信息 | 驱动异常会抹掉 `password=xxx` 和 `://user:pass@` 这类片段再返回 |
|
|
429
|
+
| 信息探测 | 未授权时统一返回 `NOT_AUTHORIZED`,不暴露「某个连接 id 是否存在」 |
|
|
430
|
+
|
|
431
|
+
> 想看这些规则的实际测试,见 `test/security.mjs`(60 项,覆盖 14 种只读语句、27 种写操作、7 种毁灭性操作)。
|
|
401
432
|
|
|
402
433
|
### 已知限制
|
|
403
434
|
|
|
404
435
|
- **SQLite 是同步驱动**(`node:sqlite` 的 `DatabaseSync`):超大结果集会阻塞事件循环。行数上限(默认 1000)能挡住大部分场景。
|
|
405
436
|
- **`oracledb` 是原生模块**:如果 Node ABI 不匹配会加载失败,此时该类型连接报错,但其它类型不受影响。确实需要时再单独装并验证。
|
|
406
437
|
- **达梦(dmdb)已知问题**:连接失败后它自己的池清理会抛 `TypeError: ... reading 'log'`(未捕获异步异常)。插件已加防护拦掉这个精确签名,不会带崩宿主;但连接失败本身仍会正常报错。
|
|
407
|
-
-
|
|
438
|
+
- 连接配置是**跨项目**的(同一套库常被多个项目共用),但**访问权按项目隔离**——授权只对授权的那个项目生效。
|
|
408
439
|
|
|
409
440
|
## HTTP 接口
|
|
410
441
|
|