С момента введения установки ALLOWED_HOSTS в django 1.4.4 я получаю много писем с ошибками django на мой адрес администратора для исключений, вызванных каким-то глупым пауком, который ищет уязвимые установки phpMyAdmin или что-то подобное. Эти письма полностью действительны, поскольку заголовки хостов в запросах пауков действительно ошибочны, но я предпочел бы, чтобы django отправлял мне сообщения об ошибках, когда что-то не так. Есть ли простой способ отключить почту SuspiciousOperation
, или мне нужно пройти весь путь и подкласс CommonMiddleware
?
Подавление электронной почты администратора по исключению django ALLOWED_HOSTS
Ответ 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 не будет исправления, существует обходной путь с использованием фильтра журнала.
Ответ 5
Но подождите, там есть приложение для этого!
Ответ 6
Поэтому я обычно предпочитаю просто перенаправлять всех непревзойденных vhosts на один vhost. это делается с простым дополнением к файлу apache.conf...
<VirtualHost *:80>
RedirectMatch ^/?(.*) http://www.example.com/$1
</VirtualHost>
Приведенный выше пример приведет к тому, что любой непревзойденный vhost будет перенаправлен на http://www.example.com, сохраняя при этом правильный компонент пути.
Это также имеет дополнительное преимущество для исправления случая, когда пользователь выполняет недопустимый запрос или какую-то такую вещь.