Depois de atualizar para Django 1.5, comecei a receber erros como este:
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 92, in get_response
response = middleware_method(request)
File "/usr/local/lib/python2.7/dist-packages/django/middleware/common.py", line 57, in process_request
host = request.get_host()
File "/usr/local/lib/python2.7/dist-packages/django/http/request.py", line 72, in get_host
"Invalid HTTP_HOST header (you may need to set ALLOWED_HOSTS): %s" % host)
SuspiciousOperation: Invalid HTTP_HOST header (you may need to set ALLOWED_HOSTS): www.google.com
<WSGIRequest
path:/,
GET:<QueryDict: {}>,
POST:<QueryDict: {}>,
COOKIES:{},
META:{'CONTENT_LENGTH': '',
'CONTENT_TYPE': '',
'DOCUMENT_ROOT': '/etc/nginx/html',
'HTTP_ACCEPT': 'text/html',
'HTTP_HOST': 'www.google.com',
'HTTP_PROXY_CONNECTION': 'close',
'HTTP_USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)',
'PATH_INFO': u'/',
'QUERY_STRING': '',
'REMOTE_ADDR': '210.245.91.104',
'REMOTE_PORT': '49347',
'REQUEST_METHOD': 'GET',
'REQUEST_URI': '/',
u'SCRIPT_NAME': u'',
'SERVER_NAME': 'www.derekkwok.net',
'SERVER_PORT': '80',
'SERVER_PROTOCOL': 'HTTP/1.0',
'uwsgi.node': 'derekkwok',
'uwsgi.version': '1.4.4',
'wsgi.errors': <open file 'wsgi_errors', mode 'w' at 0xb6d99c28>,
'wsgi.file_wrapper': <built-in function uwsgi_sendfile>,
'wsgi.input': <uwsgi._Input object at 0x953e698>,
'wsgi.multiprocess': True,
'wsgi.multithread': False,
'wsgi.run_once': False,
'wsgi.url_scheme': 'http',
'wsgi.version': (1, 0)}>
Eu defini ALLOWED_HOSTS = ['.derekkwok.net']
no meu arquivo settings.py.
O que está acontecendo aqui? É alguém fingindo ser Google e acessando meu site? Ou é um caso benigno de alguém configurando seu cabeçalho HTTP_HOST incorretamente?
Respostas:
Se o seu
ALLOWED_HOSTS
estiver definido corretamente, é possível que alguém esteja investigando a vulnerabilidade em seu site falsificando o cabeçalho.Há uma discussão agora pelos desenvolvedores do Django para mudar isso de um erro interno de 500 para uma resposta 400. Veja este tíquete .
fonte
Se você estiver usando Nginx para encaminhar solicitações ao Django em execução no Gunicorn / Apache / uWSGI, poderá usar o seguinte para bloquear solicitações incorretas. Obrigado a @PaulM pela sugestão e esta postagem no blog por um exemplo.
fonte
if
dentro doserver
bloco e não nolocation
bloco. Isso significa queif
está tudo bem neste caso?Ao usar o Nginx, você pode configurar seus servidores de uma forma que apenas faça solicitações aos hosts que você deseja que o Django chegue. Isso não deve gerar mais erros SuspiciousOperation.
fonte
if
abordagem sugerida por Brent, mas não consigo fazê-la funcionar com a porta 443. Tentei imitar sua sugestão (com a porta de escuta alterada) e meu site SSL real não carrega - ele é capturado por esta entrada que eu adicionei. Alguma ideia de como consertar?server { listen 80 default_server; listen 443; server_name _; ssl_certificate /path/to/file.crt; ssl_certificate_key /path/to/file.key; return 444; }
Invalid HTTP_HOST header
(com Django 1.8.x)Isso é corrigido nas versões mais recentes do Django, mas se você estiver usando uma versão afetada (por exemplo, 1.5), você pode adicionar um filtro ao seu manipulador de log para se livrar deles, conforme descrito neste post de blog.
Spoiler:
fonte