Po aktualizacji do Django 1.5 zaczęły pojawiać się takie błędy:
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)}>
Ustawiłem ALLOWED_HOSTS = ['.derekkwok.net']
w moim pliku settings.py.
Co tu się dzieje? Czy ktoś udaje Google i uzyskuje dostęp do mojej witryny? A może jest to łagodny przypadek, gdy ktoś nieprawidłowo ustawił swój nagłówek HTTP_HOST?
Odpowiedzi:
Jeżeli twój
ALLOWED_HOSTS
jest ustawiony prawidłowo, możliwe, że ktoś sonduje Twoją witrynę pod kątem luki, podszywając się pod nagłówek.W tej chwili programiści Django dyskutują, aby zmienić to z wewnętrznego błędu serwera 500 na odpowiedź 400. Zobacz ten bilet .
źródło
Jeśli używasz Nginx do przekazywania żądań do Django działającego na Gunicorn / Apache / uWSGI, możesz użyć poniższych opcji, aby zablokować złe żądania. Dzięki @PaulM za sugestię i ten post na blogu za przykład.
źródło
if
wnętrzeserver
bloku, a nielocation
blok. Czy to oznacza, żeif
w tym przypadku jest w porządku?Korzystając z Nginx, możesz skonfigurować swoje serwery w taki sposób, aby w pierwszej kolejności żądania wysyłane były tylko do hostów, które chcesz dostać do Django. To nie powinno już powodować żadnych błędów SuspiciousOperation.
źródło
if
podejściem sugerowanym przez Brent, ale nie mogę go zmusić do pracy z portem 443. Próbowałem naśladować twoją sugestię (ze zmienionym portem nasłuchiwania), a moja rzeczywista witryna SSL nie ładuje się - to zostaje ujęty przez ten wpis, który dodałem. Jakieś pomysły, jak to naprawić?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
(z Django 1.8.x)Zostało to naprawione w nowszych wersjach Django, ale jeśli używasz wersji, której dotyczy problem (np. 1.5), możesz dodać filtr do programu obsługi rejestratora, aby się ich pozbyć, jak opisano w tym wpisie na blogu.
Spojler:
źródło