我找到了一个响应,该响应由应用程序相同的应用程序使用。谁能告诉我,这是一个很好的编程惯例,还是用于安全性观点或其他任何东西?
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标头,严格的传输 - 安全性,具有相同值的X-Frame-Options标头。我在Stackoverflow上发布了这个问题,但没有找到任何回答。
来自rfc2616
当该标头字段的整个字段值被定义为逗号分隔列表[即,#(values)]时,可能会在消息中存在多个具有同一字段名称的消息标头字段。必须将多个标头字段组合到一个"字段名称:字段值"对中,而无需更改消息的语义,通过将每个后续的每个字段值附加到第一个,每个字段值都以逗号分隔。因此。
so
Cache-Control: no-cache
Cache-Control: must-revalidate
Cache-Control: private
可以。我不相信这里适用。如果具有重复的标题条目有效,则将取决于每个标头是否允许具有重复值。
从安全的角度来看,如果这些行不合法,则无法定义客户对他们的行为 - 因此忽略它们可能是一个有效的选择。因此,我认为和糟糕的做法也是一种风险。
从实际的角度来看,我可以想象有几种方法来处理此问题。
- 显而易见的选择是他们只需遇到他们遇到的第一个或最后一个条目。看到这些是重复的,这不是问题。
- 安全的选项是错误。
- 更聪明的选择是将同时传递给处理程序并决定。即,对于基于安全的标头,始终使用更严格的值。
- 另一种选择是将标头加入CSV并将其传递给处理程序 - 这将涵盖合法的重复标题案件。
- 最坏的情况是客户忽略标题。
如果复制标头很好以及如何解释它取决于标题的确切语义。
像Content-Encoding
这样的一些标题是累积的,即所有值都将被放在一起(至少在理论上,实践可能有所不同)。在这种情况下,具有相同值的多个标头当然不同于拥有一个标头。
其他标题是单例,最多应该发生一次。通常,如果相同的标头和值多次为单例发送了相同的标头和值。但是我不会依靠它,因为它仍然无效。如果相同的标头多次以不同的值发送,则客户的行为会有所不同(也可能取决于标题):有些选择特定的标头(即首先或最后一个),而其他人则将响应视为损坏,因为多个解释可能会导致安全问题。
正确的行为(按照RFC)是要附加标题是列表(例如Cache-Control
)或生成错误。
实际上,互联网是一种狂野的鹅,正如斯特芬·乌尔里希(Steffen Ulrich)所说,结果将因客户而异。我认为大多数客户不会产生错误。错误概念的一个问题是,您不知道的标头可能是一个值标头(与列表相对),因此您不知道是否允许重复它。因此,RFC很好,但不能正确遵循此类标题。
在大多数情况下,我会说重复标头尤其是具有相同价值的标题是不好的做法,并研究是否有可能避免重复。因为在您的情况下,两者都具有完全相同的值,因此对于大多数可用的客户而言,它可能很好。