编号:H-01 严重级:medium 工作线:管理后端(internal/admin) 来源:审查 A-13、P-17 依赖:无 被依赖:无
两份审查结论一致:后台默认与端共用公网端口,/api/admin/login 无需登录即可访问,而 httpx.DecodeJSON 不限大小,http.Server 只设了 ReadHeaderTimeout。统一方案:
/api/admin/login
httpx.DecodeJSON
http.Server
ReadHeaderTimeout
http.MaxBytesReader(nil, r.Body, 1<<20)
admin.Handler.ServeHTTP
http.NewResponseController(w).SetReadDeadline
ReadTimeout
internal/httpx/json.go、internal/admin/handler.go、endpoints_csv.go。
internal/httpx/json.go
internal/admin/handler.go
endpoints_csv.go
json.go
handler.go
DecodeJSON
以下是本次复审各区审查报告的原文段落。A、M、I、P、S 开头的是原始发现编号(A 管理后台与网页、M 消息核心、I 身份认证群在线、P 传输平台部署、S SDK)。解决方案以本 issue 上方的"结论与统一方案"为准;原文里的方案与之不一致时,按上方执行。
LimitReader
internal/httpx/json.go:49-61
login.go:33-40
listener/server.go:122-125,156-159
identity/register.go:23
endpoints_csv.go:94,106
r.Body = http.MaxBytesReader(w, r.Body, n)
http.NewResponseController(w).SetReadDeadline(...)
internal/admin/endpoints_csv.go
MaxBytesReader
httpx/json.go:49-61
admin/login.go:33-40
identity/register.go:104
复审基线:main 4059a15(2026-09-30)。编号说明、各工作线的合并顺序、共享文件归属见总览 #7。
4059a15
已合入 origin/main 0c9b459。落地提交 1a4bf6f fix: 限制管理接口请求体大小与读取时间 (#44)。
0c9b459
1a4bf6f
No dependencies set.
The note is not visible to the blocked user.
编号:H-01 严重级:medium 工作线:管理后端(internal/admin) 来源:审查 A-13、P-17
依赖:无 被依赖:无
结论与统一方案
两份审查结论一致:后台默认与端共用公网端口,
/api/admin/login无需登录即可访问,而httpx.DecodeJSON不限大小,http.Server只设了ReadHeaderTimeout。统一方案:httpx.DecodeJSON内部改用http.MaxBytesReader(nil, r.Body, 1<<20),函数签名不变,覆盖所有 JSON 接口。(审查 P-17)admin.Handler.ServeHTTP按路由设置请求体上限(登录可以更小,导入 8 MiB)与读取截止时间(http.NewResponseController(w).SetReadDeadline),超限返回 413 JSON;CSV 导入超过 8 MiB 返回 413,不再静默截断。(审查 A-13)ReadTimeout,会误伤劫持后的 WebSocket(见 L-01)。改动文件
internal/httpx/json.go、internal/admin/handler.go、endpoints_csv.go。与其他问题的交互 / 冲突说明
json.go只有本条修改。handler.go与 H-02(审计 logger 注入)相邻,endpoints_csv.go与 H-04 相邻,管理后端线内顺序合入。验收与测试
DecodeJSON返回错误。问题明细(各区审查原文,证据含文件与行号)
[A-13] 管理接口请求体大小和读取时间不受限制,公开的登录接口可被打爆内存
/api/admin/login不需要登录。DecodeJSON不限大小,传一个 GB 级的 JSON 字符串就能耗尽内存。http.Server只设了ReadHeaderTimeout,慢速发送请求体可以长期占住连接。LimitReader在 8 MiB 处静默截断,而不是报错。internal/httpx/json.go:49-61。login.go:33-40。listener/server.go:122-125,156-159。identity/register.go:23(4 KiB)。endpoints_csv.go:94,106。admin.Handler.ServeHTTP统一处理:r.Body = http.MaxBytesReader(w, r.Body, n),导入 8 MiB,其余 64 KiB,登录可以更小。http.NewResponseController(w).SetReadDeadline(...)限制读请求体的时间,导入可以放宽。ReadTimeout,会误伤劫持后的 WebSocket。internal/admin/handler.go、internal/admin/endpoints_csv.go。[P-17] httpx.DecodeJSON 不限制请求体大小
DecodeJSON直接读整个请求体。后台默认和端共用公网端口,而/api/admin/login不需要登录就能访问。ReadTimeout,还可以慢速上传长期占着连接。注册接口自己加了MaxBytesReader,后台的 JSON 接口都没有。httpx/json.go:49-61;admin/login.go:33-40;identity/register.go:104。DecodeJSON内部改用http.MaxBytesReader(nil, r.Body, 1<<20),函数签名不变。批量开通 1000 行的 JSON 约 200 KiB,1 MiB 留足了余量;CSV 导入有自己单独的读取逻辑,不受影响。internal/httpx/json.goDecodeJSON,返回错误。复审基线:main
4059a15(2026-09-30)。编号说明、各工作线的合并顺序、共享文件归属见总览 #7。已合入 origin/main
0c9b459。落地提交1a4bf6ffix: 限制管理接口请求体大小与读取时间 (#44)。