Skip to content

v0.8.10

Choose a tag to compare

@github-actions github-actions released this 06 Feb 17:22
· 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 接口:

  • HandleConfig
  • HandleShares
  • HandlePrefs
  • HandleProgress(POST)
  • HandleLog
  • HandlePIN

实现要点:

  • 使用标准库 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 对超大请求体返回 413
  • serveSRT 对超大字幕文件返回 413

回归验证:

  • 执行 go test ./... 全量通过

涉及文件

  • internal/handler/handlers.go
  • internal/handler/handlers_safety_test.go

结论

v0.8.10 在保持现有功能与调用方式稳定的前提下,完成了四项关键稳健性提升。改动聚焦、可验证、可回溯,适合直接进入常规发布流程。