【问题标题】:When should I use HTTP header "X-Content-Type-Options: nosniff"什么时候应该使用 HTTP 标头“X-Content-Type-Options: nosniff”
【发布时间】:2019-03-03 08:11:56
【问题描述】:

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

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

但是,我发现各种参考资料表明它仅用于 .js 和 .css 文件,而为其他 MIME 类型设置标头实际上可能是不好的事情:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 这并不能直接回答这个问题,但是你的描述加上你发布的链接给了我一个很好的洞察力,我想我现在已经掌握了问题是什么,因此这是怎么回事应该处理。我将根据您的信息,对提出的问题写出更直接的答案,但与此同时,这个答案非常值得。谢谢!
    • 谢谢,很高兴能帮上忙!
    【解决方案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(和其他人)建议有?

    没有问题。

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

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

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

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

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


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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 这个回复不直接回答问题,但是很好的次要观点。由于您提到的原因(并在接受的答案中提到)用户生成的内容应该始终是nosniff,但是如果您对静态文件有 100% 的控制权,那么省略它可能会有一些好处,以避免服务器 MIME 出现问题-type 配置不正确。但在实践中,用户生成的内容通常可以作为静态文件提供,因此如果是这种情况,将nosniff 添加到所有请求中可能比试图聪明并可能留下漏洞更安全。
      • @HappyDog 我知道它不会直接回答,但你的问题在如何使用这个标题以及它的用途方面排名在谷歌的顶部 :)
      • 我认为可能是这种情况,但认为值得澄清。获得高排名总是很高兴! :-)
      猜你喜欢
      • 2014-07-31
      • 2016-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-21
      • 1970-01-01
      • 2019-09-13
      • 1970-01-01
      相关资源
      最近更新 更多