জাজানো সিএসআরএফ কুকি সেট নেই


86

কিছুক্ষণের জন্য আমার এখন কিছুটা সমস্যা আছে, আমি সিএসআরএফ কুকি সেট না করে ভোগ করছি। নীচের কোডগুলি দেখুন

পাইথন

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))

এইচটিএমএলে এখানে কোড রয়েছে

এইচটিএমএল

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

আমি আটকে গিয়েছি, আমি ইতিমধ্যে কুকি সাফ করেছি, অন্য ব্রাউজার ব্যবহার করেছি তবে এখনও সিএসআরএফ কুকি সেট করা হয়নি।


আপনার কাছে কি CsrfViewMiddlewareআপনার MIDDLEWARE_CLASSESসেটিং?
অ্যালেক্সেক্স

{%csrf_token%}টেমপ্লেটে আপনার ফর্মটি যুক্ত করুন ।
রোহান

4
@ রোহান এটি ইতিমধ্যে আছে, প্রশ্ন দেখুন।
অ্যালেক্সেক্স

4
হ্যাঁ, আমার কাছে ইতিমধ্যে সিএসআরভিউউমিডলওয়ার রয়েছে এবং আমার ফর্মটিতে ইতিমধ্যে csrf_ টোকেন রয়েছে

আমি জ্যাঙ্গো কর্স মডিউলটি ব্যবহার করেছি এবং রিএ্যাকটিজেএস এর মাধ্যমে এটি অ্যাক্সেস করছি। (দুজনেই লোকালহোস্টে ছিলেন)। আমারও ওপি-র সমস্যা ছিল। আমি খুঁজে পেলাম যে credentials: 'include'পোষ্ট অনুরোধে যুক্ত করা এবং তারপরে জাজোর সেটিংগুলিতে ALSO যুক্ত করে pypy: ভিউটিতে যোগ CORS_ALLOW_CREDENTIALS = Trueকরার প্রয়োজন ছাড়াই সমস্যাটি সমাধান করেছে বলে @csrf_exemptমনে হচ্ছে। এটি আসলে ডক্সে রয়েছে ... পিপিআই.আর / প্রকল্প / ডিজেঙ্গো- কর্স- হেডারস- মাল্টি * আমি জানি এটি উপরের একটি প্রশ্নের সাথে সম্পর্কিত তবে আমি এখনও কোনও মন্তব্য করতে পারি না এবং আশা করি অন্য সময়টি সংরক্ষণ করার চেষ্টা করতে চাই আমাকে T
DW

উত্তর:


134

CSRF_COOKIE_SECURE = Trueসেট করা থাকলে এবং আপনি নিরাপদে সাইট অ্যাক্সেস করছেন বা এখানে এবং এখানেCSRF_COOKIE_HTTPONLY = True বর্ণিত হিসাবে সেট করা থাকলে এটিও ঘটতে পারে


10
ধন্যবাদ! একই জন্য যায় SESSION_COOKIE_SECURE = True
নোনাম এসএল

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")

61
সম্পূর্ণরূপে সুরক্ষা ব্যবস্থাটি অক্ষম করা ত্রুটিটি ঠিক করার পক্ষে ভাল উপায় নয়।
গিলাইম অ্যালগিস

4
যদি আপনি ২০১৩ সালে কুকিেক্টর-জ্যাঙ্গো ব্যবহার করছেন তবে এটি উত্পাদনের সঠিক উত্তর।
আন্দ্রে ডুয়ার্টে

4
কেন, কৌতূহলের বাইরে?
প্যাট্রিক গ্যালাগার

4
এই উত্তরটি "সম্পূর্ণরূপে সুরক্ষা ব্যবস্থাটি নিষ্ক্রিয় করার" পরামর্শ দেয় না, কেবলমাত্র সিএসআরএফ টোকেন ব্যবহার করতে সক্ষম না হতে পারে এমন একক ক্ষেত্রে এটি কীভাবে করবেন তা কেবল এটিই বলে tells এটি আমার ক্ষেত্রে, যেখানে আমার কোনও বহিরাগত ক্লায়েন্টকে একটি পোস্ট পদক্ষেপের প্রয়োজন।
মারিওটোমো

আপনি যখন ইউআই থেকে সিএসআরএফ টোকেন সরবরাহ করতে না পারেন তখন এটি টোডো ধরণের আইটেম যা আমি বিকাশের পর্যায়ে ব্যবহার করি। তবে অবশ্যই কোনও লাইভ অ্যাপের জন্য প্রস্তাবিত নয়।
আমান মদন

24

আপনি যদি ব্যবহার করছেন লগইন হওয়া ব্যবহারকারী হিসাবে পোষ্ট অনুরোধ করতে এবং পেতে এইচটিএমএল 5 ফেচ এপিআইForbidden (CSRF cookie not set.) এটি ডিফল্টরূপে হতে পারেfetch সেশন কুকিজ অন্তর্ভুক্ত না হয়, ফলস্বরূপ জাঙ্গো ভাবছেন যে আপনি পৃষ্ঠাটি লোড করেছেন তার চেয়ে আলাদা ব্যবহারকারী ।

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'
})

আমি জানতে পারি যে আপনি যে শিরোলেখ () পদ্ধতিটি ইনস্ট্যান্ট করেছেন তা কী? এটি কি বিশ্বব্যাপী জাভাস্ক্রিপ্ট পদ্ধতি?
অ্যাবজ রকার্স

@ আবজরোকারস: হ্যাঁ, Headersএটি একটি বিশ্বব্যাপী জাভাস্ক্রিপ্ট ইন্টারফেস, এইচটিএমএল 5 ফেচ এপিআইয়ের অংশ। বিকাশকারী.মোজিলা.আর.ইন-
ইউএস

13

থেকে এই আপনাকে জুড়তে দ্বারা এটি সমাধান করতে পারে ensure_csrf_cookie প্রসাধক আপনার দৃশ্যে

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

যদি এই পদ্ধতিটি কাজ করে না। আপনি মিডওয়্যারটিতে সিএসআরএফ মন্তব্য করার চেষ্টা করবেন। এবং আবার পরীক্ষা।


5

ডিআরএফের সাথে কাজ করার সময় আমি একইরকম পরিস্থিতি পেলাম, সমাধানটি url.py এ দেখুনটিতে .as_view () পদ্ধতি যুক্ত করছিল was


আপনি যদি কিছু
কোডও

4
@ অ্যালেক্স জোলিগ ঠিক একই সমস্যার মুখোমুখি হয়েছিলেন, সমস্যাটি হ'ল আমি .as_view()আমার অ্যাপিভিউয়ের সাথে আফটার যুক্ত করতে ভুলে গিয়েছিলাম যাতে কোডটি কেমন দেখাচ্ছে: urlpatterns += path('resource', ResourceView)এবং এটির মতোই এটি করা উচিত: urlpatterns += path('resource', ResourceView.as_view())
আলভেওনা

4

আপনি যদি ডিআরএফ ব্যবহার করছেন তবে আপনার urlpatters সঠিক কিনা তা পরীক্ষা করুন, সম্ভবত আপনি ভুলে গেছেন .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',)

টেমপ্লেটে ডেটা সিএসআরএফ_ টোকেন দিয়ে ফর্ম্যাট করা হয়েছে:

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

আমার কাছে আপনার সমস্ত কোড নেই তবে আমি বিশ্বাস করি যে বিষয়টি এখানেই রয়েছে: ডিএফ ডিপোজিট (অনুরোধ, অ্যাকাউন্ট_নাম): এটিকে ডিএফ ডিপোজিটে (অনুরোধ) পরিবর্তন করে: এবং অ্যাকাউন্ট_নামকে কলব্যাক করার কোনও উপায় সন্ধান করুন। এখন এটি নির্ভর করে যদি অ্যাকাউন্ট_নামটি কোনও টেবিল ক্ষেত্র বা কোনও ভেরিয়েবল হয়।
drabo2005

এটি একটি পরিবর্তনশীল {n অ্যাকাউন্ট_নাম}}, তবে কীভাবে এটি সিএসআরএফ টোকেনকে প্রভাবিত করে?

আমি বিশ্বাস করি যে সিএসআরএফ টোকেন কেবলমাত্র অনুরোধের কাছে রেফার করেছে, সুতরাং এটি এখানে ভেরিয়েবলের সাথে যা যাচাই করা বা পরিচালনা করতে পারে না। djangoproject.com চেক করুন আপনি সিএসআরএফ_ টোকেন সম্পর্কে সঠিক উত্তর পেতে পারেন।
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অনুরোধ প্রেরণ করবেন, সেক্ষেত্রে আপনার উপযুক্ত ফর্ম সহ এইচটিএমএল প্রেরণ করা উচিত।

পরে, ব্যবহারকারী ফর্মটি পূরণ করে প্রেরণ করে 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,
})

কারণ রেন্ডার_ থেকে_উত্তেজিত পদ্ধতিতে প্রতিক্রিয়া কুকিজের কিছু সমস্যা হতে পারে।


0

আমি সবেমাত্র একবার দেখা করেছি, সমাধানটি হল কুকিজ খালি করা। SECRET_KEY সম্পর্কিত ডিবাগ করার সময় এবং পরিবর্তন করা যেতে পারে।


0

আমার ব্রাউজারের ক্যাশে সাফ করা আমার জন্য এই সমস্যাটি স্থির করেছে। আমি যখন অন্য প্রকল্পে কাজ করার পরে জাঙ্গো-ব্লগ-জিনিয়া টিউটোরিয়ালটি করতে স্থানীয় উন্নয়ন পরিবেশের মধ্যে স্যুইচ করছি। প্রথমে আমি ভেবেছিলাম টিউটোরিয়ালটির সাথে মেলে INSTALLED_APPS এর ক্রম পরিবর্তন করার কারণে এটি ঘটেছে তবে আমি এগুলি সেট করে রেখেছি এবং ক্যাশে সাফ না হওয়া পর্যন্ত এটি সংশোধন করতে অক্ষম।


0

আমি আগে জঙ্গো 1.10 ব্যবহার করছিলাম। সুতরাং আমি এই সমস্যার মুখোমুখি হয়েছি। এখন আমি এটিকে জ্যাঙ্গো ১.৯ এ ডাউনগ্রেড করেছি এবং এটি ঠিকঠাক কাজ করছে।


1.10.3 ব্যবহার করে আমার এই সমস্যাটি ছিল। 1.10.6 এ আপগ্রেড করা আমার জন্য এটি স্থির করে।
মাইক ডারমেটকো

0

আমার ক্ষেত্রেও একই ত্রুটি ছিল, আমার ক্ষেত্রে মেথড_ডেকোরেটর যুক্ত করার ক্ষেত্রে:

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

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

0

আপনার জাঙ্গো সেশন ব্যাকএন্ডটি সেটিংস.পাইয়ে সঠিকভাবে কনফিগার করা আছে তা নিশ্চিত করুন। তারপরে এটি চেষ্টা করুন,

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

জ্যাঙ্গো সংস্করণটির settings.pyনীচে MIDDLEWARE_CLASSESবা তার MIDDLEWAREউপর নির্ভর করে এই মিডলওয়্যারটি যুক্ত করুন

get_token - একটি পোষ্ট ফর্মের জন্য প্রয়োজনীয় সিএসআরএফ টোকেন প্রদান করে। টোকেনটি একটি বর্ণানুক্রমিক মান। একটি ইতিমধ্যে সেট না করা থাকলে একটি নতুন টোকেন তৈরি করা হয়।


-4

আপনার দৃষ্টিতে আপনি কি সিএসআরএফ ডেকরেটার ব্যবহার করছেন ??

from django.views.decorators.csrf import csrf_protect

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

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