3.9 KiB
3.9 KiB
审计记录: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实体(& < >) |
| 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, '&').replace(/</g, '<').replace(/>/g, '>')做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 ✅
- 所有CUD操作有审计日志
- 所有API端点有JWT保护
- 无硬编码密钥
- 无f-string拼SQL
- 无静默吞错(前端空catch仅用于尺寸为0等已知无害场景)
- XSS防护:v-html内容经HTML转义
- 内置命令不可删除/编辑(is_builtin检查 + 403)
- Pydantic输入验证(长度限制)
FINDING 列表
无
结论
☑ 审计通过,0 FINDING,可部署