জ্যাঙ্গোর সন্দেহজনক ওপেনেশন অবৈধ HTTP_HOST শিরোনাম


97

জ্যাঙ্গো 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'] আমার সেটিংস.পি ফাইল সেট করে রেখেছি।

এখানে কি হচ্ছে? এটি কেউ গুগল হওয়ার ভান করে এবং আমার সাইটে অ্যাক্সেস করছে? বা কেউ যদি HTTP_HOST শিরোনামটি ভুলভাবে সেট করে ফেলেছে তা কি সৌম্যর ঘটনা?


আপনি কীভাবে এটি ঠিক করবেন বুঝতে পেরেছেন? একই সমস্যার মুখোমুখি। প্রতিদিন এই ত্রুটিগুলির একশটি লগ ইন করা। আমার এমন কিছু চিন্তা করা দরকার কিনা ধারণা নেই।
অন্ধকার

4
এই ব্লগ পোস্টটি ইমেলগুলি থামানোর জন্য একটি দুর্দান্ত উপায় সরবরাহ করে: tiwoc.de/blog/2013/03/…
ডেরেক

উত্তর:


64

যদি ALLOWED_HOSTSআপনারটি সঠিকভাবে সেট করা থাকে, তবে সম্ভবত শিরোনামটি ফাঁকি দিয়ে কেউ আপনার সাইটের দুর্বলতার জন্য অনুসন্ধান করছে।

এটিকে 500 অভ্যন্তরীণ সার্ভার ত্রুটি থেকে 400 প্রতিক্রিয়ায় পরিবর্তন করার জন্য জাজানো বিকাশকারীদের এখনই আলোচনা রয়েছে। এই টিকিট দেখুন ।


4
আমি মনে করি এর আরও সম্ভাব্য ব্যাখ্যা হ'ল ওয়েব ক্রলার (রোবট) কেবল 80 বন্দরটিতে পাবলিক আইপি অ্যাড্রেসগুলি ক্রল করে - সেই ক্ষেত্রে আপনি তাদের অনুমতি দিতে চান to
চিহ্নমনেল

16
@markmnl একটি বৈধ ওয়েব ক্রলার হোস্ট শিরোলেখ তৈরি করা উচিত নয়।
ব্রায়ান নিল

4
এটি কেবলমাত্র আইপি ঠিকানাটি ডোমেন নাম নয় এবং আইপি ঠিকানা ALLOWED_HOSTS- এ ব্যবহার করে সংযুক্ত হচ্ছে - বা কমপক্ষে আমার সাথে যা ঘটছিল - আমি আমার ব্রাউজারটিকে আইপি ঠিকানায় এটি তিরস্কার করতে পারি।
মার্কমনল

হ্যাঁ এবং যে কোনও অর্ধেক ব্যস্ত সাইটের মধ্যে, প্রতিদিন এটি ঘটে। তারা এটি এখনই ঠিক করে ফেলেছে, তবে এখানে একটি "ড্রপ-ইন" অ্যাপ্লিকেশন রয়েছে যা এটিকে ত্রুটি রেট ফিল্টার সহ সমস্ত সংস্করণে সাজিয়েছে। github.com/litchfield/django-safelogging
s29

ইন্টারনেটে আমার ওয়েবসাইট স্থাপন করার পরে। আমি দেখতে পেয়েছি যে প্রচুর লোক অবৈধ হোস্ট ব্যবহার করে আমার ওয়েবসাইটে অ্যাক্সেস পাওয়ার চেষ্টা করছে। শুধু আইপি ঠিকানা ব্যবহার করে না। আমি মনে করি এটি এমন কিছু লোক হতে পারে যে কোনও ওয়েবসাইট সন্ধানের চেষ্টা করছেন যা কোনও সিএসআরএফ আক্রমণকে রক্ষা করতে পারে না।
রামউইন

133

আপনি যদি গিনিকর্ন / অ্যাপাচি / ইউডাব্লুএসজিআইতে চলমান জ্যাঙ্গোর কাছে অনুরোধগুলি ফরোয়ার্ড করার জন্য Nginx ব্যবহার করছেন তবে খারাপ অনুরোধগুলি ব্লক করতে আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন। পরামর্শের জন্য @ পলমকে ধন্যবাদ ।

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
দস্তাবেজের ইঙ্গিতটির ইঙ্গিতটির উন্নতি হিসাবে এটি দেখতে পারা চমৎকার হবে :)
পল ম্যাকমিলান

4
@ ওয়েবেজুনকি, আপনার লিঙ্কটি থেকে, "এমন কিছু ঘটনা রয়েছে যেখানে আপনি কেবল যদি একটি ব্যবহারটি এড়াতে পারবেন না, উদাহরণস্বরূপ, যদি আপনাকে কোনও ভেরিয়েবল পরীক্ষা করতে হয় যার সমান নির্দেশনা নেই।" আমার উদাহরণ এটি সঠিকভাবে ব্যবহার করে এবং আমার উত্পাদন পরিবেশে ভাল কাজ করে। সুতরাং উপসংহারে, এটি এর মতো করুন! :)
ব্রেন্ট ও'কনোর

4
ভাল আপনি এটি সহজেই এড়াতে পারবেন: কেবলমাত্র আপনার প্রয়োজনীয় সার্ভার_নামটি নির্দিষ্ট করুন এবং বাকিগুলি একটি ডিফল্ট সার্ভার হ্যান্ডলার দ্বারা পরিচালনা করতে দিন।
ওয়েবজুনকি

4
অনুরূপ অ্যাপাচি কনফিগারেশনের জন্য এই উত্তরটি দেখুন: stackoverflow.com/a/18792080
ডেনিলসন সা মিয়া

4
ওয়েবজুঙ্কির সরবরাহিত লিঙ্কটি থেকে: "অবস্থানের প্রসঙ্গে ব্যবহৃত হলে সমস্যা থাকলে নির্দেশিকা"। ব্রেন্টের দেওয়া উদাহরণটি ব্লকের ifঅভ্যন্তরে ব্যবহার করে serverনা locationব্লকটিতে। তার মানে কি ifএই উদাহরণে ঠিক আছে?
ব্রায়ান বক

31

এনগিনেক্স ব্যবহার করার সময় আপনি কোনওভাবেই সার্ভার সেট আপ করতে পারতেন কেবলমাত্র প্রথমে জাজানোতে যে হোস্টগুলি চান সেটি আপনাকে অনুরোধ করবে। এটি আপনাকে আর কোনও সন্দেহজনক অপারেশন ত্রুটি দেয় না।

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
}

4
আমি ifব্রেন্টের প্রস্তাবিত পদ্ধতির সাহায্যে এই পদ্ধতির পছন্দ করি তবে আমি 443 বন্দর দিয়ে কাজ করতে পারি না I আমি আপনার পরামর্শটি নকল করার চেষ্টা করেছি (শোনার বন্দরটি পরিবর্তিত হয়ে), এবং আমার আসল এসএসএল সাইট লোড হয় না - এটি এই এন্ট্রি দ্বারা ক্যাপচার হয় আমি যোগ। কীভাবে ঠিক করবেন?
দোলন অ্যান্টুচি

4
সার্ভারফল্ট ডটকমের অন্য একটি পোস্টারেও একই রকম সমস্যা ছিল, তাই আমি কেবল 443 ট্র্যাফিকের জন্য যদি ইফ-স্টেটমেন্ট পদ্ধতির বিষয়ে তার প্রস্তাবটি অনুসরণ করি
দোলান অ্যান্টুচি

4
দেখে মনে হচ্ছে যে আপনি যদি এসএসএল অনুরোধগুলিও খুব বেশি ধরতে চান তবে আপনাকে শংসাপত্র ফাইলগুলির পথ নির্দিষ্ট করতে হবে (যদিও আপনি কেবল বাতিল করতে চান): 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?
লাইক

এই কনফিগারেশন অতিরিক্ত কি? আমার কাছে সার্ভারের নাম পুনর্নির্দেশগুলি এবং অ্যাপ্লিকেশন বিভাগে সেট করা আছে, আমি এখনও পেয়েছি Invalid HTTP_HOST header(জাজানো 1.8.x সহ)
তোথ

16

এটি জ্যাঙ্গোর নতুন সংস্করণগুলিতে সংশোধন করা হয়েছে, তবে আপনি যদি কোনও প্রভাবিত সংস্করণ (উদাহরণস্বরূপ 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,
        },
    }
}

4
ফিক্স বা সংস্করণের জন্য কোনও লিঙ্ক কোথায় প্রয়োগ করা হয়েছে? ধন্যবা
মার্ক

4
আমি এটি 2.0.5 সংস্করণে পেয়েছি
মেহমেট

এটি জ্যাঙ্গোর নতুন সংস্করণগুলিতে স্থির নয়। আমি
জাজানো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.