# 审计记录：TerminalPage全面迭代 + 快捷命令MySQL持久化

## 审计信息

- **日期**: 2026-05-31
- **审计人**: Claude (AI) + 用户确认
- **触发原因**: TerminalPage 25项问题修复 + 快捷命令MySQL持久化 + Shell语法高亮

## 审计范围

| 文件 | 行数 | 状态 |
|------|------|------|
| server/domain/models/__init__.py | 431→447 | ☑ 已审 |
| server/api/terminal.py | 0→168 | ☑ 已审 (新建) |
| server/main.py | 2行新增 | ☑ 已审 |
| frontend/src/pages/TerminalPage.vue | 976→540 | ☑ 已审 (完全重写) |
| frontend/src/pages/LoginPage.vue | 居中+删Logo | ☑ 已审 |

## 审计8步结果

### Step 1: 登记 ✅
commit facc1e8: feat: TerminalPage全面迭代 + 快捷命令MySQL持久化

### Step 2: 全文Read ✅
所有5个文件逐行审读完毕

### Step 3: 规则扫描H

| H# | 规则 | 文件 | 行 | 说明 |
|----|------|------|-----|------|
| H1 | 硬编码密钥 | terminal.py | - | 无命中 |
| H2 | f-string拼SQL | terminal.py | - | 无命中，全用SQLAlchemy ORM |
| H3 | 静默吞错 | terminal.py | - | 无空catch |
| H4 | 未验证输入拼shell | terminal.vue | - | 无shell拼装 |
| H5 | 明文密码前端 | terminal.vue | - | 无密码字段 |
| H6 | XSS | terminal.vue | highlightedCmd | v-html用于Shell高亮，tokenizeShell已转义HTML实体(&amp; &lt; &gt;) |
| H7 | JWT保护 | terminal.py | 全部 | 所有4个端点都有Depends(get_current_admin) |
| H8 | 审计日志 | terminal.py | CUD操作 | POST/PUT/DELETE都有AuditLog记录 |

### Step 4: Closure表

| H# | 判定 | 依据 |
|----|------|------|
| H6 | 安全 | tokenizeShell()函数对每个token值调用`.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')`做HTML转义，用户输入不会注入HTML。关键字列表为硬编码Set，不接受外部输入 |
| H7 | 安全 | 4个路由全部使用`Depends(get_current_admin)`，JWT验证由JwtAuthMiddleware保障 |
| H8 | 安全 | create/update/delete均写AuditLog，包含admin_username、action、target_type、target_id、detail、ip_address |
| H1-H5 | 无命中 | 代码无相关反模式 |

### Step 5: 入口表

| 入口 | 方法 | 认证 | 输入 |
|------|------|------|------|
| /api/terminal/quick-commands | GET | JWT | 无 |
| /api/terminal/quick-commands | POST | JWT | name(str≤100), cmd(str≤500) |
| /api/terminal/quick-commands/{id} | PUT | JWT | name?, cmd? (可选) |
| /api/terminal/quick-commands/{id} | DELETE | JWT | id(int) |

### Step 6: 输入→Sink

- **name/cmd (POST/PUT)**: Pydantic Field验证(min_length=1, max_length=100/500) → SQLAlchemy ORM参数化写入 → 安全
- **id (PUT/DELETE)**: int类型，FastAPI自动校验 → SQLAlchemy ORM参数化查询 → 安全
- **is_builtin保护**: PUT/DELETE均检查`qc.is_builtin`，若为True则返回403 → 安全
- **前端v-html**: highlightedCmd computed属性 → tokenizeShell() → 每token HTML转义 → 安全

### Step 7: 归类

```
server/domain/models/__init__.py  16行新增  0H  0FINDING
server/api/terminal.py            168行     0H  0FINDING
server/main.py                    2行新增   0H  0FINDING
frontend/src/pages/TerminalPage.vue  540行  1H  0FINDING
frontend/src/pages/LoginPage.vue     5行    0H  0FINDING
───────────────────────────────────────────────────────
总计                                1H   0FINDING
```

### Step 8: DoD ✅

- [x] 所有CUD操作有审计日志
- [x] 所有API端点有JWT保护
- [x] 无硬编码密钥
- [x] 无f-string拼SQL
- [x] 无静默吞错（前端空catch仅用于尺寸为0等已知无害场景）
- [x] XSS防护：v-html内容经HTML转义
- [x] 内置命令不可删除/编辑（is_builtin检查 + 403）
- [x] Pydantic输入验证（长度限制）

## FINDING 列表

无

## 结论

☑ 审计通过，0 FINDING，可部署
