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

Подавление электронной почты администратора по исключению django ALLOWED_HOSTS

С момента введения установки ALLOWED_HOSTS в django 1.4.4 я получаю много писем с ошибками django на мой адрес администратора для исключений, вызванных каким-то глупым пауком, который ищет уязвимые установки phpMyAdmin или что-то подобное. Эти письма полностью действительны, поскольку заголовки хостов в запросах пауков действительно ошибочны, но я предпочел бы, чтобы django отправлял мне сообщения об ошибках, когда что-то не так. Есть ли простой способ отключить почту SuspiciousOperation, или мне нужно пройти весь путь и подкласс CommonMiddleware?

4b9b3361

Ответ 1

Для полноты вы можете переопределить части ведения журнала: (проверено на django 1.6):

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'null': {
            'level': 'DEBUG',
            'class': 'logging.NullHandler',
        },
    },
    'loggers': {
        'django.security.DisallowedHost': {
            'handlers': ['null'],
            'propagate': False,
        },
    },
}

Также см. Документы безопасности Django.

Ответ 2

Чтобы подавить электронную почту администратора, определите фильтр регистрации:

def skip_suspicious_operations(record):
    if record.name == 'django.security.DisallowedHost':
        return False
    return True

Затем в settings.py добавьте его в LOGGING dict в качестве фильтра:

'filters': {
    'skip_suspicious_operations': { 
        '()': 'django.utils.log.CallbackFilter',
        'callback': skip_suspicious_operations,
    }
}

и добавьте фильтр в обработчик mail_admins:

'handlers': {
    'mail_admins': {
        'level': 'ERROR',
        'filters': ['skip_suspicious_operations'],
        'include_html' : True,
    }
}

Это работает в Django 1.6 как есть. В Django-1.5 я думаю, что RHS сравнения с record.name немного отличается, но в противном случае он должен работать.

Ответ 3

Apache

Если вы используете Apache, вы можете отфильтровать трафик к различным хостам из httpd.conf - это гораздо более простое решение, чем написание любого кода. Что-то вроде

WSGIPythonPath [your Python path]
ServerSignature Off
ServerTokens Prod

<VirtualHost *:80>
    DocumentRoot /var/www
</VirtualHost>

<VirtualHost *:80>
    ServerName www.myrealhost.com
    rest of apache configuration ....
</VirtualHost>

Первая настройка будет захватывать все, что не соответствует имени вашего сервера (например, www.myrealhost.com)

Nginx

Вы можете использовать тот же подход в nginx для фильтрации трафика к различным хостам в вашем файле конфигурации, используя директиву server_name, например

server {
    # the port your site will be served on
    listen      80;

    # the domain name it will serve for
    server_name www.myrealhost.com;  # optionally include localhost here for local testing

    ...the rest of your nginx config for Django
}
server {
     # You need to provide a default server for all other traffic
    listen 80 default_server;
    server_name  _;

    # If you need a healthcheck route that works with any hostname, unncomment
    # the next three lines
l   #location = /healthcheck {
    #    return 200;
    #}
    location / {
        return 444;
    }
 }

Ответ 4

Немного поискового робота показало бы, что в нем есть ошибка в отслеживании ошибок Django:

https://code.djangoproject.com/ticket/19866

До тех пор, пока в Django 1.5.1 не будет исправления, существует обходной путь с использованием фильтра журнала.

Ответ 6

Поэтому я обычно предпочитаю просто перенаправлять всех непревзойденных vhosts на один vhost. это делается с простым дополнением к файлу apache.conf...

<VirtualHost *:80>
    RedirectMatch ^/?(.*) http://www.example.com/$1
</VirtualHost>

Приведенный выше пример приведет к тому, что любой непревзойденный vhost будет перенаправлен на http://www.example.com, сохраняя при этом правильный компонент пути.

Это также имеет дополнительное преимущество для исправления случая, когда пользователь выполняет недопустимый запрос или какую-то такую ​​вещь.