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

时间:2018-09-27 12:00:13

标签: browser http-headers cross-browser mime-types web-standards

我一直在使用OWASP ZAP进行一些渗透测试,它对所有请求都发出以下警报:X-Content-Type-Options Header Missing

我了解标题,以及为什么推荐它。 this StackOverflow question对此进行了很好的解释。

但是,我发现了各种引用,这些引用表明它仅用于.js和.css文件,并且设置其他MIME类型的标头实际上可能是 bad 的事情:

  • 注意:nosniff仅适用于“脚本”和“样式”类型。还对图像应用nosniff证明与现有网站不兼容。 [1]
  • Firefox在支持图像的nosniff时遇到了问题(Chrome在那里不支持它)。 [2]
  • 注意:现代浏览器仅使用脚本和样式表的标头,而以错误的媒体类型提供服务时发送其他资源(例如图像)的标头可能会在较旧的浏览器中造成问题。 [3]

以上参考文献(及其他参考文献)表明,仅对所有响应设置此标头是不好的,但是尽管遵循了任何具有相关外观的链接并在Google上进行了搜索,但我找不到该论点背后的任何原因。

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

或者,如果没有风险/问题,为什么Mozilla(及其他)暗示存在风险/问题?

3 个答案:

答案 0 :(得分:2)

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(及其他)暗示存在风险/问题?

没有问题。

所描述的问题是有关破坏与现有站点兼容性的风险的问题。 Mozilla的研究表明,由于服务器配置错误,在nosniff标签上强​​制使用<img>选项会破坏很多站点,因此在图像上下文中将忽略标题。

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

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

但是,他们所讨论的问题确实导致了此讨论的重要脚注:

如果您使用的是nosniff标头,请确保您还提供了正确的Content-Type标头!


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

  1. The WhatWG Fetch standard that defines this header.
  2. A discussioncode commitwebhint.io网站检查工具的此标头有关。

答案 1 :(得分:1)

我参加聚会有点晚了,但这是我的2c。

在提供用户生成的内容时,此标头很有意义。因此,人们不会上传实际上包含一些JS代码的.png文件,而是在.png标签中使用该<script>

您不必为您拥有100%控制权的静态文件设置它。

答案 2 :(得分:0)

我会坚持使用js,css,text / html,json和xml。

Google建议将受保护资源提供的不可猜测的CSRF令牌用于其他内容类型。即使用受nosniff标头保护的js资源生成令牌。

您可以将其添加到所有内容中,但这很繁琐,而且如上所述,您可能会遇到兼容性和用户问题。

https://www.chromium.org/Home/chromium-security/corb-for-developers