اذهب إلى المحتوى

السؤال

نشر

أحاول أن أقوم بإرسال طلب من نوع post من خلال Ajax في jQuery، لكن كل الطلبات تعيد نفس الخطأ وهو:

[18/Sep/2021 21:58:29] "POST /comments/ HTTP/1.1" 403 2332

أنا متأكد من أنني هناك شيئًا ما مفقود، لكنني لا أعرف ما هو، لأنني متأكد من أن الطلبات التي أرسلها إلى الخادم صحيحة.

كيف أحل هذا الخطأ؟

Recommended Posts

  • 1
نشر

يحدث هذا الأمر لأنك لا ترسل رمز CSRF Token مع الطلب، وبالتالي لا يتعرف جانغو Django على مُرسل الطلب، وهذا الأمر لحماية الموقع من بعض الهجمات الإحتيالية التي قد تؤدي إلى إرسال طلبات عشوائية من مواقع مختلفة على أساس أنها مستخدمين، أو حتى سرقة بيانات المستخدمين وكلمات المرور والبطاقات البنكية .. إلخ.

ولحل المشكلة كل ما عليك فعله هو إرسال رمز CSRF من خلال الخاصية csrfmiddlewaretoken في بيانات الطلب data، على النحو التالي:

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

إن لم يكن كود JavaScript يتم توليد في ملف عرض view (أي إن كنت تستخدم CDN أو حتى تخزن ملفات JS منفصلة)، فيمكنك أن تقوم بإضافة رمز CSRF إلى الصفحة في شكل حقل مخفي أو حتى كود JavaScript منفصل، ومن خلال JavaScript يتم إحضار هذا الرمز وإدراجه في الطلب، كالتالي:

<!-- حقل إدخال مخفي -->
<input type='hidden' name='csrfmiddlewaretoken' value='{{ csrf_token }}' />

<!-- أو من خلال كود جافاسكريبت منفصل -->
<script type="text/javascript">
  window.CSRF_TOKEN = "{{ csrf_token }}";
</script> 

بعد ذلك من خلال جافاسكريبت تستطيع إحضار هذه القيمة وإستخدامها في الطلب.

  • 0
نشر (معدل)

تجدر الإشارة أيضاً إلى أنه لم تكن هناك أخطاء في طلبات AJAX POST في Django 1.2.4 وماقبلها (لم تكن AJAX محمية بأي شكل من الأشكال، لكنها كانت تعمل بشكل جيد).
لحل المشكلة استخدام معالج ajaxSetup بدلاً من معالج ajaxSend:

$.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]);
                     // هل تبدأ سلسلة ملفات تعريف الارتباط هذه بالاسم الذي نريده؟
                     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))) {
             //ذات الصلة، أي محليًا URL فقط إلى عناوين Token أرسل ال 
             xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
         }
     } 
});

قم باستخدام هذا الكود كما هو وستكون قادر على النشر بدون خطأ 403.

تم التعديل في بواسطة Ali Haidar Ahmad

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...