2010-08-25 14 views
5

ऐसे फॉर्म हैं जो सीएसआरएफ सुरक्षा के लिए आवश्यक POST विधि का उपयोग करते हैं? मैं एक किताब का अनुसरण कर रहा हूं और कोड उदाहरण 403 त्रुटियों को फेंक देते हैं। मैंने कुछ खोज किया और ऐसा लगता है कि मुझे अपने सभी रूपों में सीएसआरएफ को सक्षम करने की आवश्यकता है।Django: POST फॉर्म को सीएसआरएफ की आवश्यकता है? प्राप्त नहीं करता है?

मेरे प्रश्न हैं:

  1. करता Django अब की आवश्यकता होती है सभी पोस्ट रूपों CSRF से संरक्षित किया जाना है?

  2. सभी मैं में '{% csrf_token%}' पूरा करने के लिए इस 'django.middleware.csrf.CsrfViewMiddleware', वापसी render_to_response (टेम्पलेट, शब्दकोश, context_instance = RequestContext (अनुरोध) जोड़ने है करते हैं, और जोड़ने की जरूरत है

    इसी प्रपत्र? मैं यहाँ कुछ भी याद आ रही है?

जब मैं ऐसा करते हैं, प्रपत्र ठीक काम करता है। जब इन टुकड़ों को याद आ रही हैं के किसी भी, यह करने में विफल रहता 403 मैं सिर्फ यकीन है कि मैं इसे कर रहा हूँ बनाना चाहते दाएं। :)

अग्रिम धन्यवाद।

संपादित करें:

किसी कारण के लिए इस कोड मेरे लिए कोई मतलब नहीं है, लेकिन यह किसी भी त्रुटि वापस नहीं करता है के लिए। कृपया आदिम सत्यापन को अनदेखा करें क्योंकि मुझे पुस्तक के उस अनुभाग में नहीं मिला है जहां यह अभी तक करने का अधिक प्रभावी तरीका दिखाता है।

def contact(request): 
    errors = [] 

    if request.method == 'POST': 
     if not request.POST.get('subject',''): 
      errors.append('Enter a subject') 
     if not request.POST.get('message',''): 
      errors.append('Enter a message') 
     if request.POST.get('email', '') and '@' not in request.POST['email']: 
      errors.append('Enter a valid email address') 
     if not errors: 
      send_mail(
       request.POST['subject'], 
       request.POST['message'], 
       request.POST.get('email', '[email protected]'), ['[email protected]'],) 
      return HttpResponseRedirect('/contact/thanks/') 

    return render_to_response('contact_form.html', { 'errors': errors }, context_instance=RequestContext(request)) 

मेरा मुद्दा इस दृश्य कार्य की अंतिम पंक्ति के साथ है। इसे केवल तभी कहा जाता है जब request.method! = POST। यह मेरे लिए पूरी तरह से गलत लगता है। जब मैं पोस्ट कर रहा हूं तो क्या मुझे "context_instance = RequestContext (अनुरोध)" नहीं बुलाया जाना चाहिए?

उत्तर

7

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

संपादित

आप context_instance=RequestContext(request) बुला नहीं किया जाना चाहिए जब यह एक POST कर रहा है, तो आप इसे अनुरोध प्रकार की परवाह किए बिना बुला जाना चाहिए। इसे इस तरह देखो:

  • क्या यह POST है? इसका मतलब है कि फॉर्म जमा किया गया था। हम फॉर्म को मान्य करते हैं, और यदि उपयोगकर्ता ठीक है, तो उपयोगकर्ता को किसी अन्य पृष्ठ पर रीडायरेक्ट करें, या त्रुटियों को त्रुटियों के साथ उपयोगकर्ता को फिर से दिखाएं।
  • क्या यह GET है? इसका मतलब है कि फॉर्म सबमिट नहीं किया गया था, लेकिन अन्य चीजें हो रही हैं जिनकी हमें परवाह नहीं है (कुछ रेफरर लिंक या अन्य सामान)। प्रपत्र वैसे भी इटैलिक में

क्रिया पिछले वापसी द्वारा किया जाता है दिखाएँ, अगर कुछ भी हो।