سؤال

يأتي جانغو مع البرمجيات الوسيطة لحماية CSRF, ، الذي ينشئ رمزًا مميزًا فريدًا لكل جلسة لاستخدامه في النماذج.يقوم بمسح كافة الواردة POST يطلب الرمز المميز الصحيح، ويرفض الطلب إذا كان الرمز المميز مفقودًا أو غير صالح.

أرغب في استخدام AJAX لبعض طلبات POST، لكن الطلبات المذكورة لا تحتوي على رمز CSRF المميز المتوفر.الصفحات ليس لها <form> العناصر التي يجب ربطها وأنا أفضل عدم تعكير صفو العلامات التي تقوم بإدخال الرمز المميز كقيمة مخفية.أعتقد أن الطريقة الجيدة للقيام بذلك هي الكشف عن شيء مثل /get-csrf-token/ لإعادة الرمز المميز للمستخدم، بالاعتماد على قواعد البرمجة النصية عبر المواقع في المتصفح لمنع المواقع المعادية من طلب ذلك.

هل هذه فكرة جيدة؟هل هناك طرق أفضل للحماية من هجمات CSRF مع الاستمرار في السماح بطلبات AJAX؟

هل كانت مفيدة؟

المحلول

إذا كنت تعلم أنك ستحتاج إلى رمز CSRF المميز لطلبات AJAX، فيمكنك دائمًا تضمينه في HTML في مكان ما؛ثم يمكنك العثور عليه من خلال Javascript عن طريق اجتياز DOM.بهذه الطريقة، سيظل بإمكانك الوصول إلى الرمز المميز، لكنك لن تعرضه عبر واجهة برمجة التطبيقات.

بعبارة أخرى:افعل ذلك من خلال قوالب Django - وليس من خلال مرسل URL.إنها أكثر أمانًا بهذه الطريقة.

نصائح أخرى

تحديث:ما يلي صحيح، ويجب أن يكون صحيحًا إذا تم تنفيذ جميع المتصفحات والمكونات الإضافية بشكل صحيح.لسوء الحظ، نحن نعلم الآن أنها ليست كذلك، وأن مجموعات معينة من المكونات الإضافية للمتصفح وعمليات إعادة التوجيه يمكن أن تسمح للمهاجم بتوفير رؤوس عشوائية عند طلب عبر النطاق.لسوء الحظ، هذا يعني أنه حتى طلبات AJAX تتضمن "X-Requested-With:يجب الآن أن يكون رأس "XMLHttpRequest" محميًا بواسطة CSRF.ونتيجة لذلك، جانغو لم يعد يعفي طلبات Ajax من حماية CSRF.

الإجابة الأصلية

ومن الجدير بالذكر أن حماية طلبات AJAX من CSRF ليست ضرورية، لأن المتصفحات لا تسمح بطلبات AJAX عبر المواقع.في الواقع، أصبحت البرامج الوسيطة لـ Django CSRF الآن يعفي طلبات AJAX تلقائيًا من فحص الرمز المميز لـ CSRF.

يكون هذا صالحًا فقط إذا كنت تقوم فعليًا بالتحقق من جانب خادم رأس X-Requested-With لقيمة "XMLHttpRequest" (وهو ما يفعله Django)، واستثناء طلبات AJAX الحقيقية فقط من فحص CSRF.

إلغاء ذلك، لقد كنت مخطئا.(انظر التعليقات.) يمكنك منع الاستغلال عن طريق التأكد من أن JSON الخاص بك يتبع المواصفات:تأكد دائمًا من إرجاع كائن حرفي ككائن المستوى الأعلى.(لا أستطيع أن أضمن أنه لن يكون هناك المزيد من عمليات الاستغلال.تخيل أن المتصفح يوفر إمكانية الوصول إلى التعليمات البرمجية الفاشلة في أحداث window.onerror الخاصة به!)

لا يمكنك الاعتماد على قواعد البرمجة النصية عبر المواقع للحفاظ على خصوصية استجابات AJAX.على سبيل المثال، إذا قمت بإرجاع رمز CSRF المميز بتنسيق JSON، فقد يقوم موقع ضار بذلك إعادة تعريف منشئ السلسلة أو المصفوفة واطلب المورد.

بيجماتيه صحيح:تحتاج إلى تضمين الرمز المميز في مكان ما في العلامات.وبدلاً من ذلك، يمكنك رفض أي منشورات تتضمن ذلك يفعل يكون المرجع ذلك لا مباراة.بهذه الطريقة، سيكون الأشخاص الذين لديهم جدران حماية برمجية مفرطة الحماس فقط هم الذين سيكونون عرضة لـ CSRF.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top