Django का संदेहास्पद अमान्य अमान्य HTTP_HOST शीर्षक


95

Django 1.5 में अपग्रेड करने के बाद, मुझे इस तरह की त्रुटियां होने लगीं:

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)}>

मैंने ALLOWED_HOSTS = ['.derekkwok.net'] अपनी सेटिंग्स फ़ाइल में सेट किया है।

यहाँ क्या हो रहा है? यह किसी ने Google होने और मेरी साइट तक पहुँचने का नाटक कर रहा है? या क्या यह किसी के लिए अपने HTTP_HOST हेडर को गलत तरीके से सेट करने का एक सौम्य मामला है?


क्या आपने यह पता लगाया कि इसे कैसे ठीक किया जाए? उसी समस्या का सामना करना। इन त्रुटियों में से लगभग हर दिन लॉग इन करना। कोई बात नहीं अगर यह कुछ है जिसके बारे में मुझे चिंता करने की ज़रूरत है।
अंधा

3
यह ब्लॉग पोस्ट ईमेलों को रोकने का एक अच्छा तरीका प्रदान करता है: tiwoc.de/blog/2013/03/…
Derek Kwok

जवाबों:


64

यदि आपका ALLOWED_HOSTSसेट सही ढंग से सेट है, तो यह संभव है कि कोई व्यक्ति हेडर को खराब करके आपकी साइट को भेद्यता के लिए जांच रहा है।

500 आंतरिक सर्वर त्रुटि से 400 प्रतिक्रिया में इसे बदलने के लिए Django डेवलपर्स द्वारा अभी चर्चा है। इस टिकट को देखें ।


1
मुझे लगता है कि वेब क्रॉलर (रोबोट) पोर्ट 80 पर सार्वजनिक आईपी पते को क्रॉल करने की अधिक संभावना है - जिस स्थिति में आप उन्हें अनुमति देना चाहते हैं।
markmnl

16
@markmnl एक वैध वेब क्रॉलर मेजबान हेडर फोर्जिंग नहीं होना चाहिए।
ब्रायन नील

1
यह सिर्फ आईपी पते का उपयोग कर कनेक्ट कर रहा है डोमेन नाम नहीं और आईपी पता ALLOWED_HOSTS में नहीं है - या कम से कम मेरे साथ ऐसा ही हो रहा है - मैं इसे अपने ब्राउज़र को आईपी पते पर भेज सकता हूं।
मार्मनल

हां। और किसी भी आधे व्यस्त साइट में, यह हर दिन पूरे दिन होता है। उन्होंने इसे अब ठीक कर लिया है, लेकिन यहां एक "ड्रॉप-इन" ऐप है जो इसे सभी संस्करणों के साथ-साथ एक त्रुटि दर फिल्टर के साथ सॉर्ट करता है। github.com/litchfield/django-safelogging
s29

इंटरनेट पर मेरी वेबसाइट को तैनात करने के बाद। मैंने पाया कि बहुत सारे लोग अमान्य होस्ट का उपयोग करके मेरी वेबसाइट तक पहुंचने की कोशिश कर रहे हैं। न केवल आईपी पते का उपयोग करना। मुझे लगता है कि यह कुछ लोग हो सकते हैं जो एक ऐसी वेबसाइट खोजने की कोशिश कर रहे हैं जो सीएसआरएफ के हमले का बचाव न कर सके।
रामविनय

130

यदि आप गिंजोर्न / अपाचे / uWSGI पर चलने वाले Django के लिए निगनेक्स को आगे के अनुरोधों के लिए उपयोग कर रहे हैं, तो आप खराब अनुरोधों को ब्लॉक करने के लिए निम्न का उपयोग कर सकते हैं। सुझाव के लिए @PaMM और एक उदाहरण के लिए इस ब्लॉग पोस्ट के लिए धन्यवाद ।

upstream app_server {
    server unix:/tmp/gunicorn_mydomain.com.sock fail_timeout=0;
}

server {

    ...

    ## Deny illegal Host headers
    if ($host !~* ^(mydomain.com|www.mydomain.com)$ ) {
        return 444;
    }

    location  / {
        proxy_pass               http://app_server;
        ...
    }

}

7
डॉक्स संकेत संकेत में सुधार के रूप में इसे देखना उत्कृष्ट होगा :)
पॉल मैकमिलन

1
@webjunkie, आपके लिंक से, "ऐसे मामले हैं जहां आप बस एक का उपयोग करने से बच नहीं सकते हैं, उदाहरण के लिए यदि आपको एक चर का परीक्षण करने की आवश्यकता है जिसमें कोई समान निर्देश नहीं है।" मेरा उदाहरण इसे सही ढंग से उपयोग करता है और मेरे उत्पादन वातावरण में अच्छा काम करता है। तो निष्कर्ष में, इसे इस तरह से करो! :)
ब्रेंट ओ'कॉनर

2
वैसे आप आसानी से इससे बच सकते हैं: बस आपको केवल आवश्यक सर्वर_नाम निर्दिष्ट करें, और बाकी को एक डिफ़ॉल्ट सर्वर हैंडलर द्वारा नियंत्रित किया जाए।
webjunkie

1
इसी तरह के अपाचे कॉन्फ़िगरेशन के लिए यह उत्तर देखें: stackoverflow.com/a/18792080
डेनिलसन सिया मिया

1
वेबजंकी द्वारा दिए गए लिंक से: "निर्देश यदि स्थान संदर्भ में उपयोग किए जाने पर समस्या है"। ब्रेंट द्वारा दिया गया उदाहरण ब्लॉक के ifअंदर का उपयोग करता है serverन कि locationब्लॉक का। इसका मतलब यह है कि ifइस उदाहरण में ठीक है?
ब्रायन बक

31

Nginx का उपयोग करते समय आप अपने सर्वर को एक तरह से केवल उन मेजबानों के लिए अनुरोध कर सकते हैं जिन्हें आप पहली बार में Django में प्राप्त करना चाहते हैं। अब आपको कोई संदेहास्पद त्रुटि नहीं देनी चाहिए।

server {
    # default server

    listen 80;
    server_name _ default;

    return 444;
}
server {
    # redirects

    listen 80;
    server_name example.com old.stuff.example.com;

    return 301 http://www.example.com$request_uri;
}
server {
    # app

    listen 80;
    server_name www.example.com; # only hosts in ALLOWED_HOSTS here

    location  / {
        # ...
    }
    # ... your config/proxy stuff
}

2
मुझे ifब्रेंट द्वारा सुझाए गए दृष्टिकोण का उपयोग करने पर यह दृष्टिकोण पसंद है , लेकिन मैं इसे पोर्ट 443 के साथ काम करने के लिए नहीं पा सकता हूं। मैंने आपके सुझाव की नकल करने की कोशिश की (सुनो पोर्ट बदल गया) के साथ, और मेरी वास्तविक एसएसएल साइट लोड नहीं होती है - यह मुझे इस प्रविष्टि द्वारा कब्जा कर लिया गया। कोई सुझाव कि इसे कैसे ठीक किया जाए?
Dolan Antenucci

1
ServerFault.com के एक अन्य पोस्टर में इसी तरह के मुद्दे थे, इसलिए मैंने केवल 443 ट्रैफिक के लिए
इफ

1
लगता है कि आपको फ़ाइलों को सर्टिफिकेट के लिए पथ निर्दिष्ट करना है यदि आप एसएसएल अनुरोधों को पकड़ना चाहते हैं (भले ही आप केवल त्याग करना चाहते हैं): server { listen 80 default_server; listen 443; server_name _; ssl_certificate /path/to/file.crt; ssl_certificate_key /path/to/file.key; return 444; }
n__o

यदि अनुरोध का HOST अमान्य है, तो Nginx क्या लौटाएगा? 50x या 40x?
laike9m

इस कॉन्फ़िगरेशन में अतिरिक्त क्या है? मेरे पास सर्वर का नाम दोनों रीडायरेक्ट और ऐप सेक्शन में सेट है, मुझे अभी भी Invalid HTTP_HOST header(Django 1.8.x के साथ)
Csaba Toth

16

यह Django के नए संस्करणों में तय किया गया है, लेकिन यदि आप एक प्रभावित संस्करण (जैसे 1.5) का उपयोग कर रहे हैं, तो आप इन से छुटकारा पाने के लिए अपने लकड़हारा हैंडलर में एक फिल्टर जोड़ सकते हैं, जैसा कि इस ब्लॉग पोस्ट में उल्लिखित है ।

स्पॉइलर:

from django.core.exceptions import SuspiciousOperation

def skip_suspicious_operations(record):
  if record.exc_info:
    exc_value = record.exc_info[1]
    if isinstance(exc_value, SuspiciousOperation):
      return False
  return True

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse',
        },
        # Define filter
        'skip_suspicious_operations': {
            '()': 'django.utils.log.CallbackFilter',
            'callback': skip_suspicious_operations,
        },
    },
    'handlers': {
        'mail_admins': {
            'level': 'ERROR',
            # Add filter to list of filters
            'filters': ['require_debug_false', 'skip_suspicious_operations'],
            'class': 'django.utils.log.AdminEmailHandler'
        }
    },
    'loggers': {
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
    }
}

1
फिक्स या संस्करण के लिए कोई लिंक जहां लागू किया गया है? Thx
मार्क

1
मैं संस्करण 2.0.5 पर यह था
Mehmet

यह Django के नए संस्करणों पर तय नहीं है। मैं Django 2.0.10
javidazac
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.