Después de actualizar a Django 1.5, comencé a recibir errores 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)}>
Lo configuré ALLOWED_HOSTS = ['.derekkwok.net']
en mi archivo settings.py.
¿Que esta pasando aqui? ¿Alguien se hace pasar por Google y accede a mi sitio? ¿O es un caso benigno de alguien que configura incorrectamente su encabezado HTTP_HOST?
Respuestas:
Si
ALLOWED_HOSTS
está configurado correctamente, entonces es posible que alguien esté investigando su sitio en busca de la vulnerabilidad falsificando el encabezado.Actualmente, los desarrolladores de Django están discutiendo para cambiar esto de un error interno del servidor 500 a una respuesta 400. Vea este boleto .
fuente
Si está utilizando Nginx para reenviar solicitudes a Django que se ejecuta en Gunicorn / Apache / uWSGI, puede usar lo siguiente para bloquear solicitudes incorrectas. Gracias a @PaulM por la sugerencia y esta publicación de blog por un ejemplo.
fuente
if
interior delserver
bloque y no en ellocation
bloque. ¿Eso significa queif
está bien en este caso?Al usar Nginx, puede configurar sus servidores de una manera que solo solicite a los hosts que desea que lleguen a Django en primer lugar. Eso ya no debería generar errores de SuspiciousOperation.
fuente
if
enfoque sugerido por Brent, pero no puedo hacer que funcione con el puerto 443. Intenté imitar su sugerencia (con el puerto de escucha cambiado), y mi sitio SSL real no se carga. es capturado por esta entrada que agregué. Alguna idea sobre como arreglarlo?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
(con Django 1.8.x)Esto se corrige en las versiones más recientes de Django, pero si está usando una versión afectada (por ejemplo, 1.5), puede agregar un filtro a su controlador de registrador para deshacerse de ellos, como se describe en esta publicación de blog.
Revelación:
fuente