Après la mise à niveau vers Django 1.5, j'ai commencé à recevoir des erreurs comme celle-ci:
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 92, in get_response
response = middleware_method(request)
File "/usr/local/lib/python2.7/dist-packages/django/middleware/common.py", line 57, in process_request
host = request.get_host()
File "/usr/local/lib/python2.7/dist-packages/django/http/request.py", line 72, in get_host
"Invalid HTTP_HOST header (you may need to set ALLOWED_HOSTS): %s" % host)
SuspiciousOperation: Invalid HTTP_HOST header (you may need to set ALLOWED_HOSTS): www.google.com
<WSGIRequest
path:/,
GET:<QueryDict: {}>,
POST:<QueryDict: {}>,
COOKIES:{},
META:{'CONTENT_LENGTH': '',
'CONTENT_TYPE': '',
'DOCUMENT_ROOT': '/etc/nginx/html',
'HTTP_ACCEPT': 'text/html',
'HTTP_HOST': 'www.google.com',
'HTTP_PROXY_CONNECTION': 'close',
'HTTP_USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)',
'PATH_INFO': u'/',
'QUERY_STRING': '',
'REMOTE_ADDR': '210.245.91.104',
'REMOTE_PORT': '49347',
'REQUEST_METHOD': 'GET',
'REQUEST_URI': '/',
u'SCRIPT_NAME': u'',
'SERVER_NAME': 'www.derekkwok.net',
'SERVER_PORT': '80',
'SERVER_PROTOCOL': 'HTTP/1.0',
'uwsgi.node': 'derekkwok',
'uwsgi.version': '1.4.4',
'wsgi.errors': <open file 'wsgi_errors', mode 'w' at 0xb6d99c28>,
'wsgi.file_wrapper': <built-in function uwsgi_sendfile>,
'wsgi.input': <uwsgi._Input object at 0x953e698>,
'wsgi.multiprocess': True,
'wsgi.multithread': False,
'wsgi.run_once': False,
'wsgi.url_scheme': 'http',
'wsgi.version': (1, 0)}>
J'ai défini ALLOWED_HOSTS = ['.derekkwok.net']
dans mon fichier settings.py.
Qu'est-ce qui se passe ici? Est-ce que quelqu'un prétend être Google et accède à mon site? Ou est-ce un cas bénin de quelqu'un qui définit son en-tête HTTP_HOST de manière incorrecte?
Réponses:
Si votre
ALLOWED_HOSTS
est configuré correctement, il est possible que quelqu'un sonde votre site pour la vulnérabilité en usurpant l'en-tête.Il y a actuellement des discussions entre les développeurs de Django pour changer cela d'une erreur de serveur interne 500 à une réponse 400. Voir ce ticket .
la source
Si vous utilisez Nginx pour transférer des requêtes à Django fonctionnant sur Gunicorn / Apache / uWSGI, vous pouvez utiliser ce qui suit pour bloquer les mauvaises requêtes. Merci à @PaulM pour la suggestion et cet article de blog pour un exemple.
la source
if
intérieur duserver
bloc et non dans lelocation
bloc. Cela signifie-t-il que çaif
va dans ce cas?Lorsque vous utilisez Nginx, vous pouvez configurer vos serveurs de manière à ne demander que les hôtes que vous souhaitez accéder à Django en premier lieu. Cela ne devrait plus vous donner d'erreurs SuspiciousOperation.
la source
if
approche suggérée par Brent, mais je ne peux pas la faire fonctionner avec le port 443. J'ai essayé d'imiter votre suggestion (avec le port d'écoute modifié), et mon site SSL actuel ne se charge pas - il est capturé par cette entrée que j'ai ajoutée. Des idées sur comment réparer?server { listen 80 default_server; listen 443; server_name _; ssl_certificate /path/to/file.crt; ssl_certificate_key /path/to/file.key; return 444; }
Invalid HTTP_HOST header
(avec Django 1.8.x)Ceci est corrigé dans les versions plus récentes de Django, mais si vous utilisez une version affectée (par exemple 1.5), vous pouvez ajouter un filtre à votre gestionnaire de journalisation pour vous en débarrasser, comme indiqué dans ce billet de blog.
Divulgacher:
la source