Подтвердить что ты не робот

Должен ли 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]'}
4b9b3361

Ответ 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;
    }
}