1

중복 된 헤더가 동일한 값을 가진 응용 프로그램에서 사용되는 경우 응답을 발견했습니다. 아무도 말해도 좋은 프로그래밍 실천인가 아니면 보안 관점이나 다른 용도로 사용되는 것인가? 같은 값의 중복 응답 헤더를 사용하는 것이 좋습니까?

 
    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을-옵션 헤더, 엄격한-운송 보안, X-프레임 - 옵션 헤더를 사용하고 있습니다.

+0

여기에서 크로스 게시 : https://security.stackexchange.com/questions/175840/is-it-fine-to-use-duplicate-response-header-with-same-value – Lekensteyn

답변

1

프로그래밍/구성 오류입니다. RFC 7230 (Section 3.2.2) 메시지 : 그 헤더 필드의 전체 필드 값 중 쉼표로 구분 된 목록으로 정의되지 않는 한

송신자는 [즉, # (메시지의 동일한 필드 이름을 가진 복수의 헤더 필드를 생성하지 않아야 values)] 이거나 헤더 필드는 잘 알려진 예외입니다 (아래에 명시).

그래서 이런 식으로 여러 헤더를 사용 :

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

이 정의되지 않은 동작입니다. 동일한 섹션 메시지 :

수신자가 하나로 동일한 필드 이름이 복수의 헤더 필드를 결합 할 수있다 "란 이름 : 필드 값"쌍 메시지의 의미를 변경하지 않고, 각각의 후속 추가하여 필드 값을 쉼표로 구분하여 순서대로 결합 된 필드 값으로 변경하십시오.

그래서 위의 헤더의 하나 개의 가능한 해석은 다음과 같습니다

올바른 구문은 https://tools.ietf.org/html/rfc6797#section-6.1에 따라하지 않고 거부 얻을 수 있습니다 (그 결과, HSTS 정책이 적용되지 않습니다)
Strict-Transport-Security: max-age=31536000 ; includeSubDomains, max-age=31536000; includeSubDomains 

.

모든 구현이이 특정 동작을 따르지 않을 수 있습니다. 적어도이 세 가지 행동이 가능하며, 구현에 따라

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

:

  • 병합 예를 들어, 파이썬 HTTP 라이브러리는 단지 헤더의 목록을 반환, 위의 경우에서처럼 보일 수 있습니다 헤더는 쉼표로 구분됩니다 (RFC 7230에서 지정한대로).
  • 첫 번째 헤더 일치를 사용합니다.
  • 마지막 헤더 일치 사용.

유효성 검사와 사용 사이의 해석이 일치하지 않으면 공격을 유발할 수 있지만 HSTS 헤더의 경우 심각하지는 않습니다.

+1

[RFC 6797] (https://tools.ietf.org/html/rfc6797) 헤더가 여러 번 사용될 수 있다고 말하지 않습니다. [RFC 2616] (https://www.ietf.org/rfc/rfc2616.txt) 섹션 4.2 * "동일한 필드 이름을 가진 다중 메시지 헤더 필드는 해당 헤더 필드의 전체 필드 값이 쉼표로 구분 된 목록"*으로 정의 된 경우에만 메시지에 이 존재할 수 있습니다. HSTS 헤더는 쉼표로 구분 된 목록으로 정의되지 않으므로 여러 번 나타날 수 없습니다. 그리고 그것이하는 경우에 진행하는 방법에 어떤 규칙도 접히기를위한 아무 규칙도 의미하지 않는다. –

+0

감사합니다. @SteffenUllrich와 Lekensteyn은 이제 매우 분명합니다. –

+0

@SteffenUllrich RFC 2616은 폐기되었으며, RFC 7230을 참조하기 전에 (이는 후속 제품 임). 이제는 관련 섹션을 답변에 추가했습니다. 제안에 감사드립니다. 당신의 견적은 송신자에 관한 것인데, 수신자는 여전히 헤더를 결합 할 수 있습니다 (* 수신자가 결합 할 수도 있음을 참고하십시오). – Lekensteyn

관련 문제