Должен ли IP-адрес сервера находиться в настройке django ALLOWED_HOSTS?
С момента обновления до django 1.5 мои журналы показывают несколько исключений SuspiciousOperation
с текстом:
Invalid HTTP_HOST header (you may need to set ALLOWED_HOSTS): <my server ip>
Является ли это действительно "подозрительным" запросом или я всегда должен включать в себя IP-адрес сервера в параметре ALLOWED_HOSTS
в дополнение к моему доменному имени? Любая идея, что будет делать запросы с HTTP_HOST = "ip address"
, а не HTTP_HOST = "domain name"
?
Вот среда запроса:
{'HTTP_ACCEPT_ENCODING': "'identity'",
'HTTP_CONNECTION': "'close'",
'HTTP_HOST': "'168.62.208.14'",
'HTTP_X_FORWARDED_PROTOCOL': "'https'",
'HTTP_X_REAL_IP': "'176.10.35.241'",
'HTTP_X_SCHEME': "'https'",
'PATH_INFO': "u'/'",
'QUERY_STRING': "''",
'RAW_URI': "'/'",
'REMOTE_ADDR': "'127.0.0.1'",
'REMOTE_PORT': "'45068'",
'REQUEST_METHOD': "'GET'",
'SCRIPT_NAME': "u''",
'SERVER_NAME': "'168.62.208.14'",
'SERVER_PORT': "'80'",
'SERVER_PROTOCOL': "'HTTP/1.0'",
'SERVER_SOFTWARE': "'gunicorn/0.14.6'",
'gunicorn.socket': "'<socket._socketobject object at 0x7ab3b40>'",
'wsgi.errors': '"<open file \'<stderr>\', mode \'w\' at 0x7f0c94810270>"',
'wsgi.file_wrapper': "'<class gunicorn.http.wsgi.FileWrapper at 0x34eec80>'",
'wsgi.input': "'<gunicorn.http.body.Body object at 0x2a0bf10>'",
'wsgi.multiprocess': 'False',
'wsgi.multithread': 'False',
'wsgi.run_once': 'False',
'wsgi.url_scheme': "'http'",
'wsgi.version': '[1, 0]'}
Ответы
Ответ 1
Короткий ответ ДА (в соответствии с предоставленными заголовками).
Длинный ответ:
Согласно документация:
Если заголовок Host (или X-Forwarded-Host, если USE_X_FORWARDED_HOST включен) не соответствует никакому значению в этом списке, метод django.http.HttpRequest.get_host() вызовет SuspiciousOperation.
Другими словами: если ваши запросы передают ваш IP-адрес сервера как заголовок Host (и, по-видимому, они это делают), и вы думаете, что все в порядке, тогда ДА, вы должны добавить сервер ip в ALLOWED_HOSTS.
Также, адрес ip может быть в HTTP_HOST для причинам, также кто-то может напрямую запросить IP-адрес.
Ответ 2
На практике просто отредактируйте файл MyProjectName/settings.py
и добавьте IP-адрес хоста (IP-адрес на компьютер, на котором запущен Django), в список ALLOWED_HOSTS
, который по умолчанию пуст.
Итак, в вашем случае мы имели бы до изменений:
...
ALLOWED_HOSTS = []
...
После изменений:
...
ALLOWED_HOSTS = ['168.62.208.14'] #Make sure your host IP is a string
...
Запустите сервер снова, и вы должны быть хорошими. Вот пример использования порта 8000:
python manage.py runserver 168.62.208.14:8000
. Теперь, если вы перейдете в свой браузер и введите адрес http://168.62.208.14:8000, вы должны найти себя на странице "Поздравляем с вашей первой страницей на Django".
Ответ 3
Нет, он не должен
По умолчанию нет причин, по которым IP-адрес должен приниматься как допустимый заголовок HOST. Это сообщение является признаком неправильно сконфигурированной рабочей среды: такие запросы не должны доходить до конца.
Вот сообщение на security.stackexchange.com на Отравление заголовка узла и ALLOWED_HOSTS.
Что делать
Отфильтруйте все запросы с недопустимым заголовком HOST, прежде чем они достигнут back-end django.
Как
Скорее всего, вы используете nginx
как обратный прокси-сервер перед django. Если вы вообще не используете никакого обратного прокси (или используете runserver
), вы должны (в противном случае вы рискуете своей безопасностью).
Добавьте блок сервера по умолчанию, возвращающий 444
в верхней части вашей конфигурации. Он должен быть первым серверным блоком в конфигурации:
# File: /etc/nginx/sites-available/domain.com
upstream django_server {
server 127.0.0.1:8000;
}
# Catch all requests with an invalid HOST header
server {
server_name "";
listen 80;
return 444;
}
# Your config goes there
server {
server_name domain.com;
listen 80;
location / {
proxy_pass http://django_server;
}
}