我找到了一个响应,其中具有相同值的应用程序使用重复的标头。任何人都可以告诉我,这是一个很好的编程实践还是用于安全角度或其他任何东西?
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标头。
答案 0 :(得分:2)
这是编程/配置错误。 RFC 7230 (Section 3.2.2)说:
发件人不得生成具有相同字段的多个标题字段 在消息中命名,除非该字段的整个字段值 标题字段定义为以逗号分隔的列表[即#(值)] 或标题字段是一个众所周知的例外(如下所述)。
所以使用这样的多个标题:
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
Strict-Transport-Security: max-age=31536000; includeSubDomains
是未定义的行为。同一部分说:
收件人可以将多个标题字段与同一字段组合在一起 将名称命名为一个"字段名称:字段值"一对,没有改变 消息的语义,通过附加每个后续字段值 按顺序组合的字段值,以逗号分隔。
因此对上述标题的一种可能解释是:
Strict-Transport-Security: max-age=31536000 ; includeSubDomains, max-age=31536000; includeSubDomains
这是根据https://tools.ietf.org/html/rfc6797#section-6.1的无效语法,可能会被拒绝(因此,不会应用HSTS政策)。
请注意,并非所有实现都可能遵循此指定的行为。例如,Python http库只返回一个标题列表,在上面的例子中它可能看起来像:
[
# ...
('Strict-Transport-Security', 'max-age=31536000 ; includeSubDomains'),
('Strict-Transport-Security', 'max-age=31536000; includeSubDomains')
# ...
]
根据具体实施情况,至少可以采取以下三种行为:
验证和使用之间的解释不匹配可能会导致攻击,尽管HSTS标题可能不会非常严重。