Nach dem Upgrade auf Django 1.5 wurden folgende Fehler angezeigt:
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)}>
Ich habe ALLOWED_HOSTS = ['.derekkwok.net']
in meiner settings.py-Datei festgelegt.
Was geht hier vor sich? Ist es jemand, der vorgibt, Google zu sein und auf meine Website zugreift? Oder ist es ein harmloser Fall, dass jemand seinen HTTP_HOST-Header falsch gesetzt hat?
Antworten:
Wenn Ihr
ALLOWED_HOSTS
richtig eingestellt ist, prüft möglicherweise jemand Ihre Site auf die Sicherheitsanfälligkeit, indem er den Header fälscht.Derzeit diskutieren die Django-Entwickler, dies von einem internen 500-Server-Fehler in eine 400-Antwort zu ändern. Siehe dieses Ticket .
quelle
Wenn Sie Nginx verwenden, um Anfragen an Django weiterzuleiten, die unter Gunicorn / Apache / uWSGI ausgeführt werden, können Sie die folgenden Methoden verwenden, um fehlerhafte Anfragen zu blockieren. Vielen Dank an @PaulM für den Vorschlag und diesen Blog-Beitrag für ein Beispiel.
quelle
if
Innere desserver
Blocks und nicht denlocation
Block. Bedeutet das, dass dasif
in diesem Fall in Ordnung ist?Wenn Sie Nginx verwenden, können Sie Ihre Server so einrichten, dass nur Anfragen an die Hosts, die Sie erhalten möchten, an erster Stelle an Django gesendet werden. Das sollte Ihnen keine SuspiciousOperation-Fehler mehr geben.
quelle
if
von Brent vorgeschlagenen Ansatzes, aber ich kann ihn nicht mit Port 443 zum Laufen bringen. Ich habe versucht, Ihren Vorschlag nachzuahmen (wobei der Listen-Port geändert wurde), und meine eigentliche SSL-Site wird nicht geladen - er wird von diesem Eintrag erfasst, den ich hinzugefügt habe. Irgendwelche Ideen, wie man das behebt?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
(mit Django 1.8.x)Dies ist in neueren Versionen von Django behoben. Wenn Sie jedoch eine betroffene Version (z. B. 1.5) verwenden, können Sie Ihrem Logger-Handler einen Filter hinzufügen, um diese zu entfernen, wie in diesem Blogbeitrag beschrieben.
Spoiler:
quelle