MIME 嗅探与 nosniff
浏览器历史上会忽略响应声明的 Content-Type,按内容特征猜测资源类型,于是声明为图片的上传文件可能被当作脚本执行。X-Content-Type-Options: nosniff 让浏览器严格按声明的类型处理,配合正确的 Content-Type,可以降低上传目录被用作脚本执行入口的风险。
基本信息
| 响应头 | X-Content-Type-Options: nosniff |
|---|---|
| 生效范围 | 现代浏览器(IE11 起广泛支持) |
| 配套要求 | Content-Type 必须正确下发 |
| 常见场景 | 上传目录、静态资源、下载文件 |
| 补充措施 | 下载场景加 Content-Disposition: attachment |
典型使用场景
- 全局响应头:在 Web 服务器或应用中间件统一添加,覆盖所有响应
- 上传目录:禁止脚本执行的 location 与 nosniff 一起配置
- 下载接口:强制 attachment,避免浏览器内联渲染
- CDN 与静态资源:确认 CDN 回源时保留了该响应头
- 上线检查:用响应头检查工具核对各类型资源的实际返回值
Nginx 配置
Nginx 配置
add_header X-Content-Type-Options "nosniff" always; # always 保证错误响应也带上
include mime.types; # 依赖正确的类型映射
default_type application/octet-stream; # 未知类型按下载处理
location /uploads/ {
location ~ \.(php|jsp|asp|aspx)$ { deny all; } # 上传目录禁止脚本执行
}其他层配置
其他层配置
Apache:Header set X-Content-Type-Options "nosniff"
IIS:在 HTTP 响应标头中添加 X-Content-Type-Options = nosniff
Node/Express:helmet 的 nosniff 中间件
Java:在过滤器中统一添加响应头
# 下载接口建议同时设置 Content-Disposition: attachment; filename=...相关响应头与作用
| 响应头 | 作用 | 注意点 |
|---|---|---|
| X-Content-Type-Options | 禁止类型嗅探 | 需配合正确 Content-Type |
| Content-Type | 声明资源真实类型 | 配置错误会导致资源无法加载 |
| Content-Disposition | 指定内联或下载 | 下载场景用 attachment |
用户上传的文件在下载场景建议加 Content-Disposition: attachment,避免浏览器内联渲染;这条与 nosniff 配合,能把上传目录的脚本执行面压到最小。
只加 nosniff 而 Content-Type 配置缺失,部分资源会不再执行而是直接下载,容易被误判为兼容性故障:上线前应回归检查各类静态资源的加载情况。
验收检查
- 用 curl -I 查看上传目录与静态资源目录的响应头,确认两类资源都带了该头
- 上传一个扩展名与实际内容不一致的文件,确认浏览器按声明类型处理
- 检查 CDN 回源后的最终响应,而不是只看源站配置