2013-03-13 2 views
12

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

ответ

1

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

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

До тех пор, пока исправление в (надеюсь) Django 1.5.1, есть workaround с участием фильтр журнала.

+1

Эта ошибка не направлена ​​на отправку электронного сообщения о подозрительной операции - речь идет о отправке ответа «500» вместо «400». Он был исправлен в Django 1.6, но электронная почта администратора по-прежнему создается. – Nils

3

Если вы используете 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)

+1

Это отличная идея, но я нахожусь на совместном хостинге, к сожалению ... – Simon

6

Для подавления администратора электронной почты, определить протоколирования фильтр:

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

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

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

и добавить тыс e фильтру к обработчику mail_admins:

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

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

+0

Я думаю, вам также нужны «регистраторы» с ключом для «django.security» внутри dictging LOGGING, чтобы фактически поймать эти сообщения. –

+0

Почему вы проверяете record.name вместо isinstance (запись, DisallowedHost)? –

20

Для полноты можно переопределить части протоколирования: (проверено на Джанго 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 security docs.

0

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

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

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

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

Смежные вопросы