Django 에러 Invalid HTTP_HOST header: 'mobile.12306.cn'


파이썬/장고 | 2019-01-01 23:01 | 댓글 | 13,801 회


안녕하세요.

핀코인입니다.

Django 웹 애플리케이션 서버를 운영하다보면 Invalid HTTP_HOST header 오류 이메일 보고를 받을 때가 있습니다.

Invalid HTTP_HOST header: 'mobile.12306.cn'

예를 들어, 위와 같은 에러가 떴다면 결론부터 말씀드리면 해당 IP 대역대와 user-agent는 그냥 차단하세요.

Django 알림을 오류로 보는 것보다 사이트의 공격 시도가 있었다고 생각하시는 편이 더 옳습니다.

이 오류는 Django의 settings.py 설정 파일에서 ALLOWED_HOSTS 값에 대한 이야기입니다.

Django 공식문서에 의하면 ALLOWED_HOSTS 설정은 Django 서버가 서비스하는 호스트/도메인을 나열하며 이는 HTTP 호스트 헤더 변조 공격을 방어하기 위함이라고 설명합니다.

로컬 테스트/개발 환경에서 DEBUG=True일 때 ALLOWED_HOSTS의 기본값은 다음과 같습니다.

ALLOWED_HOSTS = ['localhost', '127.0.0.1', '[::1]']

이는 로컬호스트에서만 접근허용한다는 뜻입니다.

보통 운영서버를 운영할 때는 ALLOWED_HOST 값을 아래와 같이 도메인과 서버 IP 두 개만 호스트 허용합니다.

ALLOWED_HOSTS = ['.example.com', '123.45.123.45']

.example.com으로 설정하면 example.com, www.example.com 등등 서브도메인을 와일드카드로 지정하는 효과가 있습니다.

그럼 다시 아까 Invalid HTTP_HOST header 오류로 돌아가서 확인해보면 보면 mobile.12306.cn 문자열을 볼 수 있습니다.

Invalid HTTP_HOST header: 'mobile.12306.cn'

이는 악의적 사용자가 임의로 HTTP_HOST 헤더값을 'mobile.12306.cn'으로 브라우저에서 변조해서 요청했다는 뜻입니다. 따라서 이는 오류가 아니라 공격시도가 있었으니 이를 차단하는 조치가 맞습니다.

경험적으로 중국 IP인데 그냥 해당 IP 대역대를 차단하고 user-agent가 Go-http-client/1.1처럼 일반적인 브라우저 값이 아니라면 이것도 그냥 차단해버리는 편이 낫습니다. 이러한 차단을 효과적으로 지원하는 것이 바로 웹 방화벽입니다.

그리고 절대 잊지 말아야할 것은 보안을 위해 운영서버에서는 Django의 settings.py에서 ALLOWED_HOSTS 값은 절대 '*'으로 설정하면 안 된다는 것입니다. 오류 해결책으로 '*' 지정을 권하는 인터넷 문서들이 더러 있는데 운영 환경에서는 절대 그렇게 하면 안 됩니다.

만약 운영서버의 값을 '*'으로 설정할 경우 호스트 헤더 변조 공격을 감지할 수 없습니다.

언제나 고객 여러분이 안심하고 저렴하게 상품권 구매할 수 있는 사이트는 핀코인입니다.

대한민국 1등 온라인 상품권 쇼핑몰 핀코인!

감사합니다.


#Django #보안


관련 게시물

blog comments powered by Disqus