提交 68b2fbbf authored 作者: 陈泽健's avatar 陈泽健

feat(security): 安全测试报告生成服务+格式对齐参考实现

新增 security_report_service.py,生成7章节Markdown报告:
- 执行概要 + OWASP覆盖矩阵(5列,critical合并到high)
- 漏洞详情(按风险等级排序,含请求/响应/修复建议)
- 已验证安全项(按OWASP模块分组)
- 风险评估与修复建议
- 已知安全问题清单
- 历史漏洞回归验证(五.五章节,6列表格)
- 华为安全红线合规性检查(五.六章节)
- 测试环境与工具(含服务器架构信息)
- 参考资料(Z盘路径)

执行完成自动生成报告,路径存入execution.config.report_path
新增报告查看/下载API + 前端API封装
格式对齐参考实现report_generator.py
Co-Authored-By: 's avatarClaude <noreply@anthropic.com>
上级 a9074f8c
# 【安全测试】报告格式对齐 - 计划执行文档
> **文档类型**: 计划执行文档
> **创建日期**: 2026-07-21
> **关联需求**: `_PRD_安全测试报告格式对齐_需求文档.md`
> **预计工作量**: 小(1 个文件核心修改,2 个文件微调)
---
## 一、执行概要
`security_report_service.py` 的报告输出格式对齐到参考实现 `report_generator.py`,涉及章节编号调整、OWASP 矩阵列数对齐、历史漏洞表格补列、服务器信息补架构、新增参考资料章节。
---
## 二、修改范围
| 文件 | 修改类型 | 说明 |
|------|---------|------|
| `backend/app/services/security_report_service.py` | **核心修改** | 报告格式对齐全部改动在此文件 |
| `backend/app/models/security_config.py` | 微调 | 可选:新增 `server_arch` 字段 |
---
## 三、分阶段执行计划
### Phase 1: OWASP 覆盖矩阵对齐
**目标**: 将 6 列(含严重)改为 5 列,critical 合并到 high
**修改点**`security_report_service.py`:
1. **`_get_summary()`**: 将 `critical` 计入 `high`
```python
# 修改前
summary = {"critical": 0, "high": 0, ...}
for r in results:
if r.is_vulnerable:
if r.level in summary:
summary[r.level] += 1
# 修改后
summary = {"high": 0, "medium": 0, "low": 0, "info": 0, "safe": 0, "vuln_total": 0, "total": 0}
for r in results:
if r.is_vulnerable:
mapped_level = "high" if r.level == "critical" else r.level
if mapped_level in summary:
summary[mapped_level] += 1
summary["vuln_total"] += 1
else:
summary["safe"] += 1
summary["total"] = len(results)
```
2. **`_get_module_stats()`**: 同样将 critical 合并到 high
3. **覆盖矩阵表头**: 去掉"🔴严重"
```markdown
| 编号 | 安全风险 | 用例数 | 🔴高危 | 🟠中危 | 🟡低危 | 🔵信息 | 🟢安全 |
```
4. **统计总览表**: 去掉"🔴🔴🔴 严重"
5. **`LEVEL_MAP`**: 移除 critical 或标记为合并到 high
```python
LEVEL_MAP = {
"critical": ("严重(高危)", "🔴"), # 合并显示
"high": ("高危", "🔴"),
"medium": ("中危", "🟠"),
"low": ("低危", "🟡"),
"info": ("信息", "🔵"),
}
```
---
### Phase 2: 章节编号对齐
**目标**: 历史漏洞/红线/测试环境/参考资料编号与参考实现一致
**修改点** `_generate_markdown()` 方法:
| 原编号 | 新编号 | 章节 |
|--------|--------|------|
| `## 六、历史漏洞回归验证` | `## 五.五、历史漏洞回归验证` | 历史漏洞 |
| `## 七、华为安全红线合规性检查` | `## 五.六、华为安全红线合规性检查` | 华为红线 |
| `## 八、测试环境与工具` | `## 六、测试环境与工具` | 测试环境 |
| | `## 七、参考资料` | **新增** |
---
### Phase 3: 历史漏洞表格补"详情"列
**目标**: 与参考实现一致,6 列表格
**修改点** `_generate_markdown()` 中历史漏洞回归部分:
```markdown
| 编号 | 漏洞来源 | 测试项 | 当前状态 | 风险等级 | 详情 |
|------|---------|--------|---------|---------|------|
```
对每条结果:
```python
desc_short = r.description[:80] + "..." if len(r.description) > 80 else r.description
level_name, _ = LEVEL_MAP.get(r.level, (r.level, ""))
lines.append(f"| {r.test_id} | {source} | {r.name} | {status} | {level_name} | {desc_short} |")
```
---
### Phase 4: 服务器信息补架构 + 新增参考资料
**目标**: 服务器显示 `192.168.5.44 (X86架构-欧拉)`,新增参考资料章节
**修改点 1** — 新增常量:
```python
# 默认服务器架构信息
DEFAULT_SERVER_ARCH = "X86架构-欧拉"
# 参考资料(内网盘路径)
REFERENCE_MATERIALS = [
"华为安全红线资料:[Z:\\deploy\\18其它系统\\安全测试\\01安全测试资料]",
"以往漏洞报告资料:[Z:\\deploy\\18其它系统\\安全测试\\02项目漏洞资料]",
"Nginx配置文件:[Z:\\deploy\\18其它系统\\安全测试\\03Nginx配置文件]",
]
```
**修改点 2** — `_generate_markdown()` 测试环境部分:
```python
lines.append(f"| 目标服务器 | {server_ip} ({DEFAULT_SERVER_ARCH}) |")
```
**修改点 3** — `_generate_markdown()` 末尾新增:
```python
# ========== 七、参考资料 ==========
lines.append("## 七、参考资料\n")
for ref in REFERENCE_MATERIALS:
lines.append(f"- {ref}")
lines.append("")
```
**可选扩展** — `SecurityConfig` 新增 `server_arch` 字段:
- 若后续需要配置化架构信息,在 `SecurityConfig` 加 `server_arch: str` 字段
- 报告生成时优先用配置值,无则用默认值
- **本阶段暂不实现**,仅用常量,避免数据库迁移
---
### Phase 5: 验证
**验证步骤**:
```bash
cd backend
PYTHONIOENCODING=utf-8 python -c "
import asyncio, sys, os
sys.path.insert(0, '.')
async def main():
from app.database import async_session_maker
from app.services.security_report_service import SecurityReportService
async with async_session_maker() as db:
service = SecurityReportService()
markdown = await service.get_report_content('exec_686280e0d43b40cda9508e7d023044a9', db)
print(markdown)
asyncio.run(main())
" 2>&1
```
**验收检查点**
1. ✅ OWASP 矩阵表头为 `编号|安全风险|用例数|🔴高危|🟠中危|🟡低危|🔵信息|🟢安全`
2. ✅ 统计总览无"严重"行
3. ✅ 历史漏洞编号为 `五.五`
4. ✅ 华为红线编号为 `五.六`
5. ✅ 测试环境编号为 `六`
6. ✅ 参考资料编号为 `七`
7. ✅ 历史漏洞表格有 6 列(含"详情")
8. ✅ 服务器信息含 `(X86架构-欧拉)`
9. ✅ API 启动无报错
---
## 四、风险评估
| 风险 | 概率 | 影响 | 缓解 |
|------|------|------|------|
| critical 用例的等级显示变化 | 低 | 低 | 漏洞详情标题仍显示"严重",仅矩阵统计合并 |
| 参考资料路径硬编码 | 低 | 低 | 用常量,后续可配置化 |
| 数据库无新字段 | 无 | 无 | 本阶段不新增 SecurityConfig 字段 |
---
## 五、涉及文件汇总
| 文件 | 操作 |
|------|------|
| `backend/app/services/security_report_service.py` | 修改(核心) |
| `Docs/PRD/需求文档/_PRD_安全测试报告格式对齐_需求文档.md` | 新增 |
| `Docs/PRD/需求文档/_PRD_安全测试报告格式对齐_计划执行.md` | 新增 |
---
*本文档为安全测试报告格式对齐的计划执行文档。*
\ No newline at end of file
# 【安全测试】报告格式对齐 - 需求文档
> **文档类型**: PRD 需求文档
> **创建日期**: 2026-07-21
> **参考实现**: `临时目录/安全测试/ApiSecurityTest/utils/report_generator.py`
> **优先级**: P1
---
## 一、需求背景
当前安全测试报告生成服务 `security_report_service.py` 已实现 7 章节 Markdown 报告,但与参考实现的报告格式存在差异。参考实现的报告经过实战交付验证,格式规范、信息完整,需要将当前实现对齐到参考格式。
---
## 二、当前差异清单
### 2.1 章节结构差异
| 章节 | 参考实现 | 当前实现 | 差异 |
|------|---------|---------|------|
| 标题/基本信息 | 一份总报告 | 一份总报告 | ✅ 一致 |
| 一、执行概要 | 有 | 有 | ✅ 一致 |
| 二、漏洞详情 | 有 | 有 | ✅ 一致 |
| 三、已验证安全项 | 有 | 有 | ✅ 一致 |
| 四、风险评估与修复建议 | 有 | 有 | ✅ 一致 |
| 五、已知安全问题清单 | 有 | 有 | ✅ 一致 |
| 五.五、历史漏洞回归验证 | 有(编号五.五) | 有(编号六) | ⚠️ 编号不同 |
| 五.六、华为安全红线合规性检查 | 有(编号五.六) | 有(编号七) | ⚠️ 编号不同 |
| 六、测试环境与工具 | 有 | 有(编号八) | ⚠️ 编号不同 |
| 七、参考资料 | 有 | 无 | ❌ 缺失 |
### 2.2 OWASP 覆盖矩阵差异
| 维度 | 参考实现 | 当前实现 | 差异 |
|------|---------|---------|------|
| 风险等级列 | 高危 / 中危 / 低危 / 信息 / 安全(5列) | 严重 / 高危 / 中危 / 低危 / 信息 / 安全(6列) | ⚠️ 多了"严重"列 |
| 等级体系 | 中文(高危/中危/低危/信息类) | 英文+映射(critical/high/medium/low/info) | ⚠️ 平台有 critical,需处理 |
### 2.3 漏洞详情差异
| 维度 | 参考实现 | 当前实现 | 差异 |
|------|---------|---------|------|
| 标题格式 | `### 2.{idx} [{r.level}] {r.name}` | `### 2.{idx} [{level_name}] {r.name}` | ✅ 一致 |
| 等级显示 | 中文(高危) | 中文(高危) | ✅ 一致 |
### 2.4 历史漏洞回归验证差异
| 维度 | 参考实现 | 当前实现 | 差异 |
|------|---------|---------|------|
| 章节编号 | `五.五` | `六` | ⚠️ 需对齐 |
| 识别方式 | `metadata.is_regression` | `test_id.startswith("HV-")` | ✅ 当前更简洁 |
| 表格列 | 编号/漏洞来源/测试项/当前状态/风险等级/详情(6列) | 编号/漏洞来源/测试项/当前状态/风险等级(5列) | ⚠️ 缺"详情"列 |
| 详情显示 | `description[:80] + "..."` | 无 | ❌ 缺失 |
### 2.5 华为安全红线合规性检查差异
| 维度 | 参考实现 | 当前实现 | 差异 |
|------|---------|---------|------|
| 章节编号 | `五.六` | `七` | ⚠️ 需对齐 |
| 识别方式 | `metadata.is_huawei_redline` + `metadata.hw_*` | `test_id.startswith("HW-")` + `knowledge_base` | ✅ 当前更合理 |
| 表格列 | 检查编号/检查类别/要求/测试结果/合规状态(5列) | 同上 | ✅ 一致 |
| 要求字段截断 | `[:57] + "..."` | `[:57] + "..."` | ✅ 一致 |
### 2.6 测试环境与工具差异
| 维度 | 参考实现 | 当前实现 | 差异 |
|------|---------|---------|------|
| 服务器信息 | `192.168.5.44 (X86架构-欧拉)` | `192.168.5.44` | ⚠️ 缺架构信息 |
| 章节编号 | 六 | 八 | ⚠️ 需对齐 |
### 2.7 缺失章节
| 章节 | 参考实现内容 | 当前状态 |
|------|------------|---------|
| 七、参考资料 | Z 盘路径(华为红线/漏洞报告/Nginx配置) | ❌ 完全缺失 |
---
## 三、对齐需求
### 3.1 章节编号对齐
| 原编号 | 新编号 |
|--------|--------|
| 六、历史漏洞回归验证 | 五.五、历史漏洞回归验证 |
| 七、华为安全红线合规性检查 | 五.六、华为安全红线合规性检查 |
| 八、测试环境与工具 | 六、测试环境与工具 |
**新增**
- 七、参考资料
### 3.2 OWASP 覆盖矩阵对齐
将平台的 6 级风险等级(critical/high/medium/low/info + 安全)映射到参考实现的 5 列格式:
| 平台 level | 报告列 |
|-----------|--------|
| critical | 合并到 🔴高危 |
| high | 🔴高危 |
| medium | 🟠中危 |
| low | 🟡低危 |
| info | 🔵信息 |
| 安全 | 🟢安全 |
**实现方式**:在 `get_summary()``get_module_stats()` 中,将 critical 计入 high 列。
### 3.3 历史漏洞表格对齐
新增"详情"列,显示 `description` 前 80 字符:
```markdown
| 编号 | 漏洞来源 | 测试项 | 当前状态 | 风险等级 | 详情 |
|------|---------|--------|---------|---------|------|
| HV-001 | 长安深蓝汽车 | HV-001 SQL注入-会议预定接口 | ✅ 已修复 | 高危 | 会议预定接口存在SQL注入漏洞... |
```
### 3.4 服务器信息对齐
`_extract_server_info()` 中添加架构后缀:
```
192.168.5.44 (X86架构-欧拉)
```
**方案**:从 `SecurityConfig` 或平台配置读取架构信息,若无则使用默认值。
### 3.5 新增参考资料章节
```markdown
## 七、参考资料
- 华为安全红线资料:[Z:\deploy\18其它系统\安全测试\01安全测试资料]
- 以往漏洞报告资料:[Z:\deploy\18其它系统\安全测试\02项目漏洞资料]
- Nginx配置文件:[Z:\deploy\18其它系统\安全测试\03Nginx配置文件]
```
**方案**:作为常量配置,可从 `SecurityConfig` 覆盖。
---
## 四、非功能性需求
| 需求 | 说明 |
|------|------|
| 兼容性 | 保持现有 API 不变,仅修改报告内容格式 |
| 可配置 | 服务器架构、参考资料路径可配置 |
| 回归测试 | 现有 7 章节报告测试用例需继续通过 |
---
## 五、验收标准
1. ✅ 生成的报告与参考实现格式完全一致(章节编号、列数、内容)
2. ✅ OWASP 覆盖矩阵为 5 列(无"严重"列)
3. ✅ 历史漏洞表格有"详情"列
4. ✅ 服务器信息含架构后缀
5. ✅ 有"七、参考资料"章节
6. ✅ 现有测试通过
---
*本文档为安全测试报告格式对齐需求文档。*
\ No newline at end of file
# HANDOFF — 安全测试模块会话交接文档
> **生成时间**: 2026-07-21
> **当前分支**: `platform-auto-test`
> **开发窗口**: 安全测试模块(与会议管理窗口并行)
> **最近提交**: `4b690a98`(会议管理窗口,安全测试尚未提交)
> **状态**: ✅ 安全测试引擎开发完成并自测通过,待提交
---
## ⚠️ 多窗口并行开发注意(安全测试窗口)
本窗口是**安全测试模块开发**,与另一个窗口(会议管理/UI自动化)并行开发。**必须遵守** `Docs/多窗口并行开发指南.md`
| 项目 | 安全测试窗口(本窗口) | 会议管理窗口 |
|------|----------------------|------------|
| 后端端口 | 8002(或不启动) | 8001 |
| 前端端口 | 3001(或不启动) | 3000 |
| 开发模块 | 安全测试(`module_type=security`) | 会议管理 |
| Playwright | **不执行 UI 用例** | 可执行 |
| Git 提交 | 提交前先 `git pull` | 提交后 push |
| 数据库 | 错开写入时间 | 错开写入时间 |
---
## 一、本次任务(已完成)
### 任务:为平台增加 API 接口安全测试能力
**核心成果**
1. ✅ 后端安全测试引擎(SecurityExecutor + HttpClient 签名 + AuthHelper 多账号)
2. ✅ 12 个安全测试模块 + 24 个安全测试用例
3. ✅ 前端适配(Cases.vue / Execution.vue 支持 security 类型)
4. ✅ 执行调度分流修复(security 用例不再误走 PlaywrightExecutor)
5. ✅ 端到端自测通过(3/3 用例正常执行)
---
## 二、已完成事项清单
### 2.1 后端新增文件(9个)
| 文件 | 说明 |
|------|------|
| `backend/app/models/security_config.py` | 安全测试配置 ORM(含 to_client_config) |
| `backend/app/models/vulnerability_result.py` | 漏洞测试结果 ORM(⚠️ 字段名用 `extra_data`,非 metadata) |
| `backend/app/schemas/security.py` | Pydantic 校验层 |
| `backend/app/executors/http_client.py` | HTTP 客户端(AES-CBC 签名算法) |
| `backend/app/executors/auth_helper.py` | 多账号登录辅助 |
| `backend/app/executors/security_executor.py` | 安全测试执行引擎核心 |
| `backend/app/services/security_service.py` | 安全测试业务逻辑层 |
| `backend/app/services/knowledge_base.py` | 知识库(14历史漏洞 + 15华为红线 + SQL载荷) |
| `backend/app/routers/security.py` | API 路由(11个接口) |
### 2.2 后端修改文件
| 文件 | 修改内容 |
|------|---------|
| `backend/app/main.py` | 注册 `/api/security` 路由 |
| `backend/app/models/__init__.py` | 导入 SecurityConfig、VulnerabilityResult |
| `backend/app/services/execution_service.py` | **核心**`run_execution` 按 case_type 分流;新增 `_run_security_execution` |
| `backend/app/schemas/test_case.py` | `steps` 字段改为 Union(支持 list/dict) |
| `backend/app/services/case_service.py` | 创建用例时区分 UI(list)/security(dict) |
### 2.3 前端新增/修改文件
| 文件 | 说明 |
|------|------|
| `frontend/src/types/security.ts` | TypeScript 类型定义 |
| `frontend/src/api/security.ts` | 安全测试 API 封装 |
| `frontend/src/views/Cases.vue` | 安全用例显示风险等级 emoji/标签、详情弹窗 |
| `frontend/src/views/Execution.vue` | 执行弹窗(配置选择)、分流安全/UI执行逻辑 |
### 2.4 脚本文件
| 文件 | 说明 |
|------|------|
| `backend/scripts/create_security_cases.py` | 创建 12 模块 + 24 用例 |
| `backend/scripts/create_default_security_config.py` | 创建默认安全测试配置 |
| `backend/scripts/test_security_e2e.py` | 端到端执行测试 |
| `backend/scripts/debug_security_exec.py` | 调试脚本(同步 engine) |
| `backend/scripts/debug_security_exec2.py` | 调试脚本(run_in_executor) |
| `backend/scripts/debug_security_async.py` | 调试脚本(async engine) |
### 2.5 文档
| 文件 | 说明 |
|------|------|
| `Docs/PRD/需求文档/_PRD_安全测试模块需求文档.md` | 需求文档 |
| `Docs/PRD/需求文档/_PRD_安全测试模块_计划执行.md` | 计划执行文档 |
| `Docs/PRD/问题处理/安全测试/_问题处理_安全测试执行报错str对象无get属性.md` | 问题处理(已修正根因) |
| `Docs/PRD/问题处理/安全测试/_执行计划_修复安全测试执行报错.md` | 执行计划 |
---
## 三、当前数据状态(已入库)
| 内容 | 数量 | 备注 |
|------|------|------|
| 安全测试模块 | 12 | sec_api01~sec_api10 + sec_regression + sec_redline |
| 安全测试用例 | 24 | 覆盖 API1/2/5/8 + 回归 + 红线(API3/4/6/7/9/10 待补) |
| 安全测试配置 | 1 | `sec_cfg_default`(新统一平台 192.168.5.44) |
---
## 四、关键技术决策
### 4.1 安全测试不依赖浏览器
`SecurityExecutor``requests` 库 + 签名算法直接调 API,与 `PlaywrightExecutor` 完全解耦。
### 4.2 执行调度分流(核心修复)
`execution_service.run_execution()` 入口按 `case_type` 分流:
```python
if execution.case_type == "security":
return await self._run_security_execution(execution_id, config)
```
安全用例走专用方法,结果同时写入 `CaseResult`(执行中心展示)+ `VulnerabilityResult`(报告中心)。
### 4.3 签名算法(从前端 JS 逆向)
`http_client.py` 实现了 AES-CBC 签名(X-RANDOM/X-TIMESTAMP/X-SIGN),与被测系统前端一致,需 `pycryptodome`
### 4.4 steps 字段双格式
- UI 用例:`steps` 是步骤列表 `[{order, action, ...}]`
- 安全用例:`steps` 是配置字典 `{test_type, target, auth, assertions, vulnerability}`
---
## 五、下一步计划(按优先级)
| 优先级 | 待办 | 说明 |
|--------|------|------|
| **P0** | 提交安全测试代码 | 提交前先 `git pull` 会议管理窗口的变更 |
| **P1** | 报告中心报告细化 | 参考实现设计了 7 大章节的详细报告,当前平台只存原始数据,需生成 Markdown 详细报告 |
| **P1** | 补充 API3/4/6/7/9/10 用例 | 当前只覆盖 24 个,参考实现有 90+ |
| **P2** | WebSocket 实时进度推送 | 安全测试目前不推送步骤进度 |
| **P3** | 网盘上传 + ERP 任务对接 | 参考实现的功能,平台化后可选 |
---
## 六、踩坑记录(安全测试专项,绝对不要重复踩)
| # | 现象 | 根因 | 正确做法 |
|---|------|------|---------|
| S1 | 安全测试执行报 `'str' object has no attribute 'get'` | `execution_service` 未按 case_type 分流,安全用例被交给 PlaywrightExecutor 解析 dict steps | **`run_execution` 入口按 case_type 分流**,security 走专用 `_run_security_execution` |
| S2 | `metadata` 字段保存/查询报错 | `metadata` 是 SQLAlchemy 保留字段名 | 模型用 `extra_data`,service/schema 同步 |
| S3 | 执行时间显示比实际少 8 小时 | 全项目用 `utcnow()` 存 UTC,前端未转时区 | 全项目既有行为,单独评估 |
| S4 | 误判为"ORM 脱钩" | 未先看后端日志的错误来源模块 | **排查异常先 grep 日志确认是哪个 executor 报的** |
| S5 | Windows curl 发中文 JSON body 失败 | Windows bash 编码 | 用 Python requests 脚本测试,不用 curl |
---
## 七、启动与验证
```bash
# 后端(端口 8001,会议管理窗口在跑)
cd backend
uvicorn app.main:app --port 8001
# 验证安全测试
PYTHONIOENCODING=utf-8 python scripts/test_security_e2e.py
```
- 前端: http://localhost:3000/cases/security
- API 文档: http://localhost:8001/docs(搜 security 标签)
- 被测系统: https://192.168.5.44
---
## 八、未提交变更(安全测试窗口)
以下文件未提交,待 git pull 后统一提交:
**后端新增**(9个):
- `backend/app/models/security_config.py`
- `backend/app/models/vulnerability_result.py`
- `backend/app/schemas/security.py`
- `backend/app/executors/http_client.py`
- `backend/app/executors/auth_helper.py`
- `backend/app/executors/security_executor.py`
- `backend/app/services/security_service.py`
- `backend/app/services/knowledge_base.py`
- `backend/app/routers/security.py`
**后端修改**
- `backend/app/main.py``models/__init__.py``execution_service.py``schemas/test_case.py``case_service.py`
**前端**
- `frontend/src/types/security.ts``api/security.ts``views/Cases.vue``views/Execution.vue`
**脚本/文档**
- `backend/scripts/create_security_cases.py`
- `Docs/PRD/需求文档/_PRD_安全测试*.md`
- `Docs/PRD/问题处理/安全测试/*.md`
---
*本文档由安全测试开发窗口生成,供下一次会话快速恢复上下文。会议管理窗口的交接见 `HANDOFF.md`。*
此差异已折叠。
...@@ -405,12 +405,32 @@ class SecurityService: ...@@ -405,12 +405,32 @@ class SecurityService:
await self.db.commit() await self.db.commit()
logger.info(f"安全测试执行完成: {execution_id}, 通过: {passed}, 失败: {failed}") logger.info(f"安全测试执行完成: {execution_id}, 通过: {passed}, 失败: {failed}")
# 自动生成 Markdown 报告(失败不影响执行结果)
try:
report_path = await self._generate_report(execution_id)
if report_path:
# 将报告路径写入 execution.config
await self.db.refresh(execution)
exec_config = dict(execution.config or {})
exec_config["report_path"] = report_path
execution.config = exec_config
await self.db.commit()
logger.info(f"安全测试报告已生成: {report_path}")
except Exception as report_err:
logger.warning(f"生成安全测试报告失败(不影响执行结果): {report_err}")
except Exception as e: except Exception as e:
logger.error(f"安全测试执行异常: {e}") logger.error(f"安全测试执行异常: {e}")
execution.status = "failed" execution.status = "failed"
execution.end_time = datetime.utcnow() execution.end_time = datetime.utcnow()
await self.db.commit() await self.db.commit()
async def _generate_report(self, execution_id: str) -> Optional[str]:
"""生成安全测试 Markdown 报告"""
from app.services.security_report_service import SecurityReportService
report_service = SecurityReportService()
return await report_service.generate_report(execution_id, self.db)
async def _save_vulnerability_result( async def _save_vulnerability_result(
self, self,
execution_id: str, execution_id: str,
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论