Django CSRF कुकी सेट नहीं


85

मुझे कुछ समय के लिए कुछ समस्या है, मैं CSRF कुकी सेट नहीं कर रहा हूं। कृपया नीचे दिए गए कोड देखें

अजगर

def deposit(request,account_num):
if request.method == 'POST':
    account = get_object_or_404(account_info,acct_number=account_num)
    form_=AccountForm(request.POST or None, instance=account)
    form = BalanceForm(request.POST)
    info = str(account_info.objects.filter(acct_number=account_num))
    inf=info.split()
    if form.is_valid():
    #cd=form.cleaned_data
        now = datetime.datetime.now()
        cmodel = form.save()
        cmodel.acct_number=account_num
        #RepresentsInt(cmodel.acct_number)
        cmodel.bal_change="%0.2f" % float(cmodel.bal_change)
        cmodel.total_balance="%0.2f" %(float(inf[1]) + float(cmodel.bal_change))
        account.balance="%0.2f" % float(cmodel.total_balance)
        cmodel.total_balance="%0.2f" % float(cmodel.total_balance)
        #cmodel.bal_change=cmodel.bal_change
        cmodel.issued=now.strftime("%m/%d/%y %I:%M:%S %p")
        account.recent_change=cmodel.issued
        cmodel.save()
        account.save()
        return HttpResponseRedirect("/history/" + account_num + "/")
    else:
        return render_to_response('history.html',
                          {'account_form': form},
                          context_instance=RequestContext(request))

HTML में यहाँ कोड है

एचटीएमएल

<form action="/deposit/{{ account_num }}/" method="post">

<table>
<tr>
{{ account_form.bal_change }}
&nbsp;
<input type="submit" value="Deposit" />
</tr>
{% csrf_token %}
</table>
</form>

Im अटक गया, मैंने पहले ही कुकी को साफ़ कर दिया है, अन्य ब्राउज़र का उपयोग किया है लेकिन फिर भी सीएसआरएफ कुकी सेट नहीं है।


क्या CsrfViewMiddlewareआपकी MIDDLEWARE_CLASSESसेटिंग में है?
एलेक्सी

{%csrf_token%}टेम्पलेट में अपने फॉर्म में जोड़ें ।
रोहन

4
@ रोहन यह पहले से ही है, प्रश्न देखें।
एलेक्सी

1
हाँ, मेरे पास पहले से ही CsrfViewMiddleware है, और मेरे पास पहले से ही अपने फॉर्म में

मैं Django cors मॉड्यूल का उपयोग कर रहा हूं और इसे ReactJS के माध्यम से एक्सेस कर रहा हूं। (दोनों लोकलहोस्ट पर थे)। मुझे भी ओपी की यही समस्या थी। मैंने पाया कि credentials: 'include'पोस्ट अनुरोध में जोड़ने और फिर django के सेटिंग में जोड़ने के लिए भी: CORS_ALLOW_CREDENTIALS = Trueलगता है कि समस्या को @csrf_exemptदेखने के लिए जोड़ने की आवश्यकता के बिना समस्या तय की है । यह वास्तव में डॉक्स में है ... pypi.org/project/django-cors-headers-multi * मुझे पता है कि यह ऊपर दिए गए प्रश्नों में से एक से संबंधित है, लेकिन मैं अभी तक टिप्पणी नहीं कर सकता और उम्मीद है कि किसी और को बचाने के लिए समय चाहिए। मुझे t
DW

जवाबों:


133

यह तब भी हो सकता है यदि CSRF_COOKIE_SECURE = Trueसेट किया गया है और आप साइट को गैर-सुरक्षित रूप से एक्सेस कर रहे हैं या यदि यहां और यहांCSRF_COOKIE_HTTPONLY = True बताया गया है


10
धन्यवाद! उसी के लिए जाता है SESSION_COOKIE_SECURE = True
NonameSL

74
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt

@csrf_exempt 
def your_view(request):
    if request.method == "POST":
        # do something
    return HttpResponse("Your response")

60
सुरक्षा तंत्र को पूरी तरह से अक्षम करना त्रुटि को ठीक करने का एक अच्छा तरीका नहीं है।
गुआल्यूम अल्जीस

2
यदि आप 2017 में cookiecutter-django का उपयोग कर रहे हैं तो यह उत्पादन में सही उत्तर है।
आंद्रे

1
वह क्यों, जिज्ञासा से बाहर है?
पैट्रिक

3
यह उत्तर "सुरक्षा तंत्र को पूरी तरह से अक्षम करने" का सुझाव नहीं देता है, यह केवल यह बताता है कि ऐसा कैसे करें कि एक भी मामले के लिए जहां आप सीएसआरएफ टोकन का उपयोग करने में सक्षम न हों। यह मेरा मामला है, जहां मुझे बाहरी ग्राहक को एक POST कार्रवाई की पेशकश करने की आवश्यकता है।
मारीतोमो सेप

यह एक TODO प्रकार का आइटम है जिसका उपयोग मैं विकास के चरण के दौरान करता हूं, जब आप UI से csrf टोकन प्रदान नहीं कर सकते। लेकिन निश्चित रूप से एक लाइव ऐप के लिए अनुशंसित नहीं है।
अमन मदन

24

यदि आप उपयोगकर्ता के लिए लॉग इन के रूप में POST अनुरोध करने के लिए HTML5 Fetch API का उपयोग कर रहे हैं और प्राप्त Forbidden (CSRF cookie not set.)कर रहे हैं , तो ऐसा इसलिए हो सकता है क्योंकि डिफ़ॉल्ट रूप से fetchसत्र कुकीज़ शामिल नहीं है, जिसके परिणामस्वरूप Django यह सोचता है कि आप पृष्ठ लोड करने वाले से भिन्न उपयोगकर्ता हैं ।

आप विकल्प credentials: 'include'लाने के लिए सत्र टोकन शामिल कर सकते हैं :

var csrftoken = getCookie('csrftoken');
var headers = new Headers();
headers.append('X-CSRFToken', csrftoken);
fetch('/api/upload', {
    method: 'POST',
    body: payload,
    headers: headers,
    credentials: 'include'
})

क्या मुझे पता है कि वह हैडर () विधि है जो आपने तुरंत की है? वैश्विक जावास्क्रिप्ट विधि क्या है?
अबज रॉकर्स

@AbzRockers: हाँ, Headersएक वैश्विक जावास्क्रिप्ट इंटरफ़ेस है, जो HTML5 Fetch API का हिस्सा है। developer.mozilla.org/en-US/docs/Web/API/Headers
user85461

13

से यह आप को जोड़कर इसे हल कर सकते ensure_csrf_cookie डेकोरेटर हुए अपने दृश्य पर

from django.views.decorators.csrf import ensure_csrf_cookie
@ensure_csrf_cookie
def yourView(request):
 #...

यदि यह विधि काम नहीं करती है। आप मिडिलवेयर में सीएसआरएफ पर टिप्पणी करने का प्रयास करेंगे। और फिर से परीक्षण करें।


5

डीआरएफ के साथ काम करते समय मैं एक समान स्थिति में आया था, समाधान आकर्षक था। ur_py में व्यू के लिए .as_view () विधि


बेहतर होगा कि आप कुछ कोड को भी शामिल करें
एलेक्स जोलीग

1
@AlexJolig को बस एक ही मुद्दे का सामना करना पड़ा, समस्या यह थी कि मैं .as_view()अपने ApiView को आफ़्टर जोड़ना भूल गया था ताकि कोड कैसा दिखता था: urlpatterns += path('resource', ResourceView)और यह है कि इसे कैसे पसंद करना चाहिए: urlpatterns += path('resource', ResourceView.as_view())
Alveona

4

यदि आप DRF का उपयोग कर रहे हैं, तो जांचें कि क्या आपके urlpatterns सही हैं, शायद आप भूल गए .as_view():

ताकि मेरा कोड कैसा दिखे:

urlpatterns += path('resource', ResourceView) 

और यह है कि यह कैसे करना चाहिए:

urlpatterns += path('resource', ResourceView.as_view())

1

यह जाँचने का प्रयास करें कि क्या आपने सेटिंग्स में स्थापित किया है

 MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',)

टेम्पलेट में डेटा को csrf_token के साथ स्वरूपित किया गया है:

<form>{% csrf_token %}
</form>

मेरे पास आपका सभी कोड नहीं है, लेकिन मेरा मानना ​​है कि मामला यहाँ है: डिपॉजिट (अनुरोध, account_num): इसे डिपॉजिट (अनुरोध) को बदलने के लिए: और account_num को कॉलबैक करने का एक तरीका खोजें। अब यह निर्भर करता है कि account_num एक टेबल फील्ड या वैरिएबल है।
drabo2005

यह एक {{account_num}} वेरिएबल है, लेकिन यह csrf टोकन को कैसे प्रभावित करता है?

मेरा मानना ​​है कि सीएसआरएफ टोकन केवल अनुरोध के लिए संदर्भित है, इसलिए यह सत्यापित नहीं कर सकता है कि यहां चर के साथ क्या हो रहा है। जाँचें djangoproject.com हो सकता है कि आपको csrf_token के बारे में एक उचित उत्तर मिल सके।
drabo2005

1

हाल ही में पाइथन में एक बग के कारण यह समस्या फिर से उत्पन्न हुई।

http://bugs.python.org/issue22931

https://code.djangoproject.com/ticket/24280

प्रभावित संस्करणों में 2.7.8 और 2.7.9 थे। यदि कोई एक [वर्ण सम्‍मिलित है, तो कुकी को सही तरीके से नहीं पढ़ा गया था ।

पायथन (2.7.10) को अपडेट करने से समस्या ठीक हो जाती है।


1

यह तब भी होता है जब आप प्रपत्र क्रिया सेट नहीं करते हैं।
मेरे लिए, यह त्रुटि थी जब कोड था:

<form class="navbar-form form-inline my-2 my-lg-0" role="search" method="post">

जब मैंने इसमें अपना कोड सही किया:

<form class="navbar-form form-inline my-2 my-lg-0" action="{% url 'someurl' %}" role="search" method="post">

मेरी त्रुटि गायब हो गई।


0

समस्या यह प्रतीत होती है कि आप GETपहले फॉर्म प्राप्त किए बिना डेटा को सीधे या सीधे पोस्ट करने के अनुरोधों को संभाल नहीं रहे हैं ।

जब आप पहली बार पृष्ठ तक पहुंचते हैं, तो क्लाइंट GETअनुरोध भेजेगा , उस स्थिति में आपको उचित फॉर्म के साथ html भेजना चाहिए।

बाद में, उपयोगकर्ता फॉर्म भरता है और भेजता है POST फ़ॉर्म डेटा के साथ अनुरोध ।

आपका विचार होना चाहिए:

def deposit(request,account_num):
   if request.method == 'POST':
      form_=AccountForm(request.POST or None, instance=account)
      if form.is_valid(): 
          #handle form data
          return HttpResponseRedirect("/history/" + account_num + "/")
      else:
         #handle when form not valid
    else:
       #handle when request is GET (or not POST)
       form_=AccountForm(instance=account)

    return render_to_response('history.html',
                          {'account_form': form},
                          context_instance=RequestContext(request))

0

जांचें कि वेबसाइटों के लिए डिफ़ॉल्ट विकल्प के साथ क्रोम के कुकीज़ सेट किए गए हैं। स्थानीय डेटा को सेट करने की अनुमति दें (अनुशंसित)।


0

विधि 1:

from django.shortcuts import render_to_response
return render_to_response(
    'history.html',
    RequestContext(request, {
        'account_form': form,
    })

विधि 2:

from django.shortcuts import render
return render(request, 'history.html', {
    'account_form': form,
})

क्योंकि render_to_response विधि से प्रतिक्रिया कुकीज़ की कुछ समस्या हो सकती है।


0

मैं सिर्फ एक बार मिला हूं, समाधान कुकीज़ को खाली करना है। और SECRET_KEY संबंधित डीबग करते समय बदला जा सकता है।


0

मेरे ब्राउज़र का कैश साफ़ करने से मेरे लिए यह समस्या ठीक हो गई। जब यह हुआ तो मैं दूसरे प्रोजेक्ट पर काम करने के बाद django-blog-zinnia ट्यूटोरियल करने के लिए स्थानीय विकास परिवेशों के बीच स्विच कर रहा था। सबसे पहले, मैंने सोचा कि ट्यूटोरियल के मिलान के लिए INSTALLED_APPS के आदेश को बदलने के कारण यह हुआ था, लेकिन मैंने इन्हें वापस सेट किया और कैश को साफ़ करने तक इसे ठीक करने में असमर्थ था।


0

मैं पहले Django 1.10 का उपयोग कर रहा था। इसलिए मैं इस समस्या का सामना कर रहा था। अब मैंने इसे Django 1.9 में डाउनग्रेड किया और यह ठीक काम कर रहा है।


1.10.3 का उपयोग करते हुए मेरे पास यह मुद्दा था। 1.10.6 में अपग्रेड करना मेरे लिए तय है।
माइक डार्मेटको

0

मेरे पास एक ही त्रुटि थी, मेरे मामले में method_decorator मदद करता है:

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

method_decorator(csrf_protect)
def post(self, request):
    ...

0

सुनिश्चित करें कि आपका django सत्र बैकएंड सेटिंग्स में ठीक से कॉन्फ़िगर किया गया है। तो यह कोशिश करो,

class CustomMiddleware(object):
  def process_request(self,request:HttpRequest):
      get_token(request)

इस मिडलवेयर को django वर्जन के आधार पर या उसके settings.pyनीचे जोड़ेंMIDDLEWARE_CLASSESMIDDLEWARE

get_token - एक POST फॉर्म के लिए आवश्यक CSRF टोकन लौटाता है। टोकन एक अल्फ़ान्यूमेरिक मान है। यदि पहले से सेट नहीं है, तो एक नया टोकन बनाया जाता है।


-4

आपके विचार में आप csrf डेकोरेटर का उपयोग कर रहे हैं ??

from django.views.decorators.csrf import csrf_protect

@csrf_protect def view(request, params): ....

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