2013-03-13 8 views
12

Od wprowadzenia ALLOWED_HOSTS ustawień w Django 1.4.4, dostaję dużo maili błędów Django na mój adres administratora wyjątków wywołanych przez jakiegoś głupiego pająka szuka wrażliwych instalacji phpMyAdmin lub somesuch. Te wiadomości są całkowicie poprawne, ponieważ nagłówki hostów w żądaniach pająków są rzeczywiście błędne, ale wolałbym, aby django wysyłał mi tylko komunikaty o błędach, gdy ważne rzeczy się nie powiodą. Czy istnieje prosta metoda, aby uciszyć maile, czy też muszę przejść całą drogę i podklasę CommonMiddleware?zwalczaniu Administrator e-mail na django ALLOWED_HOSTS wyjątkiem

Odpowiedz

1

Trochę googlowania by wykazały, że nie ma już błąd w Django bug tracker na to:

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

Dopóki nie będzie naprawić w (miejmy nadzieję) Django 1.5.1, istnieje workaround udziałem filtr dziennika.

+1

Błąd ten nie dotyczy wysłania wiadomości e-mail dotyczącej podejrzanej operacji - chodzi o wysłanie odpowiedzi "500" zamiast "400". Zostało to naprawione w Django 1.6, ale e-mail administratora jest nadal generowany. – Nils

3

Jeśli używasz Apache możesz filtrować ruch do różnych hostów z httpd.conf - jest to o wiele prostsze rozwiązanie niż pisanie jakiegokolwiek kodu. Coś jak

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> 

Pierwsze ustawienie przechwyci wszystko, co nie pasuje do nazwy serwera (np www.myrealhost.com)

+1

To świetny pomysł, ale niestety udostępniam hosting ... – Simon

6

Aby stłumić e-mail administratora, zdefiniować filtr rejestrowania:

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

Następnie w settings.py dodaj go do dict pozyskiwania drewna filtra:

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

i dodać th e filtr do programu obsługi mail_admins:

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

Działa w Django 1.6, jak jest. W Django-1.5 myślę, że RHS porównania z record.name jest trochę inne, ale w przeciwnym razie powinno działać.

+0

Myślę, że potrzebujesz również "rejestratorów" z kluczem dla "django.security" wewnątrz DYSKU LOGOWANIA, aby faktycznie złapać te wiadomości. –

+0

dlaczego sprawdzasz record.name zamiast isinstance (record, DisallowedHost)? –

20

Dla kompletności można zastąpić części logowania: (testowane na 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, 
     }, 
    }, 
} 

zobaczyć również Django security docs.

0

Zazwyczaj wolę przekierować wszystkie niedopasowane vhosty do pojedynczego vhosta. odbywa się to za pomocą prostego oprócz pliku apache.conf ...

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

Powyższy przykład spowodowałoby żądanie każdej niezrównaną vhost przekierować do http://www.example.com, zachowując składnik ścieżki poprawnie.

Ma to również dodatkową zaletę polegającą na korygowaniu przypadku, w którym użytkownik śledzi nieprawidłowe żądanie lub coś takiego.

Powiązane problemy