Nginx 설정 명령 location 일치 문자 우선 순위 와 보안 문제

8477 단어
Nginx 설정 명령 location 일치 문자 우선 순위 와 보안 문제
nginx 를 사용 한 지 오래 되 었 습 니 다. 성능 이 높 고 안정성 도 좋 으 며 많은 사람들의 인정 을 받 았 습 니 다.특히 프로그램 을 쓰 는 것 처럼 명령 마다 ';' 번, 구문 블록 은 '{}' 으로 묶 여 있 습 니 다.조립 이 완료 되 었 습 니 다. 직접 nginx - t 조립 상황 을 검사 하고 조립 이 성공 하 였 습 니 다. 직접 실행: 서비스 nginx reload.서버 가 지연 되 지 않 은 상태 에서 안정 적 으로 설정 을 수정 합 니 다.최근 에 location 설정 을 계속 하고 있 습 니 다. 우선 순위 문제 (설정 이 잘못 되면 안전 위험 이 있 을 수 있 습 니 다) 에 부 딪 혔 습 니 다. 다음은 개인 학습 소감 입 니 다.
1. location 의 일치 문자 1. 일치 문자 와 같 습 니 다. = 일치 문자 와 같 으 면 등호 입 니 다. 특징 은 두 가지 로 요약 할 수 있 습 니 다. 정규 표현 식 이 지원 되 지 않 습 니 다.그러나 여기 서 강조 하고 자 하 는 것 은 일반적으로 대소 문 자 를 구분 하 는 정규 가 일치 하 는 것 을 말 합 니 다. * 대소 문 자 를 구분 하지 않 는 정규 가 일치 하지만 대소 문자 에 민감 하지 않 은 운영 체제 에 대해 서 는 차이 가 없습니다.또 하 나 는 ^ ~ 입 니 다. 지정 모드 로 시작 하 는 정규 일치 입 니 다.
4. 내부 접근 부호: @
일반적으로 오류 페이지 등에 사용 되 는데, 이것 은 잠시 토론 하지 않 습 니 다.
2. 매 칭 문자 우선 순위 1. = 2. 빈 매 칭 문자, 정확 한 매 칭 을 만족 시 킬 때 3. ^ ~ 4. ~ 또는 ~ * 5. 빈 매 칭 문자, 지정 모드 로 시작 할 때의 매 칭 을 만족 시 킬 때 이렇게 말 하 는 것 이 추상 적 입 니 다. 예 를 들 어 보 겠 습 니 다.
2.1 일치 문자 와 정확 한 일치 시의 빈 일치 문자
아래 의 예 를 보십시오. (우리 가 이전에 함께 완성 한 Hello World 모듈 을 사용 합 니 다.)
코드 는 다음 과 같 습 니 다:
하면, 만약, 만약...http://my.domian/poechant그러면 우 리 는 두 location 이 모두 요청 한 URI 와 일치 하 는 것 을 발 견 했 습 니 다. 이때 우리 의 우선 순위 순서에 따라 첫 번 째 는 정확하게 일치 할 때의 빈 일치 문자 이 고 두 번 째 는 일치 문자 이기 때문에 두 번 째 우선 순위 가 높 습 니 다. 즉, 출력 해 야 합 니 다.
hello_world, no2
또한 Nginx 의 location 은 설정 파일 의 쓰기 순서 에 따라 일치 하지 않 는 다 는 것 을 설명 한다.
 
2.2 정확하게 일치 하 는 빈 일치 문자 가 정규 와 일치 하 는 ^ ~
아래 의 이 예 에서 둘 다 정확하게 일치 하기 시 작 했 고 이 정규 일치 도 정확하게 일치 했다.
코드 는 다음 과 같 습 니 다:
어떤 것 과 일치 합 니까?테스트 해 보면 얻 을 수 있 습 니 다:
hello_World, no2 는 우리 가 위 에서 말 한 우선 순위 순서 와 일치 합 니 다.
2.3 기타 일치 하 는 우선 순위 비교 실례
3. 실전 경험 총화
1. location 에 맞 는 우선 순위 (실천 총화 에서 온 것) (location =) > (location 전체 경로 >) > (location ^ ~ 경로) > (location ~ * 정규) > (location 경로) 가 일치 하면 다른 것 은 무시 하고 다시 일치 합 니 다.다음 예 를 들 어 테스트 합 니 다.
  코드 는 다음 과 같 습 니 다:

    location /poechant { 
   
    hello_world no1;
}

location = /poechant {
    hello_world no2;
}


설명: 테스트 할 때 먼저 \ # 2 를 모두 주석 해 야 합 니 다. 그렇지 않 으 면 \ # 2 와 \ # 4 가 똑 같다 고 생각 합 니 다.알림: 중복 설정, 다음 코드 를 알려 줍 니 다:

    location ^~ ^/poechant$ { 
   
    hello_world no1;
}

location /poechant {
    hello_world no2;
}


탐색 테스트: 매번 방문:http://localhost:9999/a/1.jpg (windows 에 테스트 를 설치 하고 포트 는 9999) 파일 a / 1. jpg 는 존재 하지 않 습 니 다. 문 제 는 페이지 가 돌아 오 는 상황 을 테스트 하 는 것 입 니 다.
a. 위의 설정 으로 요청 한 결과
  코드 는 다음 과 같 습 니 다:

    #1    
   
location / {
   return 500;
}
#2
location /a/ {
    return 404;
}
#3
location ~* \.jpg$ {
    return 403;
}
#4
location ^~ /a/ {
    return 402;
}
#5
location  /a/1.jpg {
    return 401;
}
#6
location = /a/1.jpg {
    return 400;
}

테스트 에서 볼 수 있 듯 이 우선 순위 가 가장 높 은 것 은: = 번 입 니 다. 가장 먼저 일치 합 니 다.
b. 이제 차단 합 니 다 \ # 6 은 다음 과 같 습 니 다:
 코드 는 다음 과 같 습 니 다:

    D:
ginx-0.8.7>nginx -s reload
[emerg]: duplicate location "/a/" in D:
ginx-0.8.7/conf/nginx.conf:53

그리고 다시 불 러 오기 설정: D: ginx - 0.8.7 > nginx - s reload  그리고 접근:http://localhost:9999/a/1.jpg , 다음 결 과 를 되 돌려 줍 니 다: 코드 는 다음 과 같 습 니 다:

    400 Bad Request 
   
--------------------------------------------------------------------------------
nginx/0.8.7

결론: 이 테스트 를 통 해 "=" 이 없 는 경우 location 뒤에 전체 경 로 를 직접 연결 하 는 것 이 우선 일치 합 니 다. 테스트 를 통 해 location / a / 1. jpg 를   location / a / 1 \. jpg 로 변경 하면 의외 의 상황 이 발생 할 수 있 습 니 다. 직접 나타 나 는 것 은: return 402 입 니 다.  이 점 에서 nginx 매 칭 우선 순 위 는 사이트 경로 이 고 정규 표현 식 이 없 는 우선 순 위 를 추측 할 수 있 습 니 다.
c. 동 리 테스트 차단 \ # 5 는 다음 과 같 습 니 다. 주석 및 같은 곳 으로 다시 불 러 옵 니 다. 접근:http://localhost:9999/a/1.jpg 다음 결 과 를 되 돌려 줍 니 다.
 코드 는 다음 과 같 습 니 다:

    #6 
   
#    location = /a/1.jpg {
#        return 400;
#    }

결론: 이 테스트 를 통 해 알 수 있 듯 이 location ^ ~ 우선 순위 가 location ~ * 우선 순위 보다 높 습 니 다. 그 중에서: ^ ~ 주요 뒤쪽 연결 경로 입 니 다.
c. 동 리 테스트 차단 \ # 4 는 다음 과 같 습 니 다. 주석 및 같은 곳 으로 다시 불 러 옵 니 다. 접근:http://localhost:9999/a/1.jpg 다음 결 과 를 되 돌려 줍 니 다.
코드 는 다음 과 같 습 니 다:
결론: 상기 비교 에서 얻 은 바 와 같이 정규 우선 일치 하 는 문자 가 없 는 경로 가 일치 합 니 다.
d. 동 리 테스트 차단 \ # 3 은 다음 과 같 습 니 다. 주석 및 같은 위 에 다시 불 러 옵 니 다. 그리고 \ # 2 의 주석 "\ #" 접근 을 제거 합 니 다.http://localhost:9999/a/1.jpg 다음 결 과 를 되 돌려 줍 니 다.
코드 는 다음 과 같 습 니 다:
결론: 비교적 재 미 있 는 것 은: / a / 와 /  같은 종류의 일치 식 이 어야 합 니 다. 그 중에서 얻 을 수 있 습 니 다. 이 일치 순 서 는 경 로 를 오른쪽 에서 일치 시 키 고 문자 와 같이 추측 할 수 있 습 니 다. 그것 이 먼저 일치 하 는 것 이 우선 입 니 다. 따라서 얻 은 것 은: / a / 우선 / 입 니 다.
이상 의 테스트 는 제 가 테스트 한 결과 입 니 다. 우선 순 위 는 이상 의 규칙 입 니 다. 실제 우리 가 작성 할 때 자주 실 수 를 할 수 있 습 니 다. 얼마 전 까지 만 해도 기억 합 니 다. 80 후 안전 팀 이 nginx 구멍 을 드 러 냈 습 니 다. 사실은 개인 적 으로 nginx 구멍 이 라 고 할 수 없다 고 생각 합 니 다. 다만, 우 리 는 nginx 배합 규칙 을 모 르 고 하나의 설정 에 치 명 적 인 구멍 이 생 겼 을 뿐 입 니 다. 사실은 위의 우선 순 위 를 통 해...우리 가 설정 할 때 도 마찬가지 로 치 명 적 인 실 수 를 자주 할 수 있 습 니 다.
 코드 는 다음 과 같 습 니 다:

    401 Authorization Required 
   
--------------------------------------------------------------------------------
nginx/0.8.7

그리고 이 upload 디 렉 터 리 는 정적 디 렉 터 리 입 니 다. php 파일 을 포함 하여 아래 의 모든 파일 을 실행 할 수 없다 고 생각 합 니 다. 사용자 가 접근 하면:http://www.a.com/upload/1.css 이 css 를 직접 표시 합 니 다. 단, 사용자 가 접근 하면:http://www.a.com/upload/1.php  위 에서 말 한 바 와 같이 실제 일치 하 는 파일: ~ * \. php $  예. upload 아래 는 실행 되 었 습 니 다. 이 안에서 우 리 는 우리 의 요구 에 부합 되 지 않 는 문 제 를 발 견 했 습 니 다. 정적 디 렉 터 리 아래 의 파일 처럼 실행 되 었 습 니 다. 이 제 는 좀 번 거 롭 습 니 다. 어떤 위 에 구멍 이 생기 면 다른 사람 이 phop 을 저장 합 니 다. 우 리 는 설정 이 ok 인 줄 알 았 습 니 다. 안전 하 다 고 생각 했 습 니 다. 모 르 는 사이 에 다른 사람 에 게 열 리 지 않 았 습 니 다.문 한 짝.
그럼 어떻게 수정 할 까요?
 코드 는 다음 과 같 습 니 다:

    402 Payment Required 
   
--------------------------------------------------------------------------------
nginx/0.8.7

네, 꼭 써 야 합 니 다. "^ ~" 이렇게 하면 안전 하지 않 을까요? 다시 방문 해 보 세 요.http://www.a.com/upload/1.php  이 코드 의 원본 코드 가 표 시 된 것 을 발견 할 수 있 습 니 다. 이것 은 사실 우리 에 게 도 보고 싶 지 않 습 니 다. 원본 코드 는 각 검색엔진 에서 모든 특수 키 워드 를 통 해 파일 을 바 꾸 는 것 을 쉽게 검색 할 수 있 습 니 다. 그러면 우 리 는 안전 한 저장 디 렉 터 리 를 어떻게 설정 해 야 합 니까? 네, 허용 되 는 특수 파일 형식 을 제한 합 니 다.
코드 는 다음 과 같 습 니 다:

    403 Forbidden 
   
--------------------------------------------------------------------------------
nginx/0.8.7

위의 확장자 파일 을 만족 시 키 지 않 으 면 자동 으로 알림: 403 에 접근 할 수 없습니다. 원본 코드 가 표시 되 는 것 을 피 할 수 있 습 니 다. 방금 일치 하 는 결 과 를 통 해 알 았 습 니 다. 같은 등급 에 일치 하 는 문자 가 없 으 며 오른쪽 을 기준 으로 일치 합 니 다. 그렇다면 정규 표현 식 을 사용한다 면 어떤 방식 으로 일치 합 니까? 테스트 는 다음 과 같 습 니 다. (새 프로필, server 포함)
 코드 는 다음 과 같 습 니 다:

    404 Not Found 
   
--------------------------------------------------------------------------------
nginx/0.8.7

결 과 는 다음 과 같다.
  코드 는 다음 과 같 습 니 다:

    #        ,         
   
# :/home/www/html/ , php 。
location ~* \.php$ {
    proxy_pass http://www.a.com;
}

location  /upload/ {
    alias   /home/www/html/upload/;
}


돌아 온 것 은 402 위 에 있 는 것 같 습 니 다. 이론 적 으로 1. jpg 설정 이. jpg 보다 더 정확 한 것 같 습 니 다. 위 에서 말 한 순서 와 다 르 면 그것 이 앞에서 그것 과 일치 하 는 것 이 아 닐 까요? 다시 한번 테스트 해 보 겠 습 니 다.
코드 는 다음 과 같 습 니 다:

    location ~* \.php$ { 
   
    proxy_pass http://www.a.com;
}
location ^~ /upload/ {
    alias   /home/www/html/upload/;
}

반환 결 과 는:
 코드 는 다음 과 같 습 니 다:

    location ~* \.php$ { 
   
    proxy_pass http://www.a.com;
}

location ^~ /upload/ {
  if ($request_filename ! ~* \.(jpg|jpeg|gif|png|swf|zip|rar|txt)$) {
  return 403;
    }
    alias   /home/www/html/upload/;
}


하하, 반대로 제 추측 이 맞 는 것 같 습 니 다. 모두 정규 라면 일치 할 수 있 습 니 다. 설정 파일 의 순서 로 누가 앞 에 있 는 지, 누가 먼저 있 는 지. 단숨에 말 했 습 니 다. 친구, 당신, 제 생각 을 모 르 겠 습 니 다. 이런 비교 가 많 을 것 입 니 다. 여러분 은 하나씩 테스트 할 수 있 습 니 다. location 설정 을 익히 는 것 은 nginx 를 능숙 하 게 활용 하 는 데 필수 적 인 기초 입 니 다.nginx 가 너무 유연 하고 유행 하기 때 문 입 니 다. 위의 문 제 는 친구 가 만 날 수도 있 습 니 다. 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기