Files
012-kaopeilian/TEST_REPORT_2026-01-31.md
yuliang_guo 2f47193059
All checks were successful
continuous-integration/drone/push Build is passing
feat: 集成MinIO对象存储服务
- 新增storage_service.py封装MinIO操作
- 修改upload.py使用storage_service上传文件
- 修改course_service.py使用storage_service删除文件
- 适配preview.py支持从MinIO获取文件
- 适配knowledge_analysis_v2.py支持MinIO存储
- 在config.py添加MinIO配置项
- 添加minio依赖到requirements.txt

支持特性:
- 自动降级到本地存储(MinIO不可用时)
- 保持URL格式兼容(/static/uploads/)
- 文件自动缓存到本地(用于预览和分析)

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-03 14:06:22 +08:00

156 lines
4.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# KPL 考培练系统测试报告
**测试环境**: dev (https://kpl.ireborn.com.cn)
**测试时间**: 2026-01-31
**测试人员**: AI 自动化测试系统
---
## 一、测试概要
| 模块 | 测试用例数 | 通过 | 失败 | 警告 |
|------|-----------|------|------|------|
| 认证模块 | 7 | 5 | 2 | 0 |
| 课程管理 | 7 | 7 | 0 | 0 |
| 成长路径 | 4 | 4 | 0 | 0 |
| 岗位管理 | 2 | 2 | 0 | 0 |
| 考试模块 | 3 | 2 | 1 | 0 |
| AI练习 | 3 | 2 | 0 | 1 |
| 通知系统 | 2 | 2 | 0 | 0 |
| 极端边界 | 8 | 7 | 0 | 1 |
| 安全测试 | 7 | 5 | 0 | 2 |
| **合计** | **43** | **36** | **3** | **4** |
**通过率**: 83.7%
---
## 二、发现的问题
### 严重 (High)
#### 1. 错误密码登录返回200
- **位置**: `POST /api/v1/auth/login`
- **描述**: 使用错误密码登录时返回 HTTP 200应返回 401
- **影响**: 可能导致暴力破解攻击难以被检测
- **建议**: 检查登录逻辑,确保密码错误时返回 401
#### 2. XSS 内容被原样存储
- **位置**: `POST /api/v1/courses` (name, description 字段)
- **描述**: `<script>alert(1)</script>` 等 XSS 代码被原样存入数据库
- **影响**: 潜在的存储型 XSS 攻击风险
- **建议**:
- 输入时转义或过滤 HTML 标签
- 输出时使用 HTML 实体编码
### 中等 (Medium)
#### 3. 不存在用户登录返回422
- **位置**: `POST /api/v1/auth/login`
- **描述**: 登录不存在的用户返回 422应返回 401
- **影响**: 用户枚举风险(可判断用户是否存在)
- **建议**: 统一返回 401 "用户名或密码错误"
#### 4. API 限流未配置
- **位置**: 全局
- **描述**: 10次快速请求未触发限流
- **影响**: 可能被恶意请求攻击
- **建议**: 配置 API 限流中间件
### 低等 (Low)
#### 5. 越权访问返回404而非403
- **位置**: `GET /api/v1/admin/users`
- **描述**: 普通用户访问管理接口返回 404 而非 403
- **影响**: 信息泄露(可探测接口是否存在)
- **建议**: 统一返回 403 Forbidden
#### 6. 部分API端点404
- **位置**:
- `GET /api/v1/exams` (考试列表)
- `GET /api/v1/practice/sessions` (练习记录)
- **描述**: 这些端点返回 404可能是路径变更或未实现
- **建议**: 确认 API 路径或补充实现
---
## 三、测试详情
### 3.1 认证模块测试
| 测试项 | 结果 | 说明 |
|--------|------|------|
| 正常登录 | ✓ PASS | HTTP 200, Token 获取成功 |
| 错误密码登录 | ✗ FAIL | HTTP 200 (应返回401) |
| 不存在用户登录 | ✗ FAIL | HTTP 422 (应返回401) |
| Token验证 | ✓ PASS | HTTP 200 |
| 无效Token访问 | ✓ PASS | HTTP 401 |
| 无Token访问 | ✓ PASS | HTTP 403 |
| 获取用户信息 | ✓ PASS | HTTP 200 |
### 3.2 课程管理测试
| 测试项 | 结果 | 说明 |
|--------|------|------|
| 获取课程列表 | ✓ PASS | 总课程数: 16 |
| 创建课程 | ✓ PASS | HTTP 201 |
| 获取课程详情 | ✓ PASS | HTTP 200 |
| 更新课程 | ✓ PASS | HTTP 200 |
| 获取考试设置 | ✓ PASS | HTTP 200 |
| 更新考试设置 | ✓ PASS | HTTP 200 |
| 获取不存在课程 | ✓ PASS | HTTP 404 |
### 3.3 极端边界测试
| 测试项 | 结果 | 说明 |
|--------|------|------|
| 空名称创建课程 | ✓ PASS | 正确返回 422 |
| 超长名称(1000字符) | ✓ PASS | 正确返回 422 |
| XSS注入 | ⚠ WARN | 内容被原样存储 |
| SQL注入 | ✓ PASS | 注入被防护 |
| 负数分页参数 | ✓ PASS | 正确返回 422 |
| 超大分页(10000) | ✓ PASS | 正确返回 422 |
| Unicode/Emoji | ✓ PASS | 正确处理 |
| 特殊字符 | ✓ PASS | 正确处理 |
### 3.4 安全测试
| 测试项 | 结果 | 说明 |
|--------|------|------|
| 越权访问 | ⚠ WARN | 返回404而非403 |
| 伪造Token | ✓ PASS | 正确拒绝 |
| 过期Token | ✓ PASS | 正确拒绝 |
| 访问他人数据 | ✓ PASS | 访问被限制 |
| 敏感信息泄露 | ✓ PASS | 未泄露密码/Token |
| API限流 | ⚠ INFO | 未触发限流 |
| 目录遍历 | ✓ PASS | 攻击被阻止 |
---
## 四、修复建议优先级
### P0 - 立即修复
1. 修复错误密码登录返回200的问题
2. 添加 XSS 输入过滤/输出编码
### P1 - 尽快修复
3. 统一登录错误响应码为401
4. 配置 API 限流保护
### P2 - 计划修复
5. 越权访问统一返回403
6. 确认并修复404的API端点
---
## 五、测试环境信息
- **后端容器**: kpl-backend-dev
- **数据库**: MySQL 8.0
- **测试账号**: admin / admin123
- **测试时间**: 2026-01-31 10:30 UTC+8
---
*本报告由自动化测试系统生成*