关闭 MIME 嗅探
浏览器历史上会「猜」内容类型:即使服务端声明是 image/jpeg,只要字节看起来像 HTML,某些场景下仍会按 HTML 执行。X-Content-Type-Options: nosniff 明确禁止这种嗅探,让浏览器严格按 Content-Type 处理。它能阻断「把 HTML 或脚本伪装成图片上传,再诱导用户直接访问」这类攻击。
基本信息
| 方向 | 响应头 |
|---|---|
| 取值 | 只有 nosniff 一个有效值,写其它值等于没写 |
| 规范 | WHATWG Fetch 标准定义了 nosniff 行为,非 RFC 头 |
| 推荐范围 | 全站,尤其上传目录与静态资源域 |
| 配套头 | X-Frame-Options、CSP、HSTS、Referrer-Policy 一起配更完整 |
相关安全响应头
| 头 | 作用 | 推荐值 |
|---|---|---|
| X-Content-Type-Options | 禁止 MIME 嗅探 | nosniff |
| X-Frame-Options | 禁止被 iframe 嵌套 | SAMEORIGIN 或 DENY |
| Content-Security-Policy | 限制脚本与资源来源 | 按业务白名单 |
| Strict-Transport-Security | 强制后续走 HTTPS | max-age 至少 6 个月 |
| Referrer-Policy | 控制 Referer 外发粒度 | strict-origin-when-cross-origin |
Nginx 全站添加
Nginx 全站添加
# 放在 server 或 http 段,always 保证错误响应也带该头
add_header X-Content-Type-Options nosniff always;
add_header X-Frame-Options SAMEORIGIN always;
# 校验
curl -sI https://example.com/ | grep -i x-content-type-options典型使用场景
- 上传目录:用户上传的图片里藏 HTML 时,浏览器不会把它当页面执行
- 静态资源域:避免旧的兼容嗅探行为导致资源类型判断出错
- 安全基线检查:等保与常规安全扫描都把该头列为必查项
- 排查「下载的文件被当页面打开」:确认响应头是否带 nosniff
上传目录尤其需要这个头:即使上传做了扩展名与内容校验,历史文件或绕过校验的文件仍可能存在,响应头是最后一道防线。
加头时要留意 Nginx 的 add_header 继承规则:子级 location 里若再写 add_header,父级设置会被覆盖,最终可能只剩一条头;用 include 统一维护更稳妥。
自检时不要只看首页:用 curl -sI 分别抽查 HTML 页面、静态资源、上传文件与错误页四类路径,确认该头在每个分支都返回;错误页最常漏配。