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