Недопустимый заголовок HTTP_HOST для SuspiciousOperation в Django

После обновления до 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?

87 голосов | спросил Derek Kwok 6 MaramWed, 06 Mar 2013 07:35:26 +04002013-03-06T07:35:26+04:0007 2013, 07:35:26

4 ответа


0

Если ваш ALLOWED_HOSTS установлено правильно, поэтому возможно, что кто-то проверяет ваш сайт на наличие уязвимости, подделывая заголовок.

В настоящее время разработчики Django обсуждают, как изменить внутреннюю ошибку сервера 500 на ответ 400. Просмотрите этот билет .

ответил Brian Neal 20 MarpmWed, 20 Mar 2013 19:14:33 +04002013-03-20T19:14:33+04:0007 2013, 19:14:33
0

Если вы используете Nginx для пересылки запросов в Django, работающий на Gunicorn /Apache /uWSGI, вы можете использовать следующее для блокировки неверных запросов. Спасибо @PaulM за предложение и это сообщение в блоге для примера.

upstream app_server {
    server unix:/tmp/gunicorn_mydomain.com.sock fail_timeout=0;
}

server {

    ...

    ## Deny illegal Host headers
    if ($host !~* ^(mydomain.com|www.mydomain.com)$ ) {
        return 444;
    }

    location  / {
        proxy_pass               http://app_server;
        ...
    }

}
ответил Brent 5 J000000Friday13 2013, 00:00:44
0

При использовании Nginx вы можете настроить свои серверы так, чтобы запросы только к тем хостам, которые вы хотите, в первую очередь попадали в Django. Это больше не должно вызывать ошибок в SuspiciousOperation.

server {
    # default server

    listen 80;
    server_name _ default;

    return 444;
}
server {
    # redirects

    listen 80;
    server_name example.com old.stuff.example.com;

    return 301 http://www.example.com$request_uri;
}
server {
    # app

    listen 80;
    server_name www.example.com; # only hosts in ALLOWED_HOSTS here

    location  / {
        # ...
    }
    # ... your config/proxy stuff
}
ответил webjunkie 31 +04002013-10-31T14:17:05+04:00312013bEurope/MoscowThu, 31 Oct 2013 14:17:05 +0400 2013, 14:17:05
0

Это исправлено в новых версиях Django, но если вы используете уязвимую версию (например, 1.5), вы можете добавить фильтр в обработчик логгера, чтобы избавиться от них, как описано в this в блоге.

Спойлер:

from django.core.exceptions import SuspiciousOperation

def skip_suspicious_operations(record):
  if record.exc_info:
    exc_value = record.exc_info[1]
    if isinstance(exc_value, SuspiciousOperation):
      return False
  return True

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse',
        },
        # Define filter
        'skip_suspicious_operations': {
            '()': 'django.utils.log.CallbackFilter',
            'callback': skip_suspicious_operations,
        },
    },
    'handlers': {
        'mail_admins': {
            'level': 'ERROR',
            # Add filter to list of filters
            'filters': ['require_debug_false', 'skip_suspicious_operations'],
            'class': 'django.utils.log.AdminEmailHandler'
        }
    },
    'loggers': {
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
    }
}
ответил mgalgs 23 +04002013-10-23T10:51:02+04:00312013bEurope/MoscowWed, 23 Oct 2013 10:51:02 +0400 2013, 10:51:02

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132