Setelah meningkatkan ke Django 1.5, saya mulai mendapatkan kesalahan seperti ini:
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)}>
Saya telah mengatur ALLOWED_HOSTS = ['.derekkwok.net']
di file settings.py saya.
Apa yang terjadi disini? Apakah seseorang yang berpura-pura menjadi Google dan mengakses situs saya? Atau apakah ini kasus jinak dari seseorang yang salah menyetel header HTTP_HOST mereka?
Jawaban:
Jika Anda
ALLOWED_HOSTS
disetel dengan benar, maka mungkin seseorang sedang menyelidiki situs Anda untuk mengetahui kerentanannya dengan memalsukan header.Ada diskusi sekarang oleh para pengembang Django untuk mengubah ini dari kesalahan server internal 500 menjadi respon 400. Lihat tiket ini .
sumber
Jika Anda menggunakan Nginx untuk meneruskan permintaan ke Django yang berjalan pada Gunicorn / Apache / uWSGI, Anda dapat menggunakan yang berikut ini untuk memblokir permintaan yang buruk. Terima kasih kepada @PaulM untuk saran dan posting blog ini sebagai contoh.
sumber
if
dalamserver
blok dan bukan di dalamlocation
blok. Apakah itu berartiif
tidak apa-apa dalam hal ini?Saat menggunakan Nginx Anda dapat menyiapkan server Anda dengan cara yang hanya meminta ke host yang Anda inginkan ke Django terlebih dahulu. Itu seharusnya tidak memberi Anda kesalahan SuspiciousOperation lagi.
sumber
if
pendekatan yang disarankan oleh Brent, tetapi saya tidak bisa membuatnya bekerja dengan port 443. Saya mencoba meniru saran Anda (dengan port mendengarkan berubah), dan situs SSL saya yang sebenarnya tidak memuat - itu tertangkap oleh entri ini saya tambahkan. ada ide bagaimana cara memperbaikinya?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
(dengan Django 1.8.x)Ini diperbaiki dalam versi terbaru Django, tetapi jika Anda menggunakan versi yang terpengaruh (mis. 1.5) Anda dapat menambahkan filter ke penangan pencatat Anda untuk menyingkirkan ini, seperti yang dijelaskan dalam posting blog ini .
Spoiler:
sumber