标准答案

  1. Content-Type 表示实际文件媒体类型,浏览器据此决定预览、解析或下载行为;服务端应基于可信内容检测或存储元数据,而不是只信用户文件名。
  2. Content-Disposition 控制 inline 预览还是 attachment 下载,并可提供经过正确编码和清理的文件名。
  3. 客户端带 Range 请求时,服务端可返回 206 Partial Content、Content-Range 和 Accept-Ranges,支持续传、视频拖动和分段读取。
  4. 下载接口仍必须在每个 Range 请求上执行认证和授权,不能因为拿到对象路径就绕过访问控制。
  5. 对大文件应使用流式输出并设置合理的缓存、ETag、内容长度和超时策略,避免一次性读入内存。

题目解析

Range 是字节范围协议,不是业务分页。服务端必须校验范围合法、避免异常大范围和多范围请求造成放大开销。

如果可上传内容被浏览器内联解析,错误的 Content-Type 或缺少下载策略可能放大 XSS、内容嗅探和跨域风险。

代码示例

客户端请求部分字节时,响应应明确说明返回的是原文件的哪个范围。

Text
HTTP/1.1 206 Partial Content
Content-Type: video/mp4
Content-Range: bytes 0-1048575/8388608
Accept-Ranges: bytes
Content-Length: 1048576

常见误区

  • 只设置 attachment,却没有处理文件名编码和换行等注入字符。
  • 收到 Range 就直接读取,不校验范围和资源权限。
  • 把整个下载对象读入应用内存再写回响应。

作者信息