x-content-type-options是http响应头,非html5属性,必须由服务器设置为“nosniff”,强制浏览器严格遵循content-type,禁用mime嗅探,防止类型混淆攻击。

X-Content-Type-Options 不是 HTML5 的属性,而是 HTTP 响应头,不能通过 HTML 标签或 meta 元素设置。它必须由服务器在返回响应时添加,作用是告诉浏览器:别猜文件类型,严格按 Content-Type 头声明的 MIME 类型处理资源。
为什么文本文件会被误当脚本执行
某些旧版浏览器(如 IE8–、旧版 Edge)在遇到 Content-Type 错误或缺失时,会启用 MIME 嗅探(MIME sniffing)——即读取文件前几个字节(魔数)来“猜测”真实类型。例如:
- 一个纯文本文件(
data.txt)被错误设为Content-Type: text/plain,但内容含<script></script>标签; - 攻击者诱导页面用
<script src="data.txt"></script>加载它; - text/plain,当作 JavaScript 执行——触发 XSS。
正确设置 X-Content-Type-Options:nosniff
该响应头需由 Web 服务器(如 Nginx、Apache)或后端应用(如 PHP、Node.js)在发回 HTML、CSS、JS、JSON 等静态或动态资源时统一注入:
-
Nginx 配置示例(推荐放在
http或server块中):add_header X-Content-Type-Options "nosniff" always; -
PHP 脚本开头:
header("X-Content-Type-Options: nosniff"); -
Node.js(Express):
app.use((req, res, next) => { res.setHeader("X-Content-Type-Options", "nosniff"); next(); });
注意:always 参数(Nginx)确保对 2xx/3xx/4xx 响应都生效;未加此参数时,重定向(302)等响应可能不携带该头。
配合正确的 Content-Type 才真正有效
X-Content-Type-Options: nosniff 只是“禁止猜测”,它不会修正错误的类型。若服务器把 JS 文件发成 text/plain,加上该头后,浏览器会直接拒绝执行(报错:*Refused to execute script from ... because its MIME type ('text/plain') is not executable.*)。
所以务必同步确保:
- HTML 文件响应头含
Content-Type: text/html; charset=utf-8; - JS 文件响应头是
application/javascript或text/javascript; - CSS 文件是
text/css; - 用户上传的文本文件(如 .txt)也明确设为
text/plain,并避免被<script></script>标签引用。
前端能做的补充防护
虽然 HTML 本身无法设置该头,但可减少风险暴露面:
- 不用
<script src="user-file.txt"></script>动态加载不可信文件; - 对用户上传内容,服务端校验文件魔数(如读前 4 字节),并强制指定安全的 Content-Type;
- 结合 CSP(
script-src 'self')进一步限制脚本来源,形成纵深防御。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











