2012-05-19 21 views
11

मैंने Django - CSRF verification failed और django और POST विधि से संबंधित कई प्रश्न (और उत्तर) पढ़े हैं। render_to_response_call पोस्ट विधि हमेशा 403 निषिद्ध

  • जोड़ें के तीसरे पैरामीटर के रूप में

    1. उपयोग RequestContext: सबसे अच्छा बल्कि नहीं काम के लिए मुझे जवाब में से एक https://stackoverflow.com/a/4707639/755319

      अनुमोदित सभी उत्तर सुझाव है कम से कम 3 बातें है के रूप में सुझाव {% csrf_token%} POST पद्धति

    2. साथ हर रूप में settings.py

    में MIDDLEWARE_CLASSES की जाँच करें मैं बिल्कुल किया है, लेकिन अभी भी त्रुटि दिखाई दिया। मैं Django 1.3.1 (Ubuntu 12.04 रिपोजिटरी से) और अजगर 2.7 (ubuntu से डिफ़ॉल्ट)

    का उपयोग यह मेरा दृश्य है:

    # Create your views here. 
    from django.template import RequestContext 
    from django.http import HttpResponse 
    from django.shortcuts import render_to_response 
    from models import BookModel 
    
    def index(request): 
        return HttpResponse('Welcome to the library') 
    
    def search_form(request): 
        return render_to_response('library/search_form.html') 
    
    def search(request): 
        if request.method=='POST': 
         if 'q' in request.POST: 
          q=request.POST['q'] 
          bookModel = BookModel.objects.filter(title__icontains=q) 
          result = {'books' : bookModel,} 
          return render_to_response('library/search.html', result, context_instance=RequestContext(request)) 
         else: 
          return search_form(request) 
        else: 
         return search_form(request) 
    

    और यह मेरा टेम्पलेट (search_form.html) है:

    {% extends "base.html" %} 
    {% block content %} 
    <form action="/library/search/" method="post"> 
        {% csrf_token %} 
        <input type="text" name="q"> 
        <input type="submit" value="Search"> 
    </form> 
    {% endblock %} 
    

    मैंने सर्वर को पुनरारंभ किया है, लेकिन 403 वर्जित त्रुटि अभी भी है, यह बता रही है कि सीएसआरएफ सत्यापन विफल रहा है।

    मैंने 2 सवाल:

    1. कैसे इस त्रुटि को ठीक करने के लिए?
    2. डीजेंगो में "पोस्ट" बनाना इतना मुश्किल क्यों है, मेरा मतलब है कि इसे वर्बोज़ बनाने के लिए कोई विशिष्ट कारण है (मैं PHP से आया हूं, और इससे पहले कभी ऐसी समस्या नहीं मिली)?
  • उत्तर

    3

    search_form देखने के render_to_response में RequestContext डालने की कोशिश:

    context_instance=RequestContext(request) 
    
    +0

    यही काम करता है, आपका जवाब के लिए धन्यवाद। लेकिन कैसे और क्यों? क्या आप स्पष्टीकरण दे सकते हैं? – goFrendiAsgard

    +2

    https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#how-to-use-it - बिंदु # 3 – zubinmehta

    +2

    पढ़ें क्योंकि आपके दृश्य में 'csrf_token' बनाया जाना चाहिए ताकि django पास हो सके यह टेम्पलेट के लिए। आपकी स्थिति में, चूंकि आपका खोज दृश्य टोकन नहीं बनाता है, इसलिए आपके टेम्पलेट में '{% csrf_token%}' 'खाली स्ट्रिंग (कोई नहीं) 'है और परिणाम पृष्ठ सत्यापन – FallenAngel

    0

    तुम भी

    direct_to_template(request, 'library/search.html', result) 
    
    बजाय

    क्योंकि
    render_to_response('library/search.html', result, context_instance=RequestContext(request)) 
    

    direct_to_templateRequestContext aut कहते हैं

    उपयोग कर सकते हैं omatically। लेकिन ध्यान दें कि direct_to_template को बहिष्कृत किया जा रहा है और django इसके बजाय सीबीवी TemplateView का उपयोग करने की पेशकश करता है।

    RequestContext आपको संदर्भ प्रोसेसर का उपयोग करने की अनुमति देता है। और यह आपकी गलती है: {% csrf_token %} खाली स्ट्रिंग आउटपुट और आपको 403 मिल गया।

    +0

    हाय, धन्यवाद आप अपनी टिप्पणी के लिए, ऐसा लगता है कि मुझे django से परिचित होने से पहले बहुत सी चीजों पर विचार करना चाहिए: डी – goFrendiAsgard

    5

    ऐसी समस्याओं से बचने का सबसे आसान तरीका render शॉर्टकट का उपयोग करना है।

    from django.shortcuts import render 
    # .. your other imports 
    
    def search_form(request): 
        return render(request, 'library/search_form.html') 
    
    def search(request): 
        q = request.GET.get('q') 
        results = BookModel.objects.all() 
        if q: 
         results = results.filter(title__icontains=q) 
        return render(request, 'library/search.html', {'result': results}) 
    
    +0

    +1 'django.me' – San4ez

    +0

    के लिए +1 जल्द ही इसे आज़माएं, बहुत स्पष्ट लगता है, आपके उत्तर के लिए धन्यवाद। क्या इस विधि का उपयोग करने का कोई विपक्ष है? मुझे आश्चर्य है कि दस्तावेज और djangobook ऐसे वर्बोज़ सिंटैक्स क्यों प्रदान करते हैं यदि कोई स्पष्ट वाक्यविन्यास – goFrendiAsgard

    +0

    मुझे पता है कि यह एक पुराना धागा है, लेकिन मैंने इसे खोज विधि को और स्पष्ट करने के लिए अपडेट किया है। उम्मीद है कि यह अब (अधिक) उपयोगी है। –

    9

    मुझे शायद गलत है हालांकि मुझे उपर्युक्त समाधान बल्कि जटिल पाया गया है।

    मेरे लिए जो काम किया वह बस मेरे पोस्ट अनुरोध में मेरे सीएसआरएफ टोकन समेत था।

    $.ajax({ 
        type: "POST", 
        url: "/reports/", 
        data: { csrfmiddlewaretoken: "{{ csrf_token }}", // < here 
          state:"inactive" 
          }, 
        success: function() { 
         alert("pocohuntus") 
         console.log("prototype") 
        } 
    }) 
    
    +2

    मेरे लिए काम किया - धन्यवाद! – skaz

    0

    आप अपने जवाब के साथ RequestContext उपयोग करने की आवश्यकता

    उदाहरण के लिए

    view.py फ़ाइल में

    from django.template import RequestContext 
    
    def home(request): 
        return render_to_response('home.html',RequestContext(request, {})) 
    
    2

    प्रतिक्रिया 403 bcoz, Django एक CSRF टोकन की आवश्यकता है (पोस्ट डेटा में शामिल है) आपके द्वारा किए गए प्रत्येक पोस्ट अनुरोध में।

    इस तरह के रूप में करने के लिए विभिन्न तरीके हैं:

    कुकी और विधि से टोकन प्राप्त कर लेख में समझाया गया है enter link description here

    या

    आप का उपयोग कर डोम से पहुंच सकते हैं {{ csrf_token}},

    तो अब दूसरी विधि का उपयोग कर टेम्पलेट में उपलब्ध:

    var post_data = { 
        ... 
        'csrfmiddlewaretoken':"{{ csrf_token }}" 
        ... 
    } 
    $.ajax({ 
        url:'url', 
        type:'POST' 
        data:post_data, 
        success:function(data){ 
        console.log(data); 
        }, 
        error:function(error){ 
        console.log(error); 
        } 
    }); 
    
    1

    यह उत्तर उन लोगों के लिए है जो भविष्य में इसी समस्या का सामना कर सकते हैं।

    सीएसआरएफ {{csrf_token}} टेम्पलेट टैग जो कि Django में फॉर्म के लिए आवश्यक है क्रॉस साइट अनुरोध फर्जीज़ के खिलाफ रोकें। सीएसआरएफ एक दुर्भावनापूर्ण साइट के लिए संभव बनाता है जिसे क्लाइंट के ब्राउज़र द्वारा आपके सर्वर पर अनुरोध करने के लिए देखा गया है। इसलिए django द्वारा प्रदान की गई csrf_token आपके django सर्वर और साइट के लिए इस प्रकार के दुर्भावनापूर्ण हमले के खिलाफ सुरक्षित होने के लिए आसान बनाता है। यदि आपका फॉर्म csrf_token द्वारा संरक्षित नहीं है, तो django 403 वर्जित पृष्ठ देता है। यह आपकी वेबसाइट के लिए सुरक्षा का एक रूप है, खासकर जब टोकन जानबूझकर बाहर नहीं छोड़ा गया था।

    लेकिन ऐसे परिदृश्य हैं जहां एक django साइट csrf_token का उपयोग करके अपने रूपों की रक्षा नहीं करना चाहती है। उदाहरण के लिए, मैंने यूएसएसडी एप्लीकेशन विकसित किया है और यूएसएसडी एपीआई से POST अनुरोध प्राप्त करने के लिए एक व्यू फ़ंक्शन की आवश्यकता है। हमें ध्यान रखना चाहिए कि POST अनुरोध ग्राहक के रूप में नहीं था इसलिए सीएसआरएफ का जोखिम असंभव है, क्योंकि एक दुर्भावनापूर्ण साइट अनुरोध सबमिट नहीं कर सकती है। POST अनुरोध प्राप्त होता है जब कोई उपयोगकर्ता यूएसएसडी कोड डायल करता है और जब कोई फॉर्म सबमिट नहीं किया जाता है।

    दूसरे शब्दों में, ऐसी स्थितियां हैं जहां एक कार्य को POST अनुरोध प्राप्त करने की आवश्यकता होगी और {{csrf_token}} की आवश्यकता नहीं होगी।

    Django हमें एक सजावटी @csrf_exempt प्रदान करता है। यह सजावटी मिडलवेयर द्वारा सुनिश्चित सुरक्षा से छूट के रूप में एक दृश्य को चिह्नित करता है।

    from django.views.decorators.csrf import csrf_exempt 
    from django.http import HttpResponse 
    
    @csrf_exempt 
    def my_view(request): 
        return HttpResponse('Hello world') 
    

    Django भी एक और डेकोरेटर कि {{csrf_token}} के साथ एक ही कार्य को प्रदान करता है, लेकिन यह आने वाली अनुरोध को अस्वीकार नहीं करता है। यह सजावट @requires_csrf_token है। उदाहरण के लिए:

    @requires_csrf_token 
    def my_view(request): 
        c = {} 
        # ... 
        return render(request, "a_template.html", c) 
    

    पिछले डेकोरेटर कि इस पोस्ट में उल्लेख किया जाएगा बिल्कुल वही बात के रूप में {{csrf_token}} और यह @csrf_protect कहा जाता है करता है। हालांकि, इस सजावट का उपयोग स्वयं ही सर्वोत्तम अभ्यास नहीं है क्योंकि आप इसे अपने विचारों में जोड़ना भूल सकते हैं।उदाहरण के लिए:

    @csrf_protect 
    def my_view(request): 
        c = {} 
        # ... 
        return render(request, "a_template.html", c) 
    

    नीचे कुछ लिंक हैं जो बेहतर मार्गदर्शन और व्याख्या करेंगे।

    https://docs.djangoproject.com/en/1.7/ref/contrib/csrf/#module-django.views.decorators.csrf

    https://docs.djangoproject.com/en/1.7/ref/contrib/csrf/

    http://www.squarefree.com/securitytips/web-developers.html#CSRF

    संबंधित मुद्दे