nginx fastcgi 모듈 의 bug

4477 단어
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)) { // hashheader_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 가 떨 어 집 니 다.

좋은 웹페이지 즐겨찾기