96 lines
4.0 KiB
Markdown
96 lines
4.0 KiB
Markdown
|
|
# 审计记录 — 批量按钮修复 + 审计日志中文化
|
||
|
|
|
||
|
|
## 审计信息
|
||
|
|
|
||
|
|
- **日期**: 2026-05-27
|
||
|
|
- **审计人**: Claude (AI)
|
||
|
|
- **触发原因**: Bug修复 — 批量安装Agent按钮检测逻辑错误 + 审计日志详情统一中文
|
||
|
|
|
||
|
|
## 审计范围
|
||
|
|
|
||
|
|
| 文件 | 改动 | 状态 |
|
||
|
|
|------|------|------|
|
||
|
|
| web/app/servers.html | hasAgent 从 agent_api_key_set 改为 agent_version | ☑ 已审 |
|
||
|
|
| server/api/auth.py | detail 改中文 | ☑ 已审 |
|
||
|
|
| server/api/servers.py | detail 改中文 | ☑ 已审 |
|
||
|
|
| server/api/scripts.py | detail 改中文 | ☑ 已审 |
|
||
|
|
| server/api/assets.py | detail 改中文 | ☑ 已审 |
|
||
|
|
| server/api/settings.py | detail 改中文 | ☑ 已审 |
|
||
|
|
| server/api/webssh.py | detail 改中文 | ☑ 已审 |
|
||
|
|
| server/api/sync_v2.py | detail 改中文 | ☑ 已审 |
|
||
|
|
| server/api/agent.py | detail 改中文 | ☑ 已审 |
|
||
|
|
| server/background/script_execution_flush.py | detail 改中文 | ☑ 已审 |
|
||
|
|
| web/app/audit.html | 操作/目标类型中文化映射 | ☑ 已审 |
|
||
|
|
|
||
|
|
## 审计8步结果
|
||
|
|
|
||
|
|
### Step 1: 登记 ✅
|
||
|
|
1) servers.html updateBatchBar() hasAgent 判断从 agent_api_key_set 改为 agent_version
|
||
|
|
2) 10个后端文件的 AuditLog detail 字段从英文改为中文
|
||
|
|
3) audit.html 新增 ACTION_NAMES / TARGET_NAMES 映射,操作列和目标列显示中文
|
||
|
|
|
||
|
|
### Step 2: 全文Read ✅
|
||
|
|
逐文件读取确认所有改动点
|
||
|
|
|
||
|
|
### Step 3: 规则扫描H
|
||
|
|
- H1: `hasAgent=!!s.agent_version` — agent_version 由 Agent 心跳写入(agent_version: "2.0.0"),无 Agent 时为 None — ✅ 逻辑正确
|
||
|
|
- H2: `agent_api_key_set` 仅在详情面板的 noKey 检测中保留使用 — ✅ 该处语义正确(检测是否生成了 Key,是安装命令的前提条件)
|
||
|
|
- H3: AuditLog detail 字符串改为中文 — 纯显示文本,用 `textContent` 赋值 — ✅ 无 XSS
|
||
|
|
- H4: ACTION_NAMES / TARGET_NAMES 映射 — 前端 JS 常量,无用户输入 — ✅ 安全
|
||
|
|
- H5: `esc()` 函数对所有审计日志字段做 HTML 转义 — ✅ 无 XSS
|
||
|
|
|
||
|
|
### Step 4: Closure表
|
||
|
|
| H | 判定 | 依据 |
|
||
|
|
|---|------|------|
|
||
|
|
| H1 | ✅ PASS | agent_version 更准确反映实际安装状态 |
|
||
|
|
| H2 | ✅ PASS | agent_api_key_set 在安装命令上下文中语义正确 |
|
||
|
|
| H3 | ✅ PASS | 中文字符串不影响安全性 |
|
||
|
|
| H4 | ✅ PASS | 前端映射是静态常量 |
|
||
|
|
| H5 | ✅ PASS | esc() 函数始终生效 |
|
||
|
|
|
||
|
|
### Step 5: 入口表
|
||
|
|
| 入口 | 类型 | 来源 |
|
||
|
|
|------|------|------|
|
||
|
|
| updateBatchBar 按钮 | JS逻辑 | 服务器列表 API 数据 |
|
||
|
|
| AuditLog detail | 数据库写入 | 后端 API handler |
|
||
|
|
| audit.html 渲染 | DOM渲染 | 审计日志 API 返回 |
|
||
|
|
|
||
|
|
### Step 6: 输入→Sink
|
||
|
|
- `s.agent_version` → 条件判断 → 按钮禁用状态 — ✅ 安全(不经过 DOM)
|
||
|
|
- 中文 detail 字符串 → MySQL → API → `esc()` → DOM — ✅ 安全
|
||
|
|
- `ACTION_NAMES[l.action]` → `esc()` → DOM — ✅ 安全
|
||
|
|
|
||
|
|
### Step 7: 归类
|
||
|
|
```
|
||
|
|
web/app/servers.html ~830行 1H 0FINDING
|
||
|
|
server/api/auth.py ~310行 1H 0FINDING
|
||
|
|
server/api/servers.py ~1100行 1H 0FINDING
|
||
|
|
server/api/scripts.py ~380行 1H 0FINDING
|
||
|
|
server/api/assets.py ~230行 1H 0FINDING
|
||
|
|
server/api/settings.py ~770行 1H 0FINDING
|
||
|
|
server/api/webssh.py ~360行 1H 0FINDING
|
||
|
|
server/api/sync_v2.py ~290行 1H 0FINDING
|
||
|
|
server/api/agent.py ~330行 1H 0FINDING
|
||
|
|
server/background/script_execution_flush.py ~46行 1H 0FINDING
|
||
|
|
web/app/audit.html ~155行 1H 0FINDING
|
||
|
|
────────────────────────────────────────────────────
|
||
|
|
总计 11文件 5H 0FINDING
|
||
|
|
```
|
||
|
|
|
||
|
|
### Step 8: DoD ✅
|
||
|
|
- ❌ 明文密码/密钥暴露? — 否
|
||
|
|
- ❌ 命令注入? — 否
|
||
|
|
- ❌ SQL注入? — 否
|
||
|
|
- ❌ XSS? — 否(全部 esc() 转义)
|
||
|
|
- ❌ 静默吞错? — 否
|
||
|
|
- ❌ 硬编码? — 否
|
||
|
|
- ✅ 所有FINDING已修复? — 0 FINDING
|
||
|
|
|
||
|
|
## FINDING 列表
|
||
|
|
|
||
|
|
无
|
||
|
|
|
||
|
|
## 结论
|
||
|
|
|
||
|
|
☑ 审计通过,0 FINDING,可部署
|