2013-03-13 2 views
12

Seit der Einführung der ALLOWED_HOSTS Einstellung in Django 1.4.4, bekomme ich eine Menge von Django Fehler E-Mails an meine Admin-Adresse für Ausnahmen durch einige alberne Spinne auf der Suche nach vulnerable phpMyAdmin-Installationen oder dergleichen. Diese E-Mails sind absolut gültig, da die Host-Header in den Anfragen der Spiders in der Tat falsch sind, aber ich würde lieber django senden Sie mir nur Fehlermeldungen, wenn wichtige Dinge schief gehen. Gibt es eine einfache Methode zum Schweigen zu bringen SuspiciousOperation Mails, oder muss ich den ganzen Weg gehen und Unterklasse CommonMiddleware?Unterdrücken Admin E-Mail auf Django ALLOWED_HOSTS Ausnahme

Antwort

1

hätte ein bisschen Googeln ergab, dass es bereits einen Fehler in dieser für Tracker Djangos Fehler:

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

Bis es ein Update in (hoffentlich) Django ist 1.5.1, gibt es eine ist workaround Beteiligung ein Protokollfilter

+1

Dieser Bug adressiert nicht das Versenden einer E-Mail bei verdächtigen Operationen - es geht darum, eine '500' Antwort anstelle einer '400' zu senden. Es wurde in Django 1.6 behoben, aber eine Admin-E-Mail wird noch generiert. – Nils

3

Wenn Sie Apache verwenden, können Sie den Verkehr zu verschiedenen Hosts aus der httpd.conf filtern - das ist eine viel einfachere Lösung als das Schreiben von Code. So etwas wie

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> 

Die erste Einstellung wird alles greifen, die nicht Ihren Servernamen Übereinstimmen (zB www.myrealhost.com)

+1

Das ist eine großartige Idee, aber ich teile leider das Hosting ... – Simon

6

die Admin-E-Mail zu unterdrücken, definiert einen Protokollierungsfilter:

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

Dann in settings.py fügen sie es dem LOGGING dict als Filter:

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

und fügen th e filter zum mail_admins handler:

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

Dies funktioniert in Django 1.6 wie es ist. In Django-1.5 finde ich das RHS des Vergleichs mit record.name ein wenig anders, aber ansonsten sollte es funktionieren.

+0

Ich denke, Sie brauchen auch eine 'Logger' mit einem Schlüssel für 'django.security' innerhalb der LOGGING-Diktat, um diese Nachrichten tatsächlich zu fangen. –

+0

Warum überprüfen Sie record.name anstelle von isinstance (record, DisallowedHost)? –

20

Der Vollständigkeit halber können Sie Teile der Protokollierung außer Kraft setzen: (getestet auf 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, 
     }, 
    }, 
} 

Auch Django security docs sehen.

0

Daher bevorzuge ich normalerweise alle unmatched vhosts nur zu einem einzigen vhost umleiten. dies wird mit einem einfachen Neben der apache.conf Datei getan ...

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

Das obige Beispiel würde eine Anfrage zu jeder alleinstehenden vHost http://www.example.com, umgeleitet werden, während die Pfadkomponente richtig halten.

Dies hat auch den zusätzlichen Vorteil, den Fall zu korrigieren, in dem ein Benutzer einer ungültigen Anfrage oder dergleichen folgt.