我何时应该使用HTTP标头"X-Content-Type-Options:nosniff"

Hap*_*Dog 13 browser cross-browser web-standards http-headers mime-types

我一直在使用OWASP ZAP运行一些渗透测试,并为所有请求提出以下警报:X-Content-Type-Options Header Missing.

我理解标题,以及为什么建议.这个StackOverflow问题很好地解释了它.

但是,我发现各种引用表明它只用于.js和.css文件,并且为其他MIME类型设置标题实际上可能是一件坏事:

  • 注意:nosniff仅适用于"脚本"和"样式"类型.将nosniff应用于图像也证明与现有网站不兼容. [1]
  • Firefox遇到了支持nosniff图像的问题(Chrome不支持它). [2]
  • 注意:现代浏览器仅尊重脚本和样式表的标题,并在使用错误的媒体类型提供其他资源(如图像)时发送标头可能会在旧版浏览器中产生问题. [3]

上面的引用(和其他)表明,简单地为所有响应设置此标题是不好的,但尽管遵循任何相关的链接和在Google上搜索,我找不到任何理由背后这个论点.

什么是与设置相关的风险/问题X-Content-Type-Options: nosniff和为什么要避免的MIME类型比其他text/csstext/javascript

或者,如果没有风险/问题,为什么Mozilla(和其他人)建议有?

Hap*_*Dog 9

Sean Thorburn的回答非常有帮助,并为我指出了一些很好的材料,这就是我授予赏金的原因。但是,我现在做了更多的挖掘,我想我有我需要的答案,结果与肖恩给出的答案相反。

因此,我将回答我自己的问题:

上面的参考文献(和其他参考文献)表明,简单地为所有响应设置此标头是不好的,但是尽管遵循了任何相关的链接并在 Google 上进行了搜索,我还是找不到这个论点背后的任何原因。

这里有一个误解——这不是他们所暗示的。

我在研究过程中发现的资源提到了仅对“脚本和样式类型”尊重的标头,我将其解释为表示作为text/javascripttext/css.

然而,他们实际上指的是加载文件的上下文,而不是它所服务的 MIME 类型。例如,<script><link rel="stylesheet">标签。

鉴于这种解释,一切都会变得更有意义,答案也变得清晰:

您需要为所有文件提供nosniff标题,以降低来自用户内容的注入攻击的风险。

仅提供带有此标头的 CSS/JS 文件是没有意义的,因为这些类型的文件在这种情况下是可以接受的,并且不需要任何额外的嗅探。

但是,对于其他类型的文件,通过禁止嗅探,我们确保在每个上下文中只允许 MIME 类型与预期类型匹配的文件。这降低了恶意脚本隐藏在图像文件(例如)中的风险,这种方式可以绕过上传检查并允许从您的域托管第三方脚本并嵌入到您的站点中。

与设置 X-Content-Type-Options: nosniff 相关的风险/问题是什么?为什么要避免对 text/css 和 text/javascript 以外的 MIME 类型使用它?

或者,如果没有风险/问题,为什么 Mozilla(和其他人)会建议存在风险/问题?

没有问题。

所描述的问题是有关 Web 浏览器nosniff在访问内容时应用规则时破坏与现有站点兼容性的风险的问题。Mozilla 的研究表明,由于服务器配置错误,nosniff<img>标签上强制执行选项会破坏许多站点,因此在图像上下文中会忽略标头。

其他上下文(例如 HTML 页面、下载、字体等)要么不使用嗅探,要么不具有相关风险,要么存在阻止嗅探被禁用的兼容性问题。

因此,他们根本不建议您应该避免使用此标头。

然而,他们谈论的问题确实导致了这次讨论的一个重要脚注:

如果您使用nosniff标题,请确保您也提供正确的Content-Type标题!


一些参考资料,帮助我更全面地理解这一点:

  1. 定义此标头的 WhatWG Fetch 标准。
  2. webhint.io 站点检查工具的此标头相关的讨论代码提交