3

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

  
     HTTP/1.1 200
     接受范围:字节
     缓存控制:无缓存、必须重新验证、私有
     内容类型:文本/html
     日期:2017 年 11 月 20 日星期一 04:08:51 GMT
     过期:0
     最后修改时间:2017 年 11 月 16 日星期四 14:04:48 GMT
     语用:
     公钥引脚:pin-sha256="5w0XrTCAbsVO7vTngDViNHPutlvB43qYionPbpV2ky0=";  
     最大年龄=5184000;包括子域;
     服务器:任意
     Set-Cookie: ********************* httponly; 安全的; 路径=/
     严格的传输安全性: max-age=31536000 ;包括子域
     严格的传输安全性:max-age=31536000;包括子域
     X-Content-Type-Options: nosniff
     X-Content-Type-Options: nosniff
     X 框架选项:SAMEORIGIN
     X 框架选项:SAMEORIGIN
     X-XSS-防护:1;模式=块
     内容长度:559
     连接:关闭

此应用程序使用具有相同值的重复 X-Content-Type-Options 标头、Strict-Transport-Security、X-Frame-Options 标头。

4

1 回答 1

4

这是一个编程/配置错误。RFC 7230(第 3.2.2 节)说:

发送方不得在消息中生成多个具有相同字段名称的头字段,除非该头字段的整个字段值被定义为逗号分隔列表 [即,#(values)] 或头字段是一个很好的-已知异常(如下所述)。

所以使用这样的多个标题:

Strict-Transport-Security: max-age=31536000 ; includeSubDomains
Strict-Transport-Security: max-age=31536000; includeSubDomains

是未定义的行为。同一部分说:

接收者可以将多个具有相同字段名称的头字段组合成一个“字段名称:字段值”对,而不改变消息的语义,方法是将每个后续字段值按顺序附加到组合的字段值上,用 a 分隔逗号。

因此,对上述标题的一种可能解释是:

Strict-Transport-Security: max-age=31536000 ; includeSubDomains, max-age=31536000; includeSubDomains

根据https://www.rfc-editor.org/rfc/rfc6797#section-6.1 ,这不是有效的语法,可能会被拒绝(因此,不应用 HSTS 策略)。

请注意,并非所有实现都可能遵循此指定行为。例如,Python http 库只返回一个标头列表,在上述情况下,它可能如下所示:

[
    # ...
    ('Strict-Transport-Security', 'max-age=31536000 ; includeSubDomains'),
    ('Strict-Transport-Security', 'max-age=31536000; includeSubDomains')
    # ...
]

根据实现,至少有以下三种行为是可能的:

  • 合并标头,用逗号分隔(由 RFC 7230 指定)。
  • 使用第一个标头匹配。
  • 使用最后一个标头匹配。

验证和使用之间的解释不匹配可能导致攻击,尽管这对于 HSTS 标头可能不是很严重。

于 2017-12-20T09:18:53.650 回答