nginx fastcgi 모듈 의 bug
오리지널 글, 전재 설명: pagefault 에서 전재
링크 주소: nginx fastcgi 모듈 의 bug
지난주 에 서버 가 nginx 의 0.8. X 로 업 데 이 트 된 후에 nginx 는 core dump 의 상황 이 발생 했 지만 0.7. X 에 서 는 나타 나 지 않 았 습 니 다. core dump 파일 과 nginx 0.8. x 와 0.7. x 의 비 교 를 통 해 core dump 는 nginx 0.8.40 이 아래 피 처 를 도입 한 것 을 발 견 했 습 니 다.
*) Feature: a “fastcgi_param” directive with value starting with“HTTP_” overrides a client request header line.
nginx 0.8.40 이후 당신 의 fastcgiparam 에서 정의 하 는 변 수 는 HTTP시작 하면 백 엔 드 에 전 달 된 머리 는 request header 의 이 머리 를 무시 합 니 다. 예 를 들 어 fastcgi 를 정의 합 니 다.param $HTTP_HOST test, 그러면 백 엔 드 에 전 달 될 때 host 이 머리의 값 은 test 입 니 다.
이 논 리 는 이 렇 습 니 다. nginx 가 fastcgi request 를 만 들 때 필요 한 길 이 를 먼저 계산 합 니 다. 먼저 header 의 길 이 를 계산 합 니 다. 계산 하기 전에 ignored 배열 (무시 할 머리 를 저장 하 는 데 사용) 을 할당 합 니 다. 크기 는 설정 파일 에 있 는 fastcgi 입 니 다.param 정의 HTTP시작 변수의 개수 입 니 다. 그리고 모든 request header 를 옮 겨 다 니 며 header 의 이름과 fastcgi 를 발견 하면param 에서 정의 하 는 변수의 (HTTP 시작) 이름 이 같 으 면 (hash 를 사용) 이 header 포인 터 를 ignored 배열 에 놓 고 마지막 으로 request header 를 복사 할 때 이 배열 에서 직접 찾 습 니 다. 있 으 면 건 너 뛰 지 않 으 면 복사 헤드 와 값 을 찾 습 니 다.
문제 가 없 을 것 같 지만 request header 가 중복 되 는 상황 이 있 을 수 있 음 을 무시 합 니 다. 이때 ignored 배열 은 경 계 를 넘 어 core dump 를 초래 할 수 있 습 니 다.
대응 하 는 코드 를 보면 문 제 를 일 으 키 는 코드 는 다음 단락 (ngx http fastcgi create request) 입 니 다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
//
header_params fastcgi_param (HTTP_ )
if
(flcf->header_params) {
//
ignored = ngx_palloc(r->pool, flcf->header_params * sizeof(void *));
if (ignored == NULL) {
return NGX_ERROR;
}
}
part = &r->headers_in.headers.part;
header = part->elts; //
for (i = 0; /* void */
; i++) {
if (i >= part->nelts) {
if (part->next == NULL) {
break;
}
part = part->next;
header = part->elts;
i = 0;
}
if (flcf->header_params) {
.............................................................. //headers_hash
fastcgi_param (HTTP_ ) hash
if (ngx_hash_find(&flcf->headers_hash, hash, lowcase_key, n)) { //
hash, header_params . fastcgi_param (HTTP_ ) , ignored .
ignored[header_params++] = &header[i];
continue;
}
n += sizeof( "HTTP_"
) - 1;
} else {
n = sizeof( "HTTP_"
) - 1 + header[i].key.len;
} 예 를 들 어 설정 파일 에는 다음 명령 이 포함 되 어 있 습 니 다: fastcgi param HTTP HOST $http host;
그리고 클 라 이언 트 가 보 낸 머리 에 host 헤드 가 여러 개 포함 되면 nginx 는 core dump 가 떨 어 집 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.