После обновления до Django 1.5 я начал получать такие ошибки:
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)}>
Я установил ALLOWED_HOSTS = ['.derekkwok.net']
в своем файле settings.py.
Что здесь происходит? Кто-то притворяется Google и заходит на мой сайт? Или это мягкий случай, когда кто-то неправильно установил свой заголовок HTTP_HOST?
Ответы:
Если ваш
ALLOWED_HOSTS
установлен правильно, возможно, кто-то исследует ваш сайт на предмет уязвимости, подделав заголовок.Сейчас разработчики Django обсуждают, как изменить это с 500 внутренней ошибки сервера на ответ 400. Смотрите этот билет .
источник
Если вы используете Nginx для пересылки запросов к Django, работающему на Gunicorn / Apache / uWSGI, вы можете использовать следующее, чтобы заблокировать неверные запросы. Спасибо @PaulM за предложение и это сообщение в блоге за пример.
источник
if
внутреннийserver
блок, а неlocation
блок. Означает ли это, чтоif
в данном случае все в порядке?При использовании Nginx вы можете настроить свои серверы так, чтобы запросы только к хостам, которые вы хотите получить в Django в первую очередь. Это больше не должно вызывать у вас ошибок SuspiciousOperation.
источник
if
подходом, предложенным Брентом, но я не могу заставить его работать с портом 443. Я попытался имитировать ваше предложение (с измененным портом прослушивания), и мой фактический сайт SSL не загружается - он попадает в эту запись, которую я добавил. Есть идеи, как исправить?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
(с Django 1.8.x)Это исправлено в новых версиях Django, но если вы используете уязвимую версию (например, 1.5), вы можете добавить фильтр в обработчик логгера, чтобы избавиться от них, как описано в этом сообщении блога.
Спойлер:
источник