能有效阻止浏览器擅自“猜”资源类型,强制按服务器声明的Content-Type解析文件;它通过禁用MIME嗅探防范MIME混淆和XSS,要求script仅加载白名单JS类型、link仅加载text/css,并需在Nginx中正确配置add_header X-Content-Type-Options nosniff且避免覆盖。

直接设置 add_header X-Content-Type-Options nosniff 能有效阻止浏览器擅自“猜”资源类型,强制它只按服务器声明的 Content-Type 解析文件——这是防范 MIME 类型混淆和 XSS 的关键一步。
为什么这个 header 能增强加载安全
浏览器默认会对某些响应做 MIME 嗅探(比如把一个 text/plain 响应误判为 text/javascript 并执行),攻击者可能借此上传伪装成图片或文本的恶意脚本。启用 nosniff 后:
- script 标签只加载符合白名单 MIME 类型的资源(如
text/javascript、application/javascript等) - link 标签引入的样式表也必须是
text/css,否则被拒绝 - 浏览器不再尝试从文件内容中“反推”类型,彻底切断这类绕过路径
Nginx 中正确配置 add_header
在 server 或 location 块内添加即可,注意两点:不能写错值,且需确保不被子配置覆盖:
- 写法必须是
add_header X-Content-Type-Options nosniff;(无引号、无空格、全小写) - 避免在多个 location 中重复添加,否则可能因 Nginx 的 header 合并规则导致失效
- 若使用 proxy_pass,需确认后端未覆盖该 header;必要时加
proxy_hide_header X-Content-Type-Options;再由 Nginx 重写
哪些资源特别需要它
并非所有响应都同等敏感,以下几类务必启用:
- 用户可上传的静态资源(头像、附件、富文本中的图片等)
- 动态生成的 JSON/JSONP 接口(尤其旧系统仍用
<script></script>加载时) - CSS 和 JS 文件托管在 CDN 或静态目录下,且 Content-Type 依赖自动推断
- 任何可能返回
text/plain或application/octet-stream却实际含可执行内容的接口
常见踩坑与验证方法
配置后别急着上线,先检查是否真正生效:
- 用
curl -I https://yoursite.com/some.js查看响应头中是否含X-Content-Type-Options: nosniff - 在 Chrome 开发者工具 Network 面板里点开一个 JS 请求,确认 Response Headers 区域有该字段
- 故意把一个 JS 文件的
Content-Type改为text/plain,再用<script src="..."></script>加载——启用后应报错“Refused to execute script”,未启用则可能静默执行 - 注意 IE 和旧版 Edge 对
nosniff更严格,而部分安卓 WebView 表现不一,建议搭配Content-Security-Policy使用

















