জাজানো সিএসআরএফ একটি অ্যাজাক্স পোস্টের অনুরোধটি ব্যর্থ হয়েছে check


180

আমি আমার এজেএক্স পোস্টের মাধ্যমে জ্যাঙ্গোর সিএসআরএফ সুরক্ষা প্রক্রিয়া মেনে চলতে কিছু সহায়তা ব্যবহার করতে পারি। আমি এখানে দিকনির্দেশগুলি অনুসরণ করেছি:

http://docs.djangoproject.com/en/dev/ref/contrib/csrf/

আমি তাদের এজেএক্স নমুনা কোডটি সেই পৃষ্ঠায় ঠিক অনুলিপি করেছি:

http://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax

আমি কল getCookie('csrftoken')করার আগে এর বিষয়বস্তুগুলি মুদ্রণের জন্য একটি সতর্কতা রেখেছিলাম xhr.setRequestHeaderএবং এটি সত্যিই কিছু ডেটা সহ জনপ্রিয় হয়। টোকনটি সঠিক কিনা তা যাচাই করবেন তা সম্পর্কে আমি নিশ্চিত নই, তবে আমি উত্সাহিত করেছি যে এটি কিছু খুঁজে পেয়ে এবং প্রেরণ করবে।

তবে জ্যাঙ্গো এখনও আমার এজেএক্স পোস্ট প্রত্যাখ্যান করছে।

এখানে আমার জাভাস্ক্রিপ্ট:

$.post("/memorize/", data, function (result) {
    if (result != "failure") {
        get_random_card();
    }
    else {
        alert("Failed to save card data.");
    }
});

জাঙ্গো থেকে আমি যে ত্রুটিটি দেখছি তা এখানে:

[23 / ফেব্রুয়ারী / 2011 22:08:29] "পোস্ট করুন / মুখস্থ / HTTP / 1.1" 403 2332

আমি নিশ্চিত যে আমি কিছু মিস করছি, এবং সম্ভবত এটি সহজ, তবে আমি এটি জানি না। আমি এসও এর আশেপাশে অনুসন্ধান করেছি এবং csrf_exemptসজ্জাকারীর মাধ্যমে আমার দৃষ্টিভঙ্গির জন্য সিএসআরএফ চেক বন্ধ করার বিষয়ে কিছু তথ্য দেখেছি , তবে আমি এটি আবেদনকারী মনে করি না। আমি এটি চেষ্টা করেছি এবং এটি কার্যকর হয়েছে, তবে আমি বরং আমার পোষ্টকে জ্যাঙ্গো যেভাবে সম্ভব হয়েছিল তা প্রত্যাশা করার জন্য তৈরি করার জন্য তৈরি করার চেষ্টা করতাম possible

কেবলমাত্র এটি সহায়ক হলে এখানে আমার দৃষ্টিভঙ্গি যা করছে তার সংক্ষিপ্তসার:

def myview(request):

    profile = request.user.profile

    if request.method == 'POST':
        """
        Process the post...
        """
        return HttpResponseRedirect('/memorize/')
    else: # request.method == 'GET'

        ajax = request.GET.has_key('ajax')

        """
        Some irrelevent code...
        """

        if ajax:
            response = HttpResponse()
            profile.get_stack_json(response)
            return response
        else:
            """
            Get data to send along with the content of the page.
            """

        return render_to_response('memorize/memorize.html',
                """ My data """
                context_instance=RequestContext(request))

আপনার জবাবের জন্য ধন্যবাদ!


1
আপনি জাঙ্গোর কোন সংস্করণ ব্যবহার করছেন?
zsquare

আপনি কি সঠিক সিএসআরএফ মিডলওয়্যার ক্লাসে যুক্ত করেছেন এবং সেগুলি সঠিক ক্রমে রেখেছেন?
11:57

জাকুব আমার প্রশ্নের উত্তর নীচে দিয়েছিলেন, তবে কেবল যদি এটি অন্যান্য লোকের পক্ষে কার্যকর হয় তবে: @ জেস্কোয়ার: সংস্করণ 1.2.3। @ মঙ্গুজ_জা: হ্যাঁ, এগুলি যুক্ত করা হয়েছে এবং সঠিক ক্রমে।
ফায়ার বুশ

উত্তর:


181

আসল সমাধান

ঠিক আছে, আমি সমস্যাটি সনাক্ত করতে পেরেছি। এটি জাভাস্ক্রিপ্টে রয়েছে (যেমন আমি নীচে প্রস্তাব দিয়েছি) কোডে।

আপনার যা প্রয়োজন তা হ'ল:

$.ajaxSetup({ 
     beforeSend: function(xhr, settings) {
         function getCookie(name) {
             var cookieValue = null;
             if (document.cookie && document.cookie != '') {
                 var cookies = document.cookie.split(';');
                 for (var i = 0; i < cookies.length; i++) {
                     var cookie = jQuery.trim(cookies[i]);
                     // Does this cookie string begin with the name we want?
                     if (cookie.substring(0, name.length + 1) == (name + '=')) {
                         cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                         break;
                     }
                 }
             }
             return cookieValue;
         }
         if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) {
             // Only send the token to relative URLs i.e. locally.
             xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
         }
     } 
});

অফিসিয়াল ডক্সে পোস্ট করা কোডের পরিবর্তে: https://docs.djangoproject.com/en/2.2/ref/csrf/

ওয়ার্কিং কোডটি এই জাঙ্গো এন্ট্রি থেকে আসে: http://www.djangoproject.com/weblog/2011/feb/08/ সুরক্ষা/

সুতরাং সাধারণ সমাধানটি হ'ল: "এজ্যাক্স্যান্ড হ্যান্ডলারের পরিবর্তে এজ্যাক্সেটআপ হ্যান্ডলারটি ব্যবহার করুন"। আমি জানি না কেন এটি কাজ করে। তবে এটি আমার জন্য কাজ করে :)

পূর্ববর্তী পোস্ট (উত্তর ছাড়াই)

আমি আসলে একই সমস্যা অনুভব করছি।

এটি জ্যাঙ্গো ১.২.৫ এ আপডেট করার পরে ঘটে - জাজানো ১.২.৪ এজেএক্স পোস্টের অনুরোধগুলির সাথে কোনও ত্রুটি ছিল না (এজেএক্স কোনওভাবেই সুরক্ষিত ছিল না, তবে এটি ঠিক কাজ করেছিল)।

ওপির মতোই, আমি জাঙ্গো ডকুমেন্টেশনে পোস্ট করা জাভাস্ক্রিপ্ট স্নিপেট চেষ্টা করেছি। আমি jQuery 1.5 ব্যবহার করছি। আমি "django.middleware.csrf.CsrfViewMiddleware" মিডওয়্যারের ব্যবহার করছি।

আমি মিডলওয়্যার কোডটি অনুসরণ করার চেষ্টা করেছি এবং আমি জানি যে এটি এতে ব্যর্থ হয়:

request_csrf_token = request.META.get('HTTP_X_CSRFTOKEN', '')

এবং তারপর

if request_csrf_token != csrf_token:
    return self._reject(request, REASON_BAD_TOKEN)

এটি "যদি" সত্য হয়, কারণ "অনুরোধ_সিএসআরএফ_ টোকেন" খালি।

মূলত এর অর্থ হ'ল শিরোনামটি সেট করা নেই। সুতরাং এই জেএস লাইনে কোনও সমস্যা আছে:

xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));

?

আমি আশা করি যে সরবরাহিত বিবরণগুলি সমস্যা সমাধানে আমাদের সহায়তা করবে :)


এই কাজ! আপনি এটি উপরে পেস্ট করার সাথে সাথে .ajaxSetup ফাংশনটি রেখেছি এবং এখন আমি 403 ত্রুটি ছাড়াই পোস্ট করতে সক্ষম হয়েছি। সমাধান ভাগ করে নেওয়ার জন্য আপনাকে ধন্যবাদ, জাকুব। ভাল সন্ধান। :)
ফায়ার বুশ

JQuery ডক্সের ajaxSetupপরিবর্তে ajaxSendরান ব্যবহার করে ব্যবহার করুন: api.jquery.com/jQuery.ajaxSetup
মার্ক ল্যাভিন

১.৩ ব্যবহার করে অফিসিয়াল জ্যাঙ্গো ডকুমেন্টেশন এন্ট্রি আমার পক্ষে কাজ করেছিল।
monkut

1
আমি চেষ্টা কিন্তু এই আমি jQuery v1.7.2 ব্যবহার করছি আমার জন্য কাজ বলে মনে হচ্ছে না, আমার প্রশ্ন হচ্ছে stackoverflow.com/questions/11812694/...
Daydreamer

যখন মোবাইল ডিভাইস থেকে পৃষ্ঠাটি অনুরোধ করা হয় তখন আমাকে সিএসআরএফ কুকিকে জোর করে সেট করার জন্য আমার ভিউ ফাংশনে টীকাটি যোগ করতে হবে @ সেন্সর_সিআরসি_কুকি
কেন 12

168

আপনি যদি $.ajaxফাংশনটি ব্যবহার করেন , আপনি কেবল csrfডেটা বডিতে টোকন যুক্ত করতে পারেন :

$.ajax({
    data: {
        somedata: 'somedata',
        moredata: 'moredata',
        csrfmiddlewaretoken: '{{ csrf_token }}'
    },

2
যখন আমি চিহ্নিত উত্তরটি ব্যবহার করি তা আমার পক্ষে কাজ করে তবে আমি যদি এখানে আপনার সমাধানটি ব্যবহার করি তবে তা হয় না। তবে আপনার সমাধানটি কাজ করা উচিত, কেন এটি হয় না তা আমি বুঝতে পারি না। জ্যাঙ্গো ১.৪ এ আরও কিছু করার দরকার আছে?
Houman

1
ধন্যবাদ! খুবই সোজা. এখনও জাজানো ১.৮ এবং জ্যাকোয়ারি ২.১.৩ এ কাজ করে
আলেজান্দ্রো ভেনটিমিলা

19
এই সমাধানটির জন্য জাভাস্ক্রিপ্টটি কী টেম্পলেটটিতে এম্বেড করা দরকার?
মোক্স 6

15
@ মক্স: এটি এইচটিএমএল এ রাখুন, তবে আপনার জেএস ফাইলের উপরে যেখানে একটি <script type="text/javascript"> window.CSRF_TOKEN = "{{ csrf_token }}"; </script>
অজ্যাক্স

ধন্যবাদ! তাই সহজ এবং মার্জিত। এটি আমার জন্য জাজানো 1.8 নিয়ে কাজ করে। আমি একটি ডাকে csrfmiddlewaretoken: '{{ csrf_token }}'আমার dataঅভিধানে যুক্ত করেছি $.post
পাভেল যুদায়েভ

75

আপনার jQuery কোডে এই লাইনটি যুক্ত করুন:

$.ajaxSetup({
  data: {csrfmiddlewaretoken: '{{ csrf_token }}' },
});

এবং সম্পন্ন।


আমার ফর্মটিতে একটি ফাইল আপলোড বাদে আমি এটি চেষ্টা করেছি। আমার ব্যাকএন্ডটি জাঙ্গো এবং তবুও ত্রুটি 400CSRF Failed: CSRF token missing or incorrect.
হুসেন

16

সমস্যাটি কারণ জ্যাঙ্গো ফর্ম ডেটার অংশ হিসাবে কুকির কাছ থেকে মানটি ফেরত পাঠানো আশা করে। পূর্ববর্তী উত্তর থেকে কোডটি কুকির মান খুঁজে বের করতে এবং ফর্ম ডেটাতে রেখে জাভাস্ক্রিপ্ট পাচ্ছে। প্রযুক্তিগত দৃষ্টিকোণ থেকে এটি করার একটি সুন্দর উপায় রয়েছে তবে এটি কিছুটা ভারবস দেখাচ্ছে look

অতীতে, আমি জাভাস্ক্রিপ্টটি পোস্টের ডেটাতে টোকেন মান রাখার জন্য আরও সহজভাবে এটি করেছি।

আপনি যদি আপনার টেমপ্লেটে {% csrf_token% use ব্যবহার করেন তবে আপনি একটি লুকানো ফর্ম ক্ষেত্র নির্গত করতে পাবেন যা মান বহন করে। তবে, আপনি যদি {s csrf_token} use ব্যবহার করেন তবে আপনি কেবলমাত্র টোকেনের খালি মূল্য পাবেন, তাই আপনি এটি জাভাস্ক্রিপ্টে এর মতো ব্যবহার করতে পারেন ....

csrf_token = "{{ csrf_token }}";

তারপরে আপনি এটি অন্তর্ভুক্ত করতে পারেন, হ্যাশে প্রয়োজনীয় কী নাম সহ আপনি এজাজ কলটিতে ডেটা হিসাবে জমা দিন।


@ এহেল্কে আপনার কাছে স্ট্যাটিক ফাইল থাকতে পারে। সোর্স কোড, আপনি একটা চমৎকার উদাহরণ দেখতে পারেন যেখানে আপনি জ্যাঙ্গো ভেরিয়েবল রেজিস্টার মধ্যে window, বস্তুর তাই তারা পরে অ্যাক্সেস করা যায়। এমনকি স্থির ফাইলগুলিতেও।
কিটকাট

3
@ কিটকাট প্রকৃতপক্ষে :) এখানে আমার প্রাচীন, অজ্ঞ মন্তব্যটির জন্য দুঃখিত। ভাল যুক্তি.
aehlke

স্থির ফাইল আবার। কোনও সমস্যা নয়, যদি আপনি আপনার এইচটিএমএলকে খুব সামান্য বিএসএসই মনে করেন না। আমি কেবলমাত্র মূল এইচটিএমএল টেমপ্লেটে {{csrf_token, put রেখেছি, প্রয়োজনীয় জেঞ্জগুলি থেকে খুব বেশি দূরে নয়। একটি কবজ মত কাজ।
জেএল পেয়ারেট

14

{% csrf_token %}এইচটিএমএল রাখা ভিতরে টেমপ্লেট<form></form>

যেমন কিছু অনুবাদ:

<input type='hidden' name='csrfmiddlewaretoken' value='Sdgrw2HfynbFgPcZ5sjaoAI5zsMZ4wZR' />

সুতরাং কেন আপনার জেএস-এ এটি কেবল গ্রেপ করবেন না:

token = $("#change_password-form").find('input[name=csrfmiddlewaretoken]').val()

এবং তারপরে এটি পাস করুন যেমন কিছু পোস্ট করা যেমন:

$.post( "/panel/change_password/", {foo: bar, csrfmiddlewaretoken: token}, function(data){
    console.log(data);
});

9

নন-জ্যাকারি উত্তর:

var csrfcookie = function() {
    var cookieValue = null,
        name = 'csrftoken';
    if (document.cookie && document.cookie !== '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = cookies[i].trim();
            if (cookie.substring(0, name.length + 1) == (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
};

ব্যবহার:

var request = new XMLHttpRequest();
request.open('POST', url, true);
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
request.setRequestHeader('X-CSRFToken', csrfcookie());
request.onload = callback;
request.send(data);

8

যদি আপনার ফর্মটি জেএসও ছাড়াই জ্যাঙ্গোতে সঠিকভাবে পোস্ট হয় তবে আপনি সিএসআরএফ টোকেনের কোনও হ্যাকিং বা অগোছালো পাস না করেই অগ্রবর্তীভাবে এটি অজ্যাক্সের সাহায্যে বাড়িয়ে তুলতে সক্ষম হবেন। কেবলমাত্র পুরো ফর্মটি সিরিয়ালাইজ করুন এবং এটি লুকানো সিএসআরএফ ক্ষেত্র সহ আপনার সমস্ত ফর্ম ক্ষেত্রগুলি স্বয়ংক্রিয়ভাবে গ্রহণ করবে :

$('#myForm').submit(function(){
    var action = $(this).attr('action');
    var that = $(this);
    $.ajax({
        url: action,
        type: 'POST',
        data: that.serialize()
        ,success: function(data){
            console.log('Success!');
        }
    });
    return false;
});

আমি এটি জ্যাঙ্গো 1.3+ এবং jQuery 1.5+ এর সাথে পরীক্ষা করেছি। স্পষ্টতই এটি কোনও জ্যাঙ্গো অ্যাপ্লিকেশন নয়, কোনও HTML ফর্মের জন্য কাজ করবে।


5

ফায়ারবগের সাথে ফায়ারফক্স ব্যবহার করুন। এজাক্স অনুরোধটি ফায়ার করার সময় 'কনসোল' ট্যাবটি খুলুন। সঙ্গে DEBUG=Trueআপনি পেতে প্রতিক্রিয়া ত্রুটি পৃষ্ঠা জ্যাঙ্গো চমৎকার এবং আপনি এমনকি কনসোল ট্যাবে Ajax সাড়া অনুষ্ঠিত এইচটিএমএল দেখতে পারেন।

তারপরে আপনি বুঝতে পারবেন ত্রুটিটি কী।


5

গৃহীত উত্তর সম্ভবত একটি লাল হেরিং। জ্যাঙ্গো ১.২.৪ এবং ২.২.৫ এর মধ্যে পার্থক্যটি ছিল এজেএক্স অনুরোধগুলির জন্য সিএসআরএফ টোকেনের প্রয়োজন।

আমি জাজানো ১.৩ এ এই সমস্যাটি পেলাম এবং এটি সিএসআরএফ কুকি সেট না করার কারণে হয়েছিল প্রথম স্থানে না করায় হয়েছিল। জাজানো কুকি সেট না করে না যদি না হয়। সুতরাং জ্যাঙ্গো ১.২.৪ এ চলছে এমন একচেটিয়া বা ভারী অ্যাজ্যাক্স সাইটটি সম্ভবত কোনও ক্লায়েন্টকে একটি টোকেন প্রেরণ করবে না এবং তারপরে টোকেনের প্রয়োজনীয় আপগ্রেড 403 ত্রুটির কারণ হতে পারে।

আদর্শ ফিক্সটি এখানে রয়েছে: http://docs.djangoproject.com/en/dev/ref/contrib/csrf/#page-uses-ajax-without-any-html-form
তবে আপনাকে 1.4 অপেক্ষা করতে হবে যদি না এটি কেবল কোডটি ধরায় ডকুমেন্টেশন

সম্পাদন করা

এটিও নোট করুন যে পরবর্তীকালে জাঙ্গো ডক্স jQuery 1.5 তে একটি বাগ নোট করে যাতে আপনি জঙ্গো প্রস্তাবিত কোডটি 1.5.5 বা পরে ব্যবহার করছেন তা নিশ্চিত করুন: http://docs.djangoproject.com/en/1.3/ref/contrib/csrf/# Ajax


আমার উত্তরটি এটি লেখার সময় যথার্থ ছিল :) এটি জ্যাঙ্গোকে 1.2.4 থেকে 1.2.5 এ আপডেট করার ঠিক পরে হয়েছিল। এটি তখনও ছিল যখন নতুন jQuery সংস্করণটি 1.5 ছিল। এটি সমস্যার উত্সটি জেগুয়েরি (1.5) বগড হয়ে গেছে এবং এই তথ্যটি এখন জ্যাঙ্গো ডকের সাথে যুক্ত করা হয়েছে, যেমনটি আপনি বলেছেন। আমার ক্ষেত্রে: কুকি ওয়াস সেট এবং টোকেনটি এজেএক্স অনুরোধে যুক্ত করা হয়নি। প্রদত্ত ফিক্সটি বাগযুক্ত jQuery 1.5 এর জন্য কাজ করেছে। এখন পর্যন্ত, আপনি কেবলমাত্র সরকারী দস্তাবেজগুলিতে আটকে থাকতে পারেন, সেখানে দেওয়া উদাহরণ কোডটি ব্যবহার করে এবং নতুন jQuery ব্যবহার করে। আপনার সমস্যার এখানে আলোচিত সমস্যার চেয়ে আলাদা উত্স ছিল :)
জাকুব গোকাসওয়স্কি

2
এখন ডেকরেটার নামে পরিচিত ensure_csrf_cookieযে এটি কুকি প্রেরণ করে তা নিশ্চিত করার জন্য আপনি কোনও দৃশ্যের চারপাশে মোড়ানো করতে পারেন।
ব্রায়ান নিল

আমার এই সমস্যাটি ছিল, csrftokenপ্রথমে কোনও কুকি নেই , ধন্যবাদ!
crhodes

5

এটি শিরোনামটি ব্যবহার করে খাঁটি জেএসে কীভাবে করবেন তা এখানে কেউ উল্লেখ করেনি বলে মনে হয় X-CSRFTokenএবং {{ csrf_token }}তাই এখানে একটি সহজ সমাধান রয়েছে যেখানে আপনাকে কুকিজ বা ডোমের মাধ্যমে অনুসন্ধান করার দরকার নেই:

var xhttp = new XMLHttpRequest();
xhttp.open("POST", url, true);
xhttp.setRequestHeader("X-CSRFToken", "{{ csrf_token }}");
xhttp.send();

4

যেহেতু এটি বর্তমান উত্তরের কোথাও বর্ণিত হয়নি, আপনি যদি আপনার টেমপ্লেটে জেএস এমবেড না করে থাকেন তবে দ্রুত সমাধানটি হ'ল:

রাখুন <script type="text/javascript"> window.CSRF_TOKEN = "{{ csrf_token }}"; </script>আপনার টেম্পলেটে script.js ফাইলে আপনার অবগতির আগে, তারপর যোগ csrfmiddlewaretokenআপনার মধ্যে dataআপনার JS ফাইল অভিধান:

$.ajax({
            type: 'POST',
            url: somepathname + "do_it/",
            data: {csrfmiddlewaretoken: window.CSRF_TOKEN},
            success: function() {
                console.log("Success!");
            }
        })

2

আমি কিছুটা ভিন্ন তবে একই ধরণের পরিস্থিতির মুখোমুখি হয়েছি। এটি যদি আপনার ক্ষেত্রে সমাধান হয়ে যায় তবে 100% নিশ্চিত নন, তবে আমি জাজানো 1.3 এর জন্য সঠিক কুকি মানের স্ট্রিং দিয়ে একটি পোষ্ট প্যারামিটার 'csrfmiddlewaretoken' সেট করে সমাধান করেছি যা সাধারণত জ্যাঙ্গোর দ্বারা আপনার HTML এর আকারে ফিরে আসে is '{% csrf_token%}' ট্যাগ সহ টেমপ্লেট সিস্টেম। আমি পুরানো জ্যাঙ্গোতে চেষ্টা করিনি, স্রেফ ঘটেছে এবং জাজানো ১.৩ এ সমাধান হয়েছে। আমার সমস্যাটি হ'ল আজাক্সের মাধ্যমে কোনও ফর্মের মাধ্যমে জমা দেওয়া প্রথম অনুরোধটি সফলভাবে সম্পন্ন হয়েছিল তবে ঠিক একই থেকে দ্বিতীয় প্রচেষ্টা ব্যর্থ হয়েছিল, ফলস্বরূপ 403 রাজ্যে পরিণত হয়েছে যদিও শিরোনাম 'এক্স-সিএসআরএফটোকেন' সিএসআরএফ টোকেন মানের সাথে সঠিকভাবে স্থাপন করা হয়েছে প্রথম প্রচেষ্টা ক্ষেত্রে হিসাবে। আশাকরি এটা সাহায্য করবে.

শুভেচ্ছা সহ,

হিরো


2

আপনি এই জেএসটি আপনার এইচটিএমএল ফাইলে পেস্ট করতে পারেন, মনে রাখবেন অন্যান্য জেএস ফাংশনের আগে এটি রেখে দিন

<script>
  // using jQuery
  function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie != '') {
      var cookies = document.cookie.split(';');
      for (var i = 0; i < cookies.length; i++) {
        var cookie = jQuery.trim(cookies[i]);
        // Does this cookie string begin with the name we want?
        if (cookie.substring(0, name.length + 1) == (name + '=')) {
          cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
          break;
        }
      }
    }
    return cookieValue;
  }

  function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
  }

  $(document).ready(function() {
    var csrftoken = getCookie('csrftoken');
    $.ajaxSetup({
      beforeSend: function(xhr, settings) {
        if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
          xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
      }
    });
  });
</script>


1

একটি সিএসআরএফ টোকেন প্রতিটি সেশনে বরাদ্দ করা হয় (যেমন প্রতিবার আপনি লগ ইন করেন)। সুতরাং আপনি ব্যবহারকারীর দ্বারা কিছু ডেটা প্রবেশ করানো এবং সিএসআরএফ_প্রোটেক্ট ডেকোরেটার দ্বারা সুরক্ষিত কোনও ফাংশনে এজ্যাক্স কল হিসাবে এটি প্রেরণ করার আগে, ব্যবহারকারীর কাছ থেকে এই ডেটা পাওয়ার আগে আপনাকে যে ফাংশনগুলি ডাকা হচ্ছে তা সন্ধান করার চেষ্টা করুন। উদাহরণস্বরূপ কিছু টেম্পলেট অবশ্যই রেন্ডার করা উচিত যার উপর আপনার ব্যবহারকারী ডেটা প্রবেশ করছে। এই টেমপ্লেটটি কিছু ফাংশন দ্বারা রেন্ডার করা হচ্ছে। এই ফাংশনটিতে আপনি সিএসআরএফ টোকেন নীচের হিসাবে পেতে পারেন: csrf = অনুরোধ। COOKIES ['csrftoken'] এখন এই সিএসআরএফ মানটি প্রাসঙ্গিক অভিধানে পাস করুন যা প্রশ্নে টেমপ্লেট রেন্ডার করা হচ্ছে। এখন সেই টেমপ্লেটে এই লাইনটি লিখুন: এখন আপনার জাভাস্ক্রিপ্ট ফাংশনে, এজাক্স অনুরোধ করার আগে, এটি লিখুন: var csrf = $ ('# csrf')। ভাল () এটি টেমপ্লেটে পাস হওয়া টোকেনের মান বেছে নেবে এবং এটি ভেরিয়েবল সিএসআরএফ-এ সংরক্ষণ করবে। এখন আপনার পোস্টের ডেটাতে এজাক্স কল করার সময় এই মানটিও পাস করুন: "সিএসআরফমিডলওয়ারটোকেন": সিএসআরএফ

আপনি জাঙ্গো ফর্মগুলি বাস্তবায়ন না করলেও এটি কাজ করবে।

প্রকৃতপক্ষে, এখানে যুক্তি হ'ল: আপনাকে অনুরোধ থেকে পেতে পারেন এমন টোকেন দরকার। সুতরাং আপনাকে কেবল লগ ইন করার সাথে সাথেই ফাংশনটি ডাকা হবে তা বের করা দরকার Once একবার আপনি এই টোকেনটি পেয়ে গেলে এটি পেতে অন্য একটি এজ্যাক্স কল করুন বা এটিজ্যাকের মাধ্যমে অ্যাক্সেসযোগ্য কোনও টেমপ্লেটে এটি প্রেরণ করুন।


খুব ভাল কাঠামোগত নয়, তবে ভালভাবে ব্যাখ্যা করা হয়েছে। আমার সমস্যা ছিল, আমি এই পদ্ধতিতে csrf পাঠানোর হয়েছিল: csrftoken: csrftokenবদলে csrfmiddlwaretoken: csrftoken। পরিবর্তনের পরে, এটি কাজ করে। ধন্যবাদ
প্রায় একটি শিক্ষানবিশ

1

যে কেউ এই জুড়ে আসে এবং ডিবাগ করার চেষ্টা করছেন তাদের জন্য:

1) জ্যাঙ্গো সিএসআরএফ চেক (ধরে নিচ্ছেন আপনি একজন প্রেরণ করছেন) এখানে আছেন

2) আমার ক্ষেত্রে, settings.CSRF_HEADER_NAME'HTTP_X_CSRFTOKEN' তে সেট করা হয়েছিল এবং আমার AJAX কলটি 'HTTP_X_CSRF_TOKEN' নামে একটি শিরোনাম পাঠাচ্ছিল যাতে স্টাফ কাজ করছে না। আমি হয় এজেএক্স কল, বা জ্যাঙ্গো সেটিংয়ে এটি পরিবর্তন করতে পারি।

3) আপনি যদি এটি সার্ভার-সাইড পরিবর্তন করতে চান, আপনার জাঞ্জোর ইনস্টল অবস্থানটি সন্ধান করুন এবং csrf middlewareআপনি যে ব্যবহার করছেন। যদি একটি ব্রেকপয়েন্ট নিক্ষেপ করেন তবে virtualenvএটি এমন কিছু হবে:~/.envs/my-project/lib/python2.7/site-packages/django/middleware/csrf.py

import ipdb; ipdb.set_trace() # breakpoint!!
if request_csrf_token == "":
    # Fall back to X-CSRFToken, to make things easier for AJAX,
    # and possible for PUT/DELETE.
    request_csrf_token = request.META.get(settings.CSRF_HEADER_NAME, '')

তারপরে, নিশ্চিত হয়ে নিন যে csrfটোকেনটি অনুরোধ থেকে সঠিকভাবে উত্সাহিত হয়েছে। মেটা

৪) যদি আপনার শিরোনাম ইত্যাদি পরিবর্তন করতে হয় - আপনার সেটিংস ফাইলে সেই পরিবর্তনশীলটি পরিবর্তন করুন



0

আমার ক্ষেত্রে সমস্যাটি ছিল এনজিএনএক্স কনফিগারেশনে যা আমি প্রধান সার্ভার থেকে অস্থায়ী একটিতে অনুলিপি করে https অক্ষম করেছিলাম যা প্রক্রিয়াটিতে দ্বিতীয়টির প্রয়োজন হয় না।

এটিকে আবার কাজ করতে কনফিগারেশনে এই দুটি লাইনটি মন্তব্য করতে হয়েছিল:

# uwsgi_param             UWSGI_SCHEME    https;
# uwsgi_pass_header       X_FORWARDED_PROTO;

0

জ্যাঙ্গো দ্বারা সরবরাহিত কম ভার্জোজ সমাধান এখানে:

<script type="text/javascript">
// using jQuery
var csrftoken = jQuery("[name=csrfmiddlewaretoken]").val();

function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
// set csrf header
$.ajaxSetup({
    beforeSend: function(xhr, settings) {
        if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
    }
});

// Ajax call here
$.ajax({
    url:"{% url 'members:saveAccount' %}",
    data: fd,
    processData: false,
    contentType: false,
    type: 'POST',
    success: function(data) {
        alert(data);
        }
    });
</script>

সূত্র: https://docs.djangoproject.com/en/1.11/ref/csrf/

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