什么时候应该使用 HTTP header "X-Content-Type-Options: nosniff"

When should I use HTTP header "X-Content-Type-Options: nosniff"

我已经 运行 使用 OWASP ZAP and it raises the following alert for all requests: X-Content-Type-Options Header Missing 进行了一些渗透测试。

我理解 header,以及为什么推荐它。在this Whosebug question.

中解释得很好

但是,我发现各种参考表明它仅用于 .js 和 .css 文件,并且它实际上可能是 不好的 东西为其他 MIME 类型设置 header:

以上参考资料(和其他参考资料)表明简单地为所有响应设置此 header 是不好的,但是尽管跟踪任何 relevant-looking 链接并在 Google 上搜索,我找不到这个论点背后的任何理由。

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

或者,如果没有 risks/problems,为什么 Mozilla(和其他人)建议有?

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

Google 建议使用受保护资源为其他内容类型提供的不可猜测的 CSRF 令牌。即使用受 nosniff header.

保护的 js 资源生成令牌

您可以将它添加到所有内容中,但这会很乏味,而且正如您上面提到的 - 您可能 运行 陷入兼容性和用户问题。

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

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

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

The above references (and others) indicate that it is bad to simply set this header for all responses, but despite following any relevant-looking links and searching on Google, I couldn't find any reason behind this argument.

这里有一个误解 - 这不是他们要表达的意思。

我在研究期间发现的资源提到 header 仅在“脚本和样式类型”方面受到尊重,我将其解释为表示作为 text/javascripttext/css.

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

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

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

只提供 CSS/JS 文件与这个 header 是没有意义的,因为这些类型的文件在这种情况下是可以接受的,不需要任何额外的嗅探。

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

What are the risks/problems associated with setting X-Content-Type-Options: nosniff and why should it be avoided for MIME types other than text/css and text/javascript?

Or, if there are no risks/problems, why are Mozilla (and others) suggesting that there are?

没有问题。

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

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

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

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

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


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

  1. The WhatWG Fetch standard that defines this header.
  2. A discussion and code commit relating to this header for the webhint.io 站点检查工具。

我来晚了一点,但这是我的 2c。

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

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