قم بحماية موقع الويب الخاص بك من ثغرة أمنية شائعة جدًا باستخدام معالجة CSRF المضمنة في Django.
Django هو إطار عمل ويب Python يمكنك استخدامه لبناء تطبيقات ويب آمنة. يقدم العديد من الميزات لمساعدة المطورين بالأمان. إحدى هذه الميزات هي رموز CSRF ، وهي ضرورية لحماية النماذج من هجمات التزوير عبر الموقع.
ما هو رمز CSRF؟
رمز CSRF هو ميزة أمان تحمي تطبيقات الويب من هجمات التزوير عبر الموقع (CSRF). يسمح لخادم التطبيق بالتحقق مما إذا كان إرسال النموذج جاء من مستعرض أصلي أو قام أحد المتطفلين بتزويره.
رموز CSRF هي مدخلات نموذجية تتعقب جلسة المستخدم. موقع على شبكة الإنترنت إطار تطبيق الويب من جانب الخادم عادةً ما يُنشئ رموز CSRF المميزة لكل جلسة مستخدم فريدة. يتحقق الخادم من صحة الرمز المميز عندما يرسل المستخدم نموذجًا. تتكون رموز CSRF بشكل عام من سلاسل وأرقام عشوائية ، مما يجعل قيمها غير متوقعة.
إنشاء رمز CSRF في Django
دجانغو الحصول على رمز() تعمل الدالة بشكل عشوائي على إنشاء رموز CSRF المميزة. للعثور على هذه الوظيفة ، انتقل إلى ملف csrf.py ملف داخل ملف بيئة بايثون الافتراضية. يجب أن تبدو بنية المجلد كما يلي:
إنف /
└── ليب /
└── حزم الموقع /
└── دجانجو /
└── برمجيات وسيطة /
└── csrf.py
داخل هذا الملف ، ستجد ملف الحصول على رمز() دالة ، والتي تُرجع الرمز المميز. يستخدم Django اخفاء البيانات لحماية قيمة الرمز المميز من المتسللين.
بشكل افتراضي ، يمكّن Django حماية CSRF لموقعك عن طريق إضافة ملفات django.middleware.csrf. CsrfViewMiddleware في ال MIDDLEWARE قائمة بك settings.py ملف. كل ما عليك القيام به هو إضافة {٪ csrf_token٪} لك بريد نماذج. بدون إضافة {٪ csrf_token٪} ، سوف تحصل على 403 ممنوع) خطأ عند إرسال نموذج.
عندما تضيف {٪ csrf_token٪} إلى النموذج الخاص بك ، يقوم تلقائيًا بإنشاء حقل إدخال مخفي بالاسم csrfmiddlewaretoken، والذي يحتوي على قيمة رمز CSRF المقنع. يستخدم الخادم هذه القيمة لتحديد ما إذا كان إرسال النموذج موثوقًا أم لا. يمكنك التحقق من قيمة هذا الحقل المخفي من خلال عرض مصدر الصفحة أو استخدام ميزة أدوات المطور في متصفحك.
كيف تعمل رموز CSRF في Django
عندما تقوم بتشغيل موقعك باستخدام النموذج ، يقوم Django تلقائيًا بإنشاء ملف ملف تعريف ارتباط المتصفح مُسَمًّى csrftoken. يتتبع ملف تعريف الارتباط هذا نشاط المستخدم على الموقع ويحدد كل مستخدم بشكل فريد.
عندما يرسل المستخدم النموذج ، يقارن الخادم قيمة ملف تعريف الارتباط بقيمة ملف csrfmiddlewaretoken في حقل الإدخال المخفي. إذا تطابقت هذه القيم ، فسيقوم الخادم بمعالجة النموذج بنجاح ، وإلا فسوف ينتج عنه خطأ.
للوهلة الأولى ، قيم ملف تعريف الارتباط و csrfmiddlewaretoken تبدو مختلفة. هذا مقصود ويضيف طبقة حماية إضافية إلى رمز CSRF. تتم مقارنة رمز CSRF المميز بملف تعريف الارتباط مثل هذا:
- ال الحصول على رمز() تقوم الوظيفة بإخفاء رمز CSRF المميز قبل تمريره إلى حقل الإدخال.
- عند إرسال النموذج ، يتم الكشف عن رمز CSRF بمساعدة المفتاح السري في ملف الإعدادات.
- تتم مقارنة الرمز المميز غير المقنع بملف تعريف ارتباط الجلسة.
- إذا كانت القيم هي نفسها ، تتم معالجة النموذج. إذا لم يكن الأمر كذلك ، فسيقوم الخادم بإرجاع خطأ.
لمنع المتسللين من سرقة رمز CSRF الخاص بك ، يقوم Django بتجديده في كل مرة يبدأ فيها جلسة مستخدم.
إنشاء رموز CSRF مخصصة
على الرغم من أن Django يجعل من السهل حماية النماذج الخاصة بك عن طريق إضافة الامتداد {٪ csrf_token٪}، من الممكن أيضًا إنشاء رموز CSRF وإضافتها يدويًا إلى النماذج الخاصة بك. للقيام بذلك ، قم باستيراد ملف الحصول على رمز() وظيفة:
من django.middleware.csrf يستورد الحصول على رمز
من وجهة نظرك ، يمكنك إنشاء رمز CSRF مميز مثل هذا:
defview_name(طلب):
csrf_token = get_token (طلب)# تنفيذ منطق العرض
السياق = {
"csrf_token": csrf_token
}
يعود تقديم (طلب ، "app_name / template.html"، السياق = السياق)
في نموذج HTML الخاص بك ، يمكنك تضمين علامة الإدخال يدويًا وإضافة ملف csrf_token لها مثل هذا:
<استمارةطريقة="بريد" >
<مدخليكتب="مختفي"اسم="csrfmiddlewaretoken"قيمة="{{csrf_token}}">
{{form.as_p}}
<زريكتب="يُقدِّم"فصل="btn- مخطط تفصيلي-ثانوي">أضف كتابزر>
استمارة>
بدلاً من ذلك ، يمكنك إنشاء حقل الإدخال المخفي من طرق العرض الخاصة بك مثل هذا:
defوجهة نظركم(طلب):
csrf_token = get_token (طلب)
csrf_token_html = ''.format (csrf_token)# تنفيذ منطق العرض
السياق = {
"csrf_token": csrf_token_html
}
يعود تقديم (طلب ، "app_name / template.html"، السياق = السياق)
يمكنك بعد ذلك إضافته إلى قالب HTML الخاص بك مثل هذا:
<استمارةطريقة="بريد" >
{{csrf_token_html | آمن}}
{{form.as_p}}
<زريكتب="يُقدِّم"فصل="btn- مخطط تفصيلي-ثانوي">أضف كتابزر>
استمارة>
إذا كنت ترغب في التحكم بشكل كامل في حماية CSRF للنموذج الخاص بك ، فيمكنك القيام بذلك عن طريق مقارنة رمز CSRF المميز الخاص بك بملف تعريف الارتباط المخزن في المتصفح. بناءً على نتائج المقارنة ، يمكنك التعامل مع إرسال النموذج كما تريد. هذا مثال:
من django.shortcuts يستورد يجعل
من django.middleware.csrf يستورد get_token ، _unmask_cipher_token
من django.utils.crypto يستورد الوقت_الثابتdefوجهة نظركم(طلب):
# إنشاء رمز CSRF مخصص
csrf_token = get_token (طلب)
csrf_cookie = طلب. COOKIES.get ("csrftoken")# unmask csrf token
unmasked_csrf_token = _unmask_cipher_token (csrf_token)
# قارن الرموز المميزة
لولا Constant_time_compare (unmasked_csrf_token، csrf_cookie):
# تعامل مع الحالة التي لا تتطابق فيها الرموز المميزة
يمر
آخر:
# تعامل مع الحالة التي تتطابق فيها الرموز المميزة
يمر
# تقديم القالب
السياق = {
"csrf_token": csrf_token،
}
يعود تقديم (طلب ، "app_name / template.html"، السياق = السياق)
يسترد مقتطف الشفرة هذا ملف csrf_cookie من كائن طلب HTTP. ثم يستخدم ملف _unmask_cipher_token () وظيفة لكشف قناع csrf_token.
العبارة الشرطية تقارن قيم المسترد csrf_cookie والمكشوفين csrf_token. تستخدم هذه المقارنة الوقت_الثابت وظيفة للحماية من استغلال التوقيت. يمكنك كتابة منطقك بناءً على نتيجة المقارنة.
تعطيل حماية CSRF في Django
على الرغم من أن Django يوفر شرطًا افتراضيًا لحماية CSRF ، يمكنك تعطيله في مشروعك إذا كنت تريد ذلك. هناك طريقتان للقيام بذلك:
- تعطيل حماية CSRF على موقع الويب الخاص بك بالكامل.
- تعطيل حماية CSRF في طريقة عرض معينة.
تعطيل حماية CSRF على موقع الويب الخاص بك بالكامل
لتعطيل حماية CSRF من Django على موقع الويب الخاص بك ، عليك ببساطة إزالة البرنامج الوسيط CSRF من ملف الإعدادات الخاص بك. في ملف الإعدادات ، حدد موقع قائمة تسمى MIDDLEWARE. داخل القائمة ، ابحث عن هذا:
'django.middleware.csrf. CsrfViewMiddleware ',
بمجرد العثور عليه ، يجب عليك إزالته من التعليمات البرمجية الخاصة بك لحماية CSRF الافتراضية من Django لتعطيله.
تعطيل حماية CSRF في عرض محدد
إذا كنت ترغب فقط في تعطيل حماية CSRF في عرض Django معين ، فاستخدم امتداد تضمين التغريدة مصمم. إليك مقتطف الشفرة للتوضيح:
من django.views.decorators.csrf يستورد csrf_exempt
تضمين التغريدة
defview_name(طلب):
# تنفيذ منطق العرض
يمر
ال تضمين التغريدة مصمم الديكور هو مجرد واحد من عدة أمور تتعلق بحماية CSRF في Django. يمكنك أن تقرأ عن الباقي في مرجع CSRF لـ Django.
لا تقم بتعطيل حماية CSRF على موقع الويب الخاص بك
على الرغم من أن Django يجعل ذلك ممكنًا ، إلا أنه لا يوصى بتعطيل آلية حماية CSRF المدمجة في Django. سيؤدي القيام بذلك إلى جعل موقعك عرضة لهجمات CSRF وسيؤثر في النهاية على مستخدمي تطبيقك بشكل سلبي.
ما لم تكن مطورًا متمرسًا يعرف كيفية تنفيذ آلية حماية CSRF مخصصة ، يجب أن تعمل مع البديل الذي يوفره Django.