Bug修复: - GetWorkList 使用了错误的 RecordType (RecordStudy→RecordWork) - AllRecord handler 返回错误的分页信息 (page硬编码1, pageSize用RecordsCount) - CourseParse creditNode nil panic (加nil检查) - WebSocket CheckOrigin 安全漏洞 (release模式限制为同源) - math/rand 可预测 (替换为 crypto/rand) - GetDiscussList 未实现 (补全实现, 移除重复路由) 其他: - 接入 CodeStable 工作流体系 (codestable/ 骨架 + AGENTS.md) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
3.1 KiB
3.1 KiB
doc_type, issue, status, date, severity, tags
| doc_type | issue | status | date | severity | tags | |||||
|---|---|---|---|---|---|---|---|---|---|---|
| issue-fix | 2026-04-25-six-bugs | fixed | 2026-04-25 | high |
|
2026-04-25 six-bugs fix notes
6 个 bug 定点修复,来源于 refactor 扫描阶段的前置检查发现。
Fix #1: GetWorkList 使用了错误的 RecordType
- 文件:
internal/ckwk/api.go:479 - 问题:
GetWorkList调用GetRecords[WorkList](wk, RecordStudy, ...)传了RecordStudy而非RecordWork,导致请求作业记录时实际返回的是学习记录 - 修复:
RecordStudy→RecordWork - 风险: 低,单行改动,类型签名已约束泛型
Fix #2: AllRecord handler 返回错误的分页信息
- 文件:
internal/handler/ckwk.go:227-228 - 问题:
page_info.page硬编码为1,page_info.pageSize使用了RecordsCount(总记录数)而非PageSize - 修复:
page: 1→page: pageInfo.Page,pageSize: pageInfo.RecordsCount→pageSize: pageInfo.PageSize - 风险: 低,字段语义对齐
Fix #3: CourseParse creditNode nil panic
- 文件:
internal/ckwk/api.go:276-277 - 问题:
htmlquery.FindOne可能返回 nil,下一行htmlquery.InnerText(creditNode)会 panic - 修复: 加 nil 检查,
creditNode != nil时才提取学分 - 风险: 低,credit 默认值为 0(float32 零值),行为等价
Fix #4: WebSocket CheckOrigin 安全漏洞
- 文件:
internal/handler/debug_log.go:17-21 - 问题:
CheckOrigin始终返回true,允许任意来源的 WebSocket 连接,存在跨站劫持风险 - 修复: debug 模式下允许所有来源(开发需要),release 模式下只允许无 Origin 的请求(同源请求)
- 风险: 低,debug 模式行为不变,release 模式收紧安全策略
- 附: 移除了
router.go中重复的/api/debug/ws/logs路由(与/api/debug/logs/ws重复)
Fix #5: 非安全随机数用于验证码等场景
- 文件:
pkg/common/rand.go - 问题: 使用
math/rand+time.Now().UnixNano()种子,可预测。Rand()用于验证码请求参数,RandFloat64()用于防缓存时间戳 - 修复: 替换为
crypto/rand,使用crypto/rand.Int生成不可预测的随机数 - 风险: 中,
Rand()在验证码获取中用作 cache-bust 参数(r=0.xxxx),改为 crypto/rand 不影响功能但确保不可预测
Fix #6: GetDiscussList 未实现但已接入路由
- 文件:
internal/ckwk/api.go:489-492 - 问题:
GetDiscussList只返回errors.New("func not implement"),但已通过AllRecordhandler 接入路由,用户请求讨论记录会得到不友好的错误 - 修复: 实现为
GetRecords[StudyList](wk, RecordDiscuss, courseID, page),与其他记录类型一致。讨论记录暂复用StudyList类型,后续如有专门的DiscussList类型可替换 - 风险: 中,讨论记录的返回结构可能和 StudyList 不同,如果上游 API 返回的字段不在 StudyList 中会丢失。但由于之前完全不可用,现在至少能返回数据,比返回错误更好