【问题标题】:Is it fine to use duplicate response header with same value?使用具有相同值的重复响应标头可以吗?
【发布时间】:2018-08-13 06:31:04
【问题描述】:

我发现了一个响应,其中应用程序使用了具有相同值的重复标头。谁能告诉我,这是一种好的编程习惯还是用于安全角度或其他方面?

 HTTP/1.1 200 
 Accept-Ranges: bytes
 Cache-Control: no-cache, must-revalidate, private
 Content-Type: text/html
 Date: Mon, 20 Nov 2017 04:08:51 GMT
 Expires: 0
 Last-Modified: Thu, 16 Nov 2017 14:04:48 GMT
 Pragma: 
 Public-Key-Pins: pin-sha256="5w0XrTCAbsVO7vTngDViNHPutlvB43qYionPbpV2ky0=";  
 max-age=5184000; includeSubDomains;
 Server: Any
 Set-Cookie: ********************* httponly; secure; path=/
 Strict-Transport-Security: max-age=31536000 ; includeSubDomains
 Strict-Transport-Security: max-age=31536000; includeSubDomains
 X-Content-Type-Options: nosniff
 X-Content-Type-Options: nosniff
 X-Frame-Options: SAMEORIGIN
 X-Frame-Options: SAMEORIGIN
 X-XSS-Protection: 1; mode=block
 Content-Length: 559
 Connection: Close

此应用程序使用具有相同值的重复 X-Content-Type-Options 标头、Strict-Transport-Security、X-Frame-Options 标头。 我在 stackoverflow 上发布了这个问题,但没有找到任何回复。

【问题讨论】:

  • @Lekensteyn:如何解释重复的标头(即使具有相同的值)实际上可能是一个安全问题,特别是如果不同的系统(防火墙和浏览器)有不同的解释。

标签: http webserver web-services header


【解决方案1】:

来自RFC2616

当且仅当该头字段的整个字段值被定义为逗号分隔列表[即,#(values)] 时,具有相同字段名称的多个消息头字段可能出现在消息中。必须可以将多个头字段组合成一个“字段名称:字段值”对,而不改变消息的语义,方法是将每个后续字段值附加到第一个字段值,每个字段值用逗号分隔。因此,接收具有相同字段名称的标头字段的顺序对组合字段值的解释很重要,因此在转发消息时代理不得更改这些字段值的顺序

所以

Cache-Control: no-cache
Cache-Control: must-revalidate
Cache-Control: private

会好的。我不相信这适用于这里。如果具有重复的标头条目是有效的,它将取决于每个标头是否允许具有重复的值。

从安全的角度来看,如果这些行中的任何一个不合法,则没有定义客户端将如何处理它们 - 因此忽略它们可能是一个有效的选择。因此,我认为这在技术上是一种风险。

从实际的角度来看,我可以想象客户处理此问题的几种方法。

  • 显而易见的选择是他们只会获取他们遇到的第一个或最后一个条目。鉴于这些是重复的,这不是问题。
  • 安全的选择是错误输出请求。
  • 更明智的选择是将两者都传递给处理程序并让其决定。即基于安全的标头始终使用更严格的值。
  • 另一种选择是将标头连接到 csv 中并将其传递给处理程序 - 这将涵盖合法的重复标头案例。
  • 最坏的情况是客户端忽略标头。

【讨论】:

  • OK - 尽管在实践中这似乎并没有改变任何东西 - 它所做的只是指定接收器可以在处理之前组合这些值。对于参数,这是适用的,即使在 2616 下,csv 列表也是有效的。
【解决方案2】:

是否可以复制标头以及如何解释标头取决于标头的确切语义。
Content-Encoding 这样的一些标题是累积的,即所有值都将放在一起(至少在理论上,practice might differ)。在这种情况下,具有相同值的多个标头当然不同于具有单个标头。
其他标头是单例的,最多应出现一次。通常,如果为单例多次发送相同的标头和值,则可以接受。但我不会依赖它,因为它仍然无效。如果同一个标头以不同的值多次发送,客户端的行为会有所不同(可能也取决于标头):一些选择特定的标头(即第一个或最后一个),而另一些则将响应视为损坏,因为有多种解释有可能which can result in security problems

【讨论】:

    【解决方案3】:

    正确的行为(根据 RFC)是在标头是列表时追加(如 Cache-Control)或生成错误。

    实际上,互联网是一只野鹅,正如 Steffen Ulrich 所说,结果会因客户而异。我认为大多数客户不会产生错误。错误概念的一个问题是您不知道的标题可能是单值标题(与列表相反),因此您无法知道是否允许重复它。所以 RFC 很好,但不能正确遵循此类标头。

    在大多数情况下,我会说重复标题是不好的做法,尤其是具有相同值的标题,并且会研究是否可以避免重复。由于在您的情况下两者都具有完全相同的值,因此对于大多数可用的客户来说可能没问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-12
      • 2018-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-21
      • 1970-01-01
      • 2021-10-14
      相关资源
      最近更新 更多