我应该为哪个 Content-Types 设置安全相关的 HTTP 响应 headers?

For which Content-Types should I set security related HTTP response headers?

我已经构建了一个 Web 应用程序(使用我最喜欢的语言 Fantom!),并且正在通过提供行业标准 HTTP 响应来锁定它免受 XSS 和其他此类攻击 header s.

我的问题是,应该为哪些响应设置 header?

我可以为 每个 响应设置 headers,但考虑到大多数请求将针对图像、字体、样式表等,这似乎很浪费。 Content-Security-Policy header 特别是会变得很长。

由于很多 headers 与拥有的 HTML 页面(以及包含在其中的 Javascript)相关,我觉得它们中的大部分只需要设置为HTML 页。

我查看了各种资源,例如:

虽然他们解释了 header 的作用,但他们没有解释应该为哪些资源使用和服务!

我在下面列出了 HTTP 响应 header,我认为 Content-Types 应该使用它们。但是有人知道这是否正确吗?

HTTP Response Header       text/html  All Content-Types
-------------------------  ---------  -----------------
Content-Security-Policy        X
Referrer-Policy                               X
Strict-Transport-Security                     X
X-Content-Type-Options                        X
X-Frame-Options                X
X-XSS-Protection               X

(当我说text/html时我也包括application/xhtml+xml。)

Referrer-Policy 属于所有内容类型,因为 CSS 能够加载字体和图像。

理论上,只有 'active' 个文档应该像 X-XSS-Protection header (related answer here from Info Security) 一样需要它。只要在主文档上设置了政策(即使通过元标记),外部资源应该根据 that 政策被阻止,而不是外部资源上的政策(很容易看到在加载几乎肯定没有您的 CSP 或任何 CSP 设置的 CDN 文件时。

所以我想说你的估计是正确的; text/HTML和XML绝对应该有它,任何可以执行Javascript的东西。对于静态资源应该无关紧要。将根据主文档的 CSP 阻止或允许它们。

我承认,就我个人而言,我只是将它们发送到直接从我的服务器提供的所有资源上,因为我宁愿偏执也不愿搞砸,而且每个请求的几十个字节似乎并没有太大影响,尤其是在一个不满足大量请求的网站上。而且,如果您的网站确实服务于大量请求...通常最好在尝试缩小 headers 之前减少请求。

与类似的事情一样,我一定会测试您的具体实施并尝试加载 CSP 应该阻止的一些资源。您永远不知道浏览器的实现何时可能存在缺陷(或者更常见的是拼写错误或 over/under 急于应用您自己的规则)。

Strict-Transport-Security

在 "HSTS Preload List" 的 deployment recommendations 中声明:

Add the Strict-Transport-Security header to all HTTPS responses

在 apache 中,这看起来像(注意我没有包含 preload 指令,开发人员应该在添加之前先阅读 HSTS 预加载列表的部署建议):

<IfModule mod_headers.c>
    Header always set Strict-Transport-Security "max-age=16070400; includeSubDomains" "expr=%{HTTPS} == 'on'"
</IfModule>


X-XSS-Protection

如果您正在使用 CSP(不允许 'unsafe-inline'),那么您可能不需要再担心 X-XSS-Protection


Content-Security-Policy(一般来说 security-related headers)

作为一般方法,您至少要为所有能够执行脚本的(通用)MIME-Types 添加安全性 headers:


此外,IMO 考虑为所有响应设置严格的 Referrer-Policy。我希望这会有所帮助:)