必需的HTTP标头

我们的快速客户喜欢操纵HTTP标头。 选择正确的标题组合是您可以采取的最佳措施之一,以确保网站安全并为网站的性能做出重要贡献。

大多数开发人员都知道重要且有用的HTTP标头。 最著名的是Content-TypeContent-Length ,它们几乎是通用标头。 但是最近,诸如Content-Security-PolicyStrict-Transport-Security类的标头已用于提高Strict-Transport-Security ,而Link rel=preload可提高性能。 尽管浏览器广泛支持,但只有少数浏览器使用它们。

上一篇文章中,我们研究了不必要的标题。 现在,让我们弄清楚应该为您的站点配置哪些标头。

家庭作业


Internet上有几种服务可以分析您的站点并建议添加哪些标题。 我查看了Mozilla的securityheaders.ioObservatory,以补充来自Fastly网络的我自己的知识和数据。

您网站上的标题应该是什么


那么服务器响应中的主要标头是什么? 大多数人负责改善安全性:

内容安全策略 。 在浏览器中充当防火墙。 如果您的站点受到威胁,则可以通过阻止与未经批准的主机的连接来帮助限制损坏。 非常重要的标题。 如果没有它,则需要启用它。

推荐人政策 。 调整离开页面时要包括在Referer标头中的详细程度。 帮助防止数据泄漏到链接所在的站点。 强烈推荐。

严格运输安全 。 防止尝试使用常规HTTP连接到站点。 帮助阻止MiTM攻击并提高站点安全性。 也强烈推荐。

X-XSS-Protection 。 防止某些形式的跨站点脚本攻击,如果请求中存在来自相同形式文档的某些标记,则阻止脚本执行。 例如,如果您加载地址为/index.html?foo=<script>alert('foo');</script> <script>alert('foo');</script>的页面,并且页面的源代码中是<script>alert('foo');</script>然后脚本被阻止。 如今,标题已被CSP取代。

X-Content-Type-Options 。 将值设置为nosniff可以防止浏览器执行未设置正确内容类型值的类似JavaScript的内容。 防止MIME混合之类的攻击,最近,Chrome已用于激活网站隔离 。 随着时间的流逝,由于默认情况下浏览器的行为有所改善,它变得不那么重要了,但目前仍是最佳实践之一。

CORS 。 跨域资源共享标头允许您使用其他来源的脚本加载URL。 这是一个可选标题。 此类标题是允许的,而不是禁止的,因此如果没有这些标题,则可以提供最大程度的安全性。

其他是为了表现:

Timing-Allow-Origin 。 使监视工具可以访问请求计时数据。 这在许多方面都是有价值的信息,它可以大大提高Google Analytics(分析)或Speedcurve等分析的质量。

链接rel = preload 。 告知浏览器应该下载的关键资源,即使它们并不需要立即使用。 将标题用于字体和重要的CSS。

服务器定时 提供来自服务器的计时信息,该信息对导航计时API和资源计时API进行补充,其中提供了有关在服务器上完成任务所需的时间的更多详细信息(例如,“我们在MySQL中花费了多少时间”)。 结合RUM Beacon工具非常适合监视性能数据。

让我们仔细看看其中的一些。

内容安全政策:始终遵守


尽管“ Content-Security-Policy是最重要的标题之一,但它也是最冗长的标题之一。 我在HTTPArchive中找到的最大的CSP标头是10K。 十千字节 。 对于单个标头值。 更糟糕的是:尽管可以流式传输响应主体,但是大多数服务器和代理都会对头进行缓冲,并且仅在完成后才进行传输。 HTTP / 2压缩有助于在两次请求之间记住它们,但这并不意味着10KB的标头就可以了。

另外,通过填写答案的第一个数据包,您可以强制浏览器对服务器进行两次调用, 以开始接收内容 。 因此,不仅要考虑删除不必要的标头,还应考虑最大化现有标头。

推荐人政策


自远古时代以来(即大约90年代末以来在网络世界中),浏览器发送(并错误地编写了Referer标头。 在其大部分历史中,这一直是在分析工具中跟踪页面之间的用户移动以及了解传入流量来源的最重要方法之一。 但是,后者与重大的隐私问题相关。 如果我单击来自电子邮件客户端的电子邮件中的链接,则该站点可以确定我的电子邮件域。 更糟糕的是,知道您来自的完整URL(包括请求参数)可能会揭示您上一次搜索查询的字词或个人数据(例如电子邮件地址)。

您可以从可用的Referrer-Policy选项中选择几种策略,但是我通常的建议是“ origin-when-cross-origin”,它为所有常规请求启用Referer,但是如果链接从一个域到另一个域,则仅截断该域的值。 您自己站点中的链接包括完整的引荐来源网址。

CDN Edge服务器上的服务器计时测量


Server-Timing具有许多不错的功能,其中之一是您可以添加多个实例作为响应-所有这些都将在浏览器或RUM工具中组合在一起。 也就是说,如果请求经过CDN中发生的服务器处理的多个阶段,则每个阶段都会添加自己的时间指标,并且它们不会相互冲突。 以下是在快速服务配置中使用VCL将快速度量添加到标头的方法:

 add resp.http.Server-Timing = fastly_info.state {", fastly;desc="Edge time";dur="} time.elapsed.msec; 

该数字包括等待后端所花费的时间,因此在通常情况下,所有服务器时间指标都将小于“快速”数。 但是,如果我们从Fastly缓存中发布文档,您将看到页面生成时的原始时间指标,但是Fastly数字将确认总的时间损失实际上很小。

服务器时间指标可通过JavaScript中的性能对象获得,并显示在Chrome Devtools网络窗格中:



当前,在基本级别上可视化指标。 但是他们正在为此努力,因此将来用户界面可能会大大改善。

添加所有正确的标题。


快速地是添加所有安全性和性能标头的好地方。 下面显示了它们的外观。 在请求流的交付阶段添加以下代码,将值更改为适合您的站点的值( 尝试在没有检查确认值适合您的站点的情况下不要复制和粘贴 ):

 set resp.http.Content-Security-Policy = "default-src 'self'; frame-ancestors 'self'"; set resp.http.Referer-Policy = "origin-when-cross-origin"; set resp.http.Strict-Transport-Security = "max-age=86400"; # Increase when working well in prod (a year is a common final value) set resp.http.X-XSS-Protection = "1; mode=block"; set resp.http.X-Content-Type-Options = "nosniff"; if (req.http.Origin) { # Consider checking this against an allowlist set resp.http.Access-Control-Allow-Origin = req.http.Origin; set resp.http.Access-Control-Allow-Methods = "GET,HEAD,POST,OPTIONS"; } add resp.http.Server-Timing = fastly_info.state {", fastly;desc="Edge time";dur="} time.elapsed.msec; set resp.http.Timing-Allow-Origin = "*"; set resp.http.Link = "</fonts/myfont.otf>; rel=preload; as=font"; 

在下一篇文章中,我们将研究一些最奇特的标头,这些标头开始在浏览器中进行标准化和实现。

Source: https://habr.com/ru/post/zh-CN413205/


All Articles