# 【安全测试】报告中心 - 报告设计文档（分析，不写代码）

> **文档类型**: 设计文档（安全测试报告）
> **创建日期**: 2026-07-21
> **参考实现**: `临时目录/安全测试/ApiSecurityTest/utils/report_generator.py`
> **状态**: 设计阶段，未实现

---

## 一、现状分析

### 1.1 当前平台报告中心的问题

平台报告中心（`/reports/security`）目前**只存原始执行数据**（`CaseResult` + `VulnerabilityResult`），展示方式与 UI 测试报告一致：

- 展示执行记录列表 + 用例结果表格
- 每条结果只显示：用例名、状态、耗时、错误信息
- **缺少**：风险等级统计、OWASP 覆盖矩阵、漏洞详情（请求/响应/复现步骤/修复建议）、历史回归验证、华为红线合规检查

### 1.2 参考实现的报告优势

参考实现 `report_generator.py` 生成一份**结构化 Markdown 总报告**，包含 7 大章节，直接可用于交付：

- 执行概要 + OWASP 覆盖矩阵
- 漏洞详情（按风险等级排序，含复现步骤）
- 已验证安全项
- 风险评估与修复建议
- 已知安全问题清单
- 历史漏洞回归验证
- 华为安全红线合规性检查

---

## 二、参考实现的报告结构（详细分析）

### 2.1 报告命名规则

```
{服务器IP}_安全测试报告_{时间戳}.md
例：192.168.5.44_安全测试报告_20260721_143025.md
```

### 2.2 报告章节结构

#### 标题与基本信息
```
# 接口安全测试总报告
> 生成时间：2026-07-21 14:30:25
> 测试目标：https://192.168.5.44
> 测试标准：OWASP API Security Top 10 (2019)
> 测试工具：ApiSecurityTest
```

#### 一、执行概要

**1.1 测试统计总览**（表格）：

| 统计项 | 数值 |
|--------|------|
| 测试用例总数 | 90 |
| 发现漏洞总数 | 20 |
| 🔴 高危漏洞 | 8 |
| 🟠 中危漏洞 | 12 |
| 🟡 低危漏洞 | 0 |
| 🔵 信息类 | 0 |
| 🟢 已验证安全 | 69 |
| 测试时间 | 14:00:00 ~ 14:30:25 |

**1.2 OWASP API Security Top 10 覆盖矩阵**（表格）：

| 编号 | 安全风险 | 用例数 | 🔴高危 | 🟠中危 | 🟡低危 | 🔵信息 | 🟢安全 |
|------|---------|--------|--------|--------|--------|--------|--------|
| API1 | 对象级别授权失效 | 8 | 2 | 1 | 0 | 0 | 5 |
| API2 | 身份认证失效 | 13 | 3 | 4 | 0 | 0 | 6 |
| ... | | | | | | | |
| **合计** | | **90** | **8** | **12** | **0** | **0** | **69** |

> 按模块统计每个 OWASP 类别的漏洞分布，一眼看出哪个类别风险最高。

#### 二、漏洞详情

按风险等级排序（critical > high > medium > low > info），每个漏洞包含：

```markdown
### 2.1 [高危] 水平越权访问其他用户会议详情
- **用例编号**: 2.1.1
- **风险等级**: 🔴 高危
- **漏洞描述**: user 使用 Token 成功访问了 superadmin 的会议详情，存在水平越权漏洞

**复现步骤 — 请求信息：**
请求方法: GET
请求路径: /api/message/getMessageById
查询参数: {"id": "12345"}
使用 Token: user (越权访问 superadmin 的会议 ID: 12345)

**响应信息：**
状态码: 200
响应体: {"code":200,"data":{"id":12345,"title":"管理员会议"...}}

**修复建议**: 在接口中增加用户身份校验，确保用户只能访问自己创建的会议数据
---
```

> 含完整的请求/响应信息，可直接复现漏洞。

#### 三、已验证安全项

按 OWASP 模块分组，展示通过的测试用例：

```markdown
### API1 对象级别授权失效
| 编号 | 测试用例 | 结果 |
|------|---------|------|
| 2.1.5 | 水平越权访问运维集控设备接口 | ✅ 安全 |
| 2.1.6 | 水平越权跨公司数据访问 | ✅ 安全 |
```

#### 四、风险评估与修复建议

按风险等级给出通用修复方案：

```markdown
### 4.1 高危风险（需立即修复）
#### 越权漏洞（API1 / API3）
- 问题描述：普通用户可访问其他用户的数据
- 影响范围：用户数据泄露、数据篡改
- 修复建议：
  1. 后端接口增加严格的资源所有权校验
  2. 实现基于 RBAC 的权限控制
  3. 在 API 网关层增加统一的权限拦截器

#### 身份认证缺陷（API2）
- 问题描述：Token 伪造可用、暴力破解无限制
- 修复建议：
  1. 加强 Token 校验机制
  2. 实现 Token 黑名单机制
  3. 登录接口增加速率限制
  4. 验证码应随机生成
```

#### 五、已知安全问题清单

测试前已确认的问题（非本次测试发现，来自需求文档/抓包）：

| 编号 | 问题描述 | 风险等级 | 来源 |
|------|---------|---------|------|
| KN-01 | 维护平台验证码固定为 csba | 🟠中危 | 需求文档 |
| KN-02 | 登录密码 SHA256 无加盐 | 🟠中危 | 网络抓包 |
| KN-03 | company_secret 明文出现在 URL | 🔴高危 | 网络抓包 |

#### 六、历史漏洞回归验证

基于 35 个历史漏洞报告的回归测试结果：

| 编号 | 漏洞来源 | 测试项 | 当前状态 | 风险等级 |
|------|---------|--------|---------|---------|
| HV-001 | 长安深蓝汽车 | SQL注入-会议预定接口 | ✅ 已修复 | 高危 |
| HV-005 | 南山区委 | Nacos未授权访问 | 🔴 未修复 | 高危 |
| HV-026 | 新统一平台 | NoSQL注入-登录接口 | 🔴 未修复 | 严重 |

#### 七、华为安全红线合规性检查

22 项华为安全红线的合规状态：

| 检查编号 | 检查类别 | 要求 | 测试结果 | 合规状态 |
|---------|---------|------|---------|---------|
| HW-01 | 加密规范 | 密码存储加盐哈希 | SHA256无盐 | 🔴 不合规 |
| HW-06 | 鉴权机制 | 注销后Token立即失效 | Token仍可用 | 🔴 不合规 |
| HW-10 | 配置管理 | Swagger不暴露 | 已拦截 | ✅ 合规 |

---

## 三、平台报告设计方案（待实现）

### 3.1 数据来源

平台已有数据可直接复用，无需新增采集：

| 报告章节 | 数据来源 |
|---------|---------|
| 执行概要 | `VulnerabilityResult` 按 level 统计 |
| OWASP 覆盖矩阵 | `VulnerabilityResult.test_id` 前缀分组 |
| 漏洞详情 | `VulnerabilityResult`（request_info/response_info/fix_suggestion） |
| 已验证安全项 | `VulnerabilityResult` where is_vulnerable=False |
| 历史漏洞回归 | `VulnerabilityResult.extra_data` 标记 is_regression |
| 华为红线检查 | `VulnerabilityResult.extra_data` 标记 is_huawei_redline |
| 已知问题清单 | 知识库 `KNOWN_ISSUES`（静态数据） |

### 3.2 生成时机

安全测试执行完成（`_run_security_execution` 末尾）自动生成 Markdown 报告：
- 路径：`backend/data/reports/{server_ip}_安全测试报告_{timestamp}.md`
- 同时在 `Execution` 记录存储报告路径（`config.report_path`）

### 3.3 后端实现要点

**新增** `backend/app/services/security_report_service.py`（迁移参考实现 `report_generator.py`）：

| 参考实现 | 平台适配 |
|---------|---------|
| `VulnResult` 数据类 | 直接用 `VulnerabilityResult` ORM |
| `config.yaml` 读 target | 从 `SecurityConfig` 读 target_url |
| `KNOWLEDGE_BASE` 常量 | 从 `services/knowledge_base.py` 导入 |
| 独立运行 | 在 `_run_security_execution` 末尾调用 |
| 网盘上传 | 可选，先不做 |

**新增 API**（`routers/security.py`）：
- `GET /api/security/executions/{id}/report` — 返回报告内容（Markdown）
- `GET /api/security/executions/{id}/report/download` — 下载 .md 文件

### 3.4 前端实现要点

**修改** `frontend/src/views/Reports.vue`（或 `views/security/ReportTab.vue`）：

| 区域 | 实现 |
|------|------|
| 报告列表 | 展示安全测试执行记录，点击进入报告详情 |
| 报告预览 | 用 `markdown-it` 渲染 Markdown（需加依赖） |
| 下载按钮 | 调用 download API 下载 .md |

### 3.5 风险等级体系对齐

参考实现用中文等级（高危/中危/低危/信息类），平台用英文（critical/high/medium/low/info）。报告生成时需映射：

| 平台 level | 报告显示 | emoji |
|-----------|---------|-------|
| critical | 严重 | 🔴🔴🔴 |
| high | 高危 | 🔴 |
| medium | 中危 | 🟠 |
| low | 低危 | 🟡 |
| info | 信息 | 🔵 |

---

## 四、实现优先级

| 优先级 | 任务 | 工作量 |
|--------|------|--------|
| P0 | 后端报告生成服务（7章节 Markdown） | 中 |
| P0 | 后端报告查看/下载 API | 小 |
| P1 | 前端报告列表 + Markdown 预览 | 中 |
| P2 | 网盘上传（参考实现功能） | 小 |
| P2 | ERP 任务创建（参考实现功能） | 中 |

---

## 五、与参考实现的差异

| 对比项 | 参考实现 | 平台方案 |
|--------|---------|---------|
| 运行方式 | 独立 Python 脚本 | 集成到平台，执行后自动生成 |
| 报告存储 | 本地 reports/ 目录 | 平台 data/reports/ + DB 记录路径 |
| 数据来源 | 内存 VulnResult 列表 | DB VulnerabilityResult 表 |
| 查看方式 | 打开 .md 文件 | 前端在线预览 + 下载 |
| 网盘/ERP | 有 | 暂不做（可选） |

---

*本文档为安全测试报告的设计分析，待实现时参考。*
