Repository navigation
v0.8.10
·
133 commits
to 91978769c5b980f38a427ddb75b636d689f8a548
since this release
MSP v0.8.10 变更说明
概述
本版本是一次低侵入、安全优先的后端稳健性优化,重点解决以下问题:
- 多个 API 端点缺少请求体大小限制,存在内存消耗风险
- 媒体列表
limit参数语义不准确,可能误导客户端状态 - 字幕转码路径对超大文本文件缺少保护
- PIN 登录会话 Cookie 在 HTTPS 代理场景下未自动启用
Secure
本次改动仅涉及 internal/handler,不更改路由结构,不引入新依赖,不调整业务模型。
变更目标
- 在不影响既有可用性的前提下,提升接口抗滥用能力
- 保持 API 主体语义和调用方式稳定
- 通过可验证测试覆盖关键行为边界
详细变更
1. 统一 JSON 请求体限流(1 MiB)
新增统一解码入口并用于关键 POST 接口:
HandleConfigHandleSharesHandlePrefsHandleProgress(POST)HandleLogHandlePIN
实现要点:
- 使用标准库
http.MaxBytesReader,不重复造轮子 - 限制值固定为
1 MiB(常量defaultJSONBodyLimit) - 超限返回
413 Request Entity Too Large - 非超限解析错误维持
400语义
收益:
- 避免异常大请求体直接进入 JSON 解码导致内存压力
- 行为统一,后续维护成本更低
2. 修复 limit 截断标记语义
优化函数 applyLimit:
- 之前:
limit > 0即统一标记Limited=true - 现在:仅在任一媒体集合实际发生截断时标记
Limited=true
收益:
- 消除“未截断却标记已截断”的误导
- 让前端状态展示与真实数据保持一致
3. 字幕转换增加大文件保护(8 MiB)
在 serveSRT 与 serveASS 增加文件大小检查:
- 超过
8 MiB(常量maxSubtitleConvertSize)直接返回413 - 保留原有转换逻辑(
SrtToVtt/AssToVtt)不变
收益:
- 降低
io.ReadAll面对异常字幕文件时的内存风险 - 变更面小,不影响常规字幕场景
4. 家庭局域网模式下移除 HTTPS 推断逻辑
调整内容:
- PIN 会话 Cookie 固定
Secure=false - 不再依据
TLS或X-Forwarded-Proto动态切换 - 客户端 IP 固定从
RemoteAddr提取,不再信任X-Forwarded-For/X-Real-IP
收益:
- 行为更符合家庭局域网直连场景
- 配置与运行路径更简单,可预测性更高
影响评估
兼容性
- 路由:无变化
- 请求参数:无变化
- 响应结构:主体保持兼容
- 新增状态码:部分超限场景会由
400提升为413
性能
- 正常流量开销可忽略(一次限长包装与分支判定)
- 在恶意/异常流量下可明显降低内存消耗风险
风险控制
- 仅修改
handler层 - 全部采用 Go 标准库能力
- 不涉及并发模型与数据库结构变更
测试与验证
新增测试文件:
internal/handler/handlers_safety_test.go
新增覆盖点:
applyLimit仅在真实截断时返回true且设置Limited=true- PIN 会话 Cookie 在家庭模式下固定非
Secure HandlePIN对超大请求体返回413serveSRT对超大字幕文件返回413
回归验证:
- 执行
go test ./...全量通过
涉及文件
internal/handler/handlers.gointernal/handler/handlers_safety_test.go
结论
v0.8.10 在保持现有功能与调用方式稳定的前提下,完成了四项关键稳健性提升。改动聚焦、可验证、可回溯,适合直接进入常规发布流程。