Django के CSRF सत्यापन को कैसे अक्षम करें?


111

मैंने सीएसआरएफ प्रोसेसर और मिडलवेयर लाइनों में टिप्पणी की है settings.py:

122 
123 TEMPLATE_CONTEXT_PROCESSORS = (
124     'django.contrib.auth.context_processors.auth',
125 #    'django.core.context_processors.csrf',
126     'django.core.context_processors.request',
127     'django.core.context_processors.static',
128     'cyathea.processors.static',
129 )
130 
131 MIDDLEWARE_CLASSES = (
132     'django.middleware.common.CommonMiddleware',
133     'django.contrib.sessions.middleware.SessionMiddleware',
134 #    'django.middleware.csrf.CsrfViewMiddleware',
135     'django.contrib.auth.middleware.AuthenticationMiddleware',
136     'django.contrib.messages.middleware.MessageMiddleware',
137     'django.middleware.locale.LocaleMiddleware',
138     # Uncomment the next line for simple clickjacking protection:
139     # 'django.middleware.clickjacking.XFrameOptionsMiddleware',
140 )

लेकिन जब मैं एक अनुरोध भेजने के लिए अजाक्स का उपयोग करता हूं, तो Django अभी भी जवाब देता है 'सीएसआरएफ टोकन गलत या गायब है', और हेडर में एक्स-सीएसआरएफटीकेन जोड़ने के बाद, अनुरोध सफल होगा।

यहाँ क्या हो रहा है ?


संभव डुप्लिकेट: stackoverflow.com/questions/1650941/…
रोहन

जवाबों:


232

यदि आपको CSRF का उपयोग न करने के लिए कुछ विचारों की आवश्यकता है, तो आप उपयोग कर सकते हैं @csrf_exempt:

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def my_view(request):
    return HttpResponse('Hello world')

आप Django प्रलेखन में अधिक उदाहरण और अन्य परिदृश्य पा सकते हैं:


2
नमस्ते, @ TheBronx, मैं वास्तव में जानना चाहता हूं कि मेरा समाधान क्यों काम नहीं करता है।
वूहा

1
क्षमा करें, @ मुझे पता नहीं क्यों आपका समाधान काम नहीं कर रहा है। मुझे पता है कि @csrf_exempमैं हाल ही में समस्याओं के बिना उपयोग किया है के रूप में काम करता है। आशा है आपको उत्तर मिल जाएगा।
साल्वेटेरलैब

6
@ मैरो, यह एक Django बात है। ज्यादातर चीजें काम करती हैं / सिर्फ इसलिए काम नहीं करती हैं क्योंकि कोड बेस के नीचे एक मैजिक सेटिंग दफन है।
idursun

2
एक अनुस्मारक: यदि आपके पास अन्य सज्जाकार एक ही दृश्य में आदेश प्रासंगिक है: तो पहले @csrf_exempt को रखें।
पैट्रिक बासुत

3
हम्म- शायद एक तकनीकी रूप से सही उत्तर है, लेकिन सबसे निश्चित रूप से ओपी नहीं चाहता था या मैं क्या देख रहा था।
डैनी स्टेपल

40

कक्षा आधारित विचारों के लिए CSRF को अक्षम करने के लिए मेरे लिए निम्न कार्य किया।
Django का उपयोग 1.10 और अजगर 3.5.2

from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator

@method_decorator(csrf_exempt, name='dispatch')
class TestView(View):
    def post(self, request, *args, **kwargs):
        return HttpResponse('Hello world')

32

में setting.pyमिडलवेयर में आप आसानी से हटा सकते / टिप्पणी इस लाइन:

'django.middleware.csrf.CsrfViewMiddleware',

1
यह मेरे लिए Django 2.1 पर एक HTTP क्लाइंट के रूप में कर्ल का उपयोग करके काम करता है।
मिट्टी

1
@xtrinch सुनिश्चित करें कि आपने सर्वर प्रक्रिया को पूरी तरह से छोड़ दिया / फिर से लॉन्च किया। मुझे नहीं लगता कि ऑटो-रिलोड में बदलाव हुआ है
बेसिक

15

के लिए Django 2 :

from django.utils.deprecation import MiddlewareMixin


class DisableCSRF(MiddlewareMixin):
    def process_request(self, request):
        setattr(request, '_dont_enforce_csrf_checks', True)

settings.MIDDLEWAREजब उचित हो (उदाहरण के लिए आपकी परीक्षण सेटिंग्स में) उस मिडलवेयर को जोड़ा जाना चाहिए ।

नोट: सेटिंग को MIDDLEWARE_CLASSESअब और नहीं कहा जाता है ।


11

उत्तर अनुचित हो सकता है, लेकिन मुझे आशा है कि यह आपकी मदद करता है

class DisableCSRFOnDebug(object):
    def process_request(self, request):
        if settings.DEBUG:
            setattr(request, '_dont_enforce_csrf_checks', True)

इस तरह मिडलवेयर होने से अनुरोधों को डीबग करने और प्रोडक्शन सर्वर में सीएसआरएफ की जांच करने में मदद मिलती है।


हम्म। इसे Django में 1.9.1 की कोशिश की। @Csrf_exempt डेकोरेटर को विधि से हटाया और उपरोक्त कोड जोड़ा। 403 मिला क्योंकि कुकी सेट नहीं थी।
क्रेग एस। एंडरसन

11

यहाँ समस्या यह है कि SessionAuthentication अपना CSRF सत्यापन करता है। इसीलिए CSRF मिडलवेयर के कमेंट करने पर भी आपको CSRF की अनुपलब्धता मिलती है। आप हर दृश्य में @csrf_exempt जोड़ सकते हैं, लेकिन यदि आप CSRF को अक्षम करना चाहते हैं और पूरे ऐप के लिए सत्र प्रमाणीकरण है, तो आप इस तरह एक अतिरिक्त मिडलवेयर जोड़ सकते हैं -

class DisableCSRFMiddleware(object):

def __init__(self, get_response):
    self.get_response = get_response

def __call__(self, request):
    setattr(request, '_dont_enforce_csrf_checks', True)
    response = self.get_response(request)
    return response

मैंने इस क्लास को myapp / mid.py में बनाया है। फिर इस मिडिलवेयर को सेटिंगवेयर में Middleware में आयात करें

MIDDLEWARE = [
    'django.middleware.common.CommonMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    #'django.middleware.csrf.CsrfViewMiddleware',
    'myapp.middle.DisableCSRFMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',

]

यह django 1.11 पर DRF के साथ काम करता है


3
वास्तव में केवल एक समाधान पोस्ट करने के बजाय प्रश्न का उत्तर देने के लिए धन्यवाद।
ठेजय

5

यदि आप इसे ग्लोबल में अक्षम करना चाहते हैं, तो आप इस तरह से एक कस्टम मिडलवेयर लिख सकते हैं

from django.utils.deprecation import MiddlewareMixin

class DisableCsrfCheck(MiddlewareMixin):

    def process_request(self, req):
        attr = '_dont_enforce_csrf_checks'
        if not getattr(req, attr, False):
            setattr(req, attr, True)

फिर इस वर्ग youappname.middlewarefilename.DisableCsrfCheckको MIDDLEWARE_CLASSESसूचियों में जोड़ें , इससे पहलेdjango.middleware.csrf.CsrfViewMiddleware


2

CSRF को दृश्य स्तर पर लागू किया जा सकता है, जिसे विश्व स्तर पर अक्षम नहीं किया जा सकता है

कुछ मामलों में यह एक दर्द है, लेकिन उम, "यह सुरक्षा के लिए है"। गोटे उन AAA रेटिंग को बनाए रखेंगे।

https://docs.djangoproject.com/en/dev/ref/csrf/#contrib-and-reusable-apps


0

@OooHaaaa कुछ थर्ड पार्टी पैकेज 'django.middleware.csrf.CsrfViewMiddleware' मिडलवेयर का उपयोग करते हैं। उदाहरण के लिए मैं django-rest-oauth का उपयोग करता हूं और मुझे उन चीजों को अक्षम करने के बाद भी आपके जैसी समस्या है। शायद इन पैकेजों ने मेरे मामले की तरह आपके अनुरोध का जवाब दिया, क्योंकि आप प्रमाणीकरण डेकोरेटर और कुछ इस तरह का उपयोग करते हैं।

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