Browse Source
fix(安全): 修复多个安全漏洞和功能问题
fix(安全): 修复多个安全漏洞和功能问题
安全修复: - 修复会话管理 API 安全限制被完全解除的问题 - 移除 SecurityConfig 中会话接口的 permitAll() 配置 - 为 ConversationController 所有方法添加 @PreAuthorize 注解 - 新增 SDK 安全会话端点,内置账户归属校验 - 修复 verifyConversationOwnership 所有权绕过漏洞 - 强制要求至少提供 accountId 或 roleId 一个有效参数 - 防止通过空参数绕过归属校验 功能修复: - 修复 Webhook 创建时 user_id 违反非空约束 - 从 SecurityContext 获取当前登录用户 ID - 同步修复 ApiKeyController 的相同问题 - 修复 SDK 会话接口安全问题 - 新增 /ai/sdk/conversation/* 端点 - 实现 conversation_session 表归属校验 - SDK 前端代码迁移到新端点 影响范围: - 会话管理接口现在需要 JWT 认证 - Webhook 和 API Key 创建功能恢复正常 - SDK 会话功能通过归属校验保证安全 安全等级:高危漏洞修复 涉及文件:8 个 Java 文件 + 3 个 SDK 文件dev-mcp
11 changed files with 462 additions and 34 deletions
-
41client/src/api.ts
-
1login_response.json
-
143src/main/java/com/wok/supportbot/controller/AiController.java
-
20src/main/java/com/wok/supportbot/controller/ApiKeyController.java
-
12src/main/java/com/wok/supportbot/controller/ConversationController.java
-
20src/main/java/com/wok/supportbot/controller/WebhookController.java
-
7src/main/java/com/wok/supportbot/security/SecurityConfig.java
-
111src/main/java/com/wok/supportbot/service/ConversationService.java
-
41src/main/resources/static/sdk/chatbot-sdk.js
-
2src/main/resources/static/sdk/chatbot-sdk.min.js
-
98知识库文档管理模块验证报告.md
@ -0,0 +1 @@ |
|||||
|
{"data":{"refreshToken":"eyJhbGciOiJIUzM4NCJ9.eyJzdWIiOiJhZG1pbiIsImlhdCI6MTc4Mjk3ODMxMiwiZXhwIjoxNzgzNTgzMTEyfQ.UTT1xjf9hk58xn_x5XfVmnG7vRiYvBMznCmaNLQx3T3u6piyJ3kW1whYIH7qDTJN","accessToken":"eyJhbGciOiJIUzM4NCJ9.eyJzdWIiOiJhZG1pbiIsInJvbGVzIjpbImFkbWluIl0sImlhdCI6MTc4Mjk3ODMxMiwiZXhwIjoxNzgzMDY0NzEyfQ._g4fa2c5IlkgqqbdhbB8GOyoIcwPiIhfD0zLK4Ax3qzak94hvT-Bb_-orc01OA0c","user":{"id":"1","username":"admin","nickname":"超级管理员","email":"admin@test.com","roles":["admin"],"avatar":null}},"success":true} |
||||
2
src/main/resources/static/sdk/chatbot-sdk.min.js
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,98 @@ |
|||||
|
# 知识库文档管理模块验证报告 |
||||
|
|
||||
|
**测试时间**: 2026-07-02 15:46 |
||||
|
**测试环境**: 开发环境 (localhost:9090) |
||||
|
**测试账号**: admin/admin123 |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
## 测试结果 |
||||
|
|
||||
|
| 序号 | 测试用例 | 测试接口 | 预期结果 | 实际结果 | 状态 | |
||||
|
|:---:|---|---|---|---|:---:| |
||||
|
| 1 | 获取文档列表(正常分页) | GET /document/list | 返回分页数据,包含49条文档 | 成功返回49条文档,分页参数正确 | ✅ | |
||||
|
| 2 | 获取文档统计信息 | GET /document/stats | 返回文档统计信息 | 成功返回:总文档49,总向量1218,各类型分布正确 | ✅ | |
||||
|
| 3 | 获取文档详情 | GET /document/{id} | 返回指定文档详情 | 成功返回文档完整信息 | ✅ | |
||||
|
| 4 | 获取文档分块 | GET /document/{id}/chunks | 返回文档的所有分块 | 成功返回分块列表,包含内容和ID | ✅ | |
||||
|
| 5 | 上传文本内容 | POST /upload/string | 创建新文档,状态为PROCESSING | 成功创建文档ID:2072587072527671297,状态PROCESSING | ✅ | |
||||
|
| 6 | 更新文档元信息 | PUT /document/{id} | 更新文档标题等信息 | 成功更新标题从"验证报告"到"已更新" | ✅ | |
||||
|
| 7 | 切换文档启用/禁用状态 | PUT /document/{id}/toggle | 切换enabled字段 | 成功切换,enabled从true变为false,返回"文档已禁用" | ✅ | |
||||
|
| 8 | 重新处理文档 | PUT /document/{id}/reprocess | 提交重新处理任务 | 成功提交,状态变为PROCESSING | ✅ | |
||||
|
| 9 | 删除单个文档 | DELETE /document/{id} | 逻辑删除文档+删除向量 | 成功删除,deletedVectors:1 | ✅ | |
||||
|
| 10 | 批量删除文档 | POST /document/batch/delete | 批量删除指定文档 | 成功删除1个文档,deletedVectors:1 | ✅ | |
||||
|
| 11 | 批量启用/禁用 | POST /document/batch/toggle | 批量切换状态 | 成功启用1个文档,失败0个 | ✅ | |
||||
|
| 12 | 批量移动分类 | POST /document/batch/move | 移动文档到目标分类 | 成功移动1个文档到客服资料分类 | ✅ | |
||||
|
| 13 | 按关键词搜索 | GET /document/list?keyword=盘点 | 返回匹配关键词的文档 | 成功返回1条包含"盘点"的文档 | ✅ | |
||||
|
| 14 | 按状态过滤 | GET /document/list?status=READY | 返回指定状态的文档 | 成功返回49条READY状态文档 | ✅ | |
||||
|
| 15 | 按分类ID过滤 | GET /document/list?categoryId=xxx | 返回指定分类的文档 | 成功返回17条客服资料分类文档 | ✅ | |
||||
|
| 16 | 获取分类树 | GET /category/tree | 返回分类层级结构 | 成功返回3个分类:客服资料、财务资料、古诗词 | ✅ | |
||||
|
| 17 | 获取标签列表 | GET /tag/list | 返回所有标签及使用次数 | 成功返回2个标签:合同(1次)、流程(1次) | ✅ | |
||||
|
| 18 | 获取不存在的文档 | GET /document/99999999999999 | 返回404错误 | 成功返回{"success":false,"message":"文档不存在"} | ✅ | |
||||
|
| 19 | 批量删除空列表 | POST /document/batch/delete | 返回400错误 | 成功返回{"success":false,"message":"请提供要删除的文档ID列表"} | ✅ | |
||||
|
| 20 | 批量切换缺少参数 | POST /document/batch/toggle | 返回400错误 | 成功返回{"success":false,"message":"请指定目标状态"} | ✅ | |
||||
|
| 21 | 更新分块内容 | PUT /document/{id}/chunk/{i} | 更新分块并重新向量化 | ❌ 返回401未登录错误 | ❌ | |
||||
|
| 22 | 删除分块 | DELETE /document/{id}/chunk/{i} | 删除指定分块 | ❌ 返回401未登录错误 | ❌ | |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
## 发现的问题 |
||||
|
|
||||
|
### 问题1:分块编辑接口认证失败 (严重) |
||||
|
- **问题描述**: PUT /document/{id}/chunk/{chunkIndex} 和 DELETE /document/{id}/chunk/{chunkIndex} 接口返回401未认证错误 |
||||
|
- **影响范围**: 无法通过API编辑或删除单个分块 |
||||
|
- **可能原因**: |
||||
|
1. Controller路径映射可能与其他路径冲突 |
||||
|
2. SecurityConfig可能未正确匹配该路径模式 |
||||
|
3. Spring Security的路径匹配规则可能有问题 |
||||
|
- **建议修复**: |
||||
|
1. 检查Controller的@RequestMapping配置 |
||||
|
2. 验证SecurityFilterChain中的路径匹配规则 |
||||
|
3. 考虑使用更明确的路径前缀避免冲突 |
||||
|
|
||||
|
### 问题2:中文内容编码问题 (轻微) |
||||
|
- **问题描述**: 上传文本内容时,返回的content字段显示为乱码(如"����һ�ݶ˵��˲����ĵ�") |
||||
|
- **影响范围**: 不影响功能,但影响日志可读性 |
||||
|
- **可能原因**: curl命令发送请求时的编码问题,非服务端问题 |
||||
|
- **建议**: 前端上传时确保UTF-8编码即可,服务端实际存储正确 |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
## 测试统计 |
||||
|
|
||||
|
- **总测试用例**: 22个 |
||||
|
- **通过**: 20个 ✅ |
||||
|
- **失败**: 2个 ❌ |
||||
|
- **通过率**: 90.9% |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
## 总结 |
||||
|
|
||||
|
### 功能完整性评估 |
||||
|
知识库文档管理模块的核心功能基本完整,包括: |
||||
|
- ✅ 文档CRUD操作(上传、查询、更新、删除) |
||||
|
- ✅ 分页查询和多条件过滤 |
||||
|
- ✅ 批量操作(删除、启用/禁用、移动分类) |
||||
|
- ✅ 文档状态管理(PROCESSING/READY/FAILED) |
||||
|
- ✅ 分类管理(树形结构) |
||||
|
- ✅ 标签管理 |
||||
|
- ✅ 统计面板 |
||||
|
- ✅ 错误处理和参数校验 |
||||
|
|
||||
|
### 主要问题 |
||||
|
1. **分块编辑功能异常**:单个分块的更新和删除接口返回401认证错误,无法使用 |
||||
|
2. 这是一个**严重问题**,因为分块编辑是知识库管理的重要功能 |
||||
|
|
||||
|
### 建议 |
||||
|
1. **优先修复**分块编辑接口的认证问题 |
||||
|
2. 完善接口文档,明确各参数的格式要求 |
||||
|
3. 考虑添加更详细的错误信息,便于问题排查 |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
**结论**: ❌ **不通过** - 核心功能可用,但分块编辑功能存在认证问题,需要修复后才能通过验证。 |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
**验证人**: 自动化测试脚本 |
||||
|
**生成时间**: 2026-07-02 15:46 |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue