loggers log english documentacion docu django logging http-host

log - ¿Cómo deshabilitar el error HTTP_HOST de Django?



loggers django (10)

Aquí está el ejemplo de NGINX que debería evitar que su django reciba solicitudes de basura.

server { listen 80 default_server; server_name _; return 418; } server { listen 80; # This will keep Django from receiving request with invalid host server_name <SERVER_IP> your.domain.com; ...

Desde que implementé un sitio que ejecutaba Django 1.7 alpha (desprotegido de Git), ocasionalmente he recibido mensajes de error con títulos como:

"Cabecera HTTP_HOST no válida: ''xxx.xxx.com''"

Me doy cuenta de que esto se debe a que el Host: encabezado HTTP se establece en un nombre de host que no figura en ALLOWED_HOSTS . Sin embargo, no tengo control sobre cuándo y con qué frecuencia alguien envía una solicitud al servidor con un nombre de host falso. Por lo tanto, no necesito un montón de correos electrónicos de error para decirme que otra persona está intentando hacer algo sospechoso.

¿Hay alguna forma de desactivar este mensaje de error? La configuración de registro para el proyecto se ve así:

LOGGING = { ''version'': 1, ''disable_existing_loggers'': False, ''filters'': { ''require_debug_false'': { ''()'': ''django.utils.log.RequireDebugFalse'' } }, ''handlers'': { ''mail_admins'': { ''level'': ''ERROR'', ''filters'': [''require_debug_false''], ''class'': ''django.utils.log.AdminEmailHandler'' } }, ''loggers'': { ''django.request'': { ''handlers'': [''mail_admins''], ''level'': ''ERROR'', ''propagate'': True, }, } }


En set setting.py:

ALLOWED_HOSTS = [''yourweb.com'']


Las otras respuestas en esta página son correctas si simplemente busca ocultar o deshabilitar la advertencia. Si está permitiendo intencionalmente cada nombre de host, el valor especial de * se puede usar como la configuración ALLOWED_HOSTS .

Para evitar que la verificación del nombre de host sea completa, agregue la siguiente línea a su settings.py :

ALLOWED_HOSTS = [''*'']

Fuente: https://github.com/django/django/blob/master/django/http/request.py#L544-L563

def validate_host(host, allowed_hosts): """ Validate the given host for this site. Check that the host looks valid and matches a host or host pattern in the given list of ``allowed_hosts``. Any pattern beginning with a period matches a domain and all its subdomains (e.g. ``.example.com`` matches ``example.com`` and any subdomain), ``*`` matches anything, and anything else must match exactly. Note: This function assumes that the given host is lower-cased and has already had the port, if any, stripped off. Return ``True`` for a valid host, ``False`` otherwise. """ for pattern in allowed_hosts: if pattern == ''*'' or is_same_domain(host, pattern): return True return False


No deberías ignorar este error. En su lugar, deberías negar la solicitud antes de que llegue a tu back-end de Django. Para denegar solicitudes sin un conjunto HOST , puede usar

SetEnvIfNoCase Host .+ VALID_HOST Order Deny,Allow Deny from All Allow from env=VALID_HOST

o forzar la coincidencia con un dominio en particular (example.com)

SetEnvIfNoCase Host example/.com VALID_HOST Order Deny,Allow Deny from All Allow from env=VALID_HOST


No puedo comentar todavía, pero dado que Order Deny, Allow está en desuso, la forma de hacerlo en un host virtual con la directiva Require actual es:

<Directory /var/www/html/> SetEnvIfNoCase Host example/.com VALID_HOST Require env VALID_HOST Options </Directory>


Otra forma de bloquear solicitudes con un encabezado host no válido antes de que llegue a Django es usar una configuración predeterminada de Apache con un <VirtualHost> que no hace más que devolver un 404.

<VirtualHost *:80> </VirtualHost>

Si define esto como su primer host virtual (por ejemplo, en 000-default.conf) y luego lo sigue con su ''real'' <VirtualHost> , complete con un <ServerName> y cualquier entrada < ServerAlias> que quiera hacer coincidir, Apache devolverá un 404 para cualquier solicitud con un encabezado de Host que no coincida con <ServerName> o una de sus entradas de <ServerAlias> . La clave es asegurarse de que el valor predeterminado, 404 <VirtualHost> se defina primero, ya sea por nombre de archivo (''000'') o la primera entrada en su archivo de configuración.

Me gusta más que la popular solución anterior porque es muy explícita y fácil de ampliar.


Puede agregar esto a la sección de loggers de su configuración de registro:

''django.security.DisallowedHost'': { ''handlers'': [''mail_admins''], ''level'': ''CRITICAL'', ''propagate'': False, },

Esto establece el umbral de registro por encima del nivel de ERROR que Django usa cuando se detecta una SuspiciousOperation .

Alternativamente, puede usar, por ejemplo, un FileHandler para registrar estos eventos sin enviarlos por correo electrónico. Por ejemplo, para usar un archivo dedicado solo para estos eventos específicos, puede agregar esto a la sección de handlers :

''spoof_logfile'': { ''level'': ''ERROR'', ''class'': ''logging.FileHandler'', ''filename'': ''/path/to/spoofed_requests.log'', },

y luego usar esto en la sección de loggers :

''django.security.DisallowedHost'': { ''handlers'': [''spoof_logfile''], ''level'': ''ERROR'', ''propagate'': False, },

Tenga en cuenta que la sugerencia hecha en los documentos de Django , para usar

''django.security.DisallowedHost'': { ''handlers'': [''null''], ''propagate'': False, },

depende de que ejecute Python 2.7 o posterior: en 2.6, el logging no tiene un NullHandler .


Usando Apache 2.4, no hay necesidad de usar mod_setenvif. El HTTP_HOST ya es una variable y se puede evaluar directamente:

WSGIScriptAlias / /path/to/wsgi.py <Directory /path/to> <Files wsgi.py> Require expr %{HTTP_HOST} == "example.com" </Files> </Directory>


para múltiples hosts válidos puedes:

SetEnvIfNoCase Host example/.com VALID_HOST SetEnvIfNoCase Host example2/.com VALID_HOST SetEnvIfNoCase Host example3/.com VALID_HOST Require env VALID_HOST


podrías silenciar esa particular SuspiciousOperation con algo así como

''loggers'': { ''django.security.DisallowedHost'': { ''handlers'': [''null''], ''propagate'': False, },

vea esto para más referencia https://docs.djangoproject.com/en/dev/topics/logging/#django-security

EDITAR

también necesita agregar un controlador ''nulo'':

''handlers'': { ''null'': { ''level'': ''DEBUG'', ''class'': ''logging.NullHandler'', }, }

probablemente solo necesite agregar esto y modificar el nivel de error (reemplazando a DEBUG con ''ERROR'').

como siempre, consulte la documentation para la sintaxis y semántica completas.