背景与价值 范围请求可被滥用导致资源耗尽。分片校验与速率治理保障下载体验与系统稳定。 统一规范 - Accept-Ranges:统一声明 `bytes`。 - 分片上限:单片最大(如≤8MB)。 - 速率限制:对频繁范围请求进行限速与审计。 核心实现 Range解析与校验 ```ts type Range = { start: number; end: number } function parseRange(h: string | undefined, size: number): Range | null { const s = (h || '').trim() const m = s.match(/^bytes=(\d*)-(\d*)$/) if (!m) return null let start = m[1] ? Number(m[1]) : 0 let end = m[2] ? Number(m[2]) : size - 1 if (!Number.isFinite(start) || !Number.isFinite(end) || start < 0 || end < start || end >= size) return null return { start, end } } function clamp(r: Range, maxChunk = 8 * 1024 * 1024): Range { const len = r.end - r.start + 1; if (len > maxChunk) return { start: r.start, end: r.start + maxChunk - 1 }; return r } ``` 206响应构建 ```ts type Res = { setHeader: (k: string, v: string) => void; status: (n: number) => Res; end: (b?: any) => void } function send206(res: Res, r: Range, size: number, chunk: Uint8Array) { res.setHeader('Accept-Ranges', 'bytes') res.setHeader('Content-Range', `bytes ${r.start}-${r.end}/${size}`) res.status(206).end(chunk) } ``` 落地建议 - 严格校验Range头并限制分片大小与频率,统一返回206与Accept-Ranges。 验证清单 - Range是否合法且分片未超上限;是否正确下发206/Content-Range。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部