الحماية في جانغو- كيفية إنشاء تطبيق أمن

كمطور ويب، من الضروري إعطاء الأولوية للتدابير الأمنية لحماية مستخدمي شركتك وبياناتها من التهديدات المحتملة.

في هذه المقالة، سأوضح أفضل ممارسات الحماية من خلال إنشاء تطبيق ويب آمن باستخدام Django، وهو إطار ويب قوي لـ Python. سأقوم بتغطية كل من تجزئة كلمة المرور، وإدارة الجلسة الآمنة، والمصادقة، والترخيص، واعتبارات الأمان الرئيسية الأخرى مع أمثلة عملية.

قبل متابعة هذه المقالة، ضع في اعتبارك أن هذا ليس مخصصًا للمبتدئين تمامًا. يجب أن يكون لديك فهم جيد للغة Python لتحقيق أقصى استفادة من هذا الدليل

إذا كنت بحاجة إلى تحسين مهاراتك البرمجية الأساسية في Python وDjango قبل المتابعة، فإليك بعض الموارد لمساعدتك:

قم بإعداد بنية الملف الخاص بك

لنفترض أننا نريد تخزين مشروعنا على سطح المكتب. أول شيء يجب فعله هو إعداد بنية الملف لدينا. لنبدأ بإنشاء دليل جذر لمشروعنا على سطح المكتب (WebSec في هذه الحالة).

mkdir WebSec
cd WebSec

إنشاء بيئة افتراضية وتفعيلها

على لينكس (أوبنتو):

python3 -m venv my_env

Source my_env/bin/activate

وعلى ويندوز:

python -m venv my_env

my_env\Scripts\activate.bat

كيفية إنشاء مشروع جانغو

أولاً، إذا لم يكن لديك بالفعل، فستحتاج إلى تثبيت Django باستخدام الأمر التالي:

python -m pip install Django

ثم يمكنك استخدام هذا الأمر لإنشاء المشروع:

django-admin startproject web_sec_project .

عند إنشاء مشروع جانغو. لا تنس النقطة عند نهاية الأمر لتجنب تكرار المجلد.

وأخيرًا، استخدم هذا الأمر لإنشاء التطبيق:

django-admin startapp web_sec_app

في النهاية يجب أن تبدو بنية ملفك كما يلي:

WebSec
    my_env/
    web_sec_app/
        __pycache__/
        migrations/
        templates/
        admin.py
        apps.py
        forms.py
        models.py
        tests.py
        urls.py
        views.py
    web_sec_project/
        __pycache__/
        __init__.py
        asgi.py
        settings.py
        urls.py
        wsgi.py
    db.sqlite3
    manage.py

تشغيل الخادم

على الطرفية قم بتشغيل الأمر التالي واختبر ما إذا كان مشروعك يعمل. إذا كان الأمر كذلك، فأنت على ما يرام.

python manage.py runserver

تأكد من إضافة تطبيقك إلى قائمة التطبيقات في ملف الإعدادات:

تجزئة كلمة المرور

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

تجزئة التشفير، والمعروفة أيضًا بوظائف التجزئة أو خوارزميات التجزئة، هي مفهوم أساسي في التشفير وأمن الكمبيوتر. وهو يتضمن أخذ إدخال (أو “رسالة”) وتحويله إلى سلسلة ثابتة الحجم من الأحرف، والتي تكون عادةً عبارة عن سلسلة من الأرقام والحروف. يسمى هذا الإخراج “قيمة التجزئة” أو “رمز التجزئة”.

يوفر Django آلية تجزئة آمنة لكلمة المرور بشكل افتراضي، باستخدام خوارزمية PBKDF2 مع تجزئة SHA-256.

يستخدم Django آلية تجزئة كلمة مرور قوية وآمنة لحماية كلمات مرور المستخدم. تساعد هذه الآلية على ضمان أنه حتى لو تم اختراق قاعدة البيانات، فلن يتمكن المهاجمون من استرداد كلمات مرور النص العادي للمستخدمين بسهولة. تتكون آلية تجزئة كلمة المرور الخاصة بـ Django من PBKDF2.

PBKDF2 هي دالة اشتقاق مفتاح تشفير بسيطة مقاومة لهجمات القاموس وهجمات جدول قوس قزح. يعتمد على اشتقاق HMAC بشكل متكرر عدة مرات مع بعض الحشو. وهذا يضمن أنه حتى لو تم اختراق قاعدة البيانات، تظل كلمات المرور غير قابلة للقراءة.

لتوضيح ذلك، سنقوم بإنشاء مستخدم جديد بكلمة مرور مجزأة وحفظ المستخدم بكلمة المرور المجزأة في قاعدة البيانات.

أولاً، نقوم باستيراد  User من نموذج المستخدم. ثم نقوم باستيراد make_password. ثم نقوم بإنشاء دالة تنشئ مستخدمًا جديدًا بكلمة مرور مجزأة وتحفظ المستخدم بكلمة المرور المجزأة في قاعدة البيانات.:

#web_sec_app/views.py

from django.contrib.auth.hashers import make_password
from django.contrib.auth.models import User

# Create User views here.
def UserView(request):
    users = User.objects.all()
    password = 'password'
    hashed_password = make_password(password)
    return render(request, 'create_user.html', 
                {'users': users, 'hashed_password': hashed_password})

إدارة الجلسة الآمنة

تعد إدارة الجلسة أمرًا أساسيًا للحفاظ على حالة المستخدم عبر الطلبات المتعددة. يأتي Django مزودًا بنظام إدارة جلسة مدمج يقوم بتخزين بيانات الجلسة على جانب الخادم. سوف نتأكد من تشفير بيانات الجلسة وأن معرف الجلسة آمن لمنع هجمات اختطاف الجلسة.

لتحقيق إدارة آمنة للجلسة، سوف نتأكد من أن لدينا ملف تعريف ارتباط آمن للجلسة، والذي سيتطلب HTTPS. سنقوم أيضًا بمنع وصول JavaScript إلى ملف تعريف ارتباط الجلسة. تنتهي الجلسة عند إغلاق المتصفح.

SESSION_COOKIE_SECURE = True

يخبر هذا الإعداد Django بإرسال ملف تعريف الارتباط للجلسة فقط عبر اتصالات HTTPS. عند التعيين على True، و طبعا لن يتم إرسال ملف تعريف ارتباط الجلسة عبر اتصالات HTTP غير المشفرة. يعد هذا أمرًا مهمًا لحماية بيانات الجلسة الحساسة، مثل الرموز المميزة لمصادقة المستخدم، من اعتراض الجهات الفاعلة الضارة على الشبكات غير الآمنة.

SESSION_COOKIE_HTTPONLY = True 

يؤدي ضبط SESSION_COOKIE_HTTPONLY على True إلى إضافة طبقة إضافية من الأمان. حيث لا يمكن الوصول إلى ملف تعريف الارتباط للجلسة عن طريق كود JavaScript الذي يعمل على متصفح العميل. ويساعد هذا في التخفيف من أنواع معينة من هجمات البرمجة النصية عبر المواقع (XSS)، حيث يحاول المهاجم سرقة بيانات الجلسة باستخدام نصوص برمجية ضارة.

SESSION_EXPIRE_AT_BROWSER_CLOSE = True

عند تعيين SESSION_EXPIRE_AT_BROWSER_CLOSE على True، ستنتهي صلاحية الجلسة وسيتم حذفها بمجرد قيام المستخدم بإغلاق متصفح الويب الخاص به. يوفر هذا آلية لإنشاء جلسات قصيرة الأجل تنتهي تلقائيًا عندما ينتهي المستخدم من جلسة التصفح. و يعد هذا مفيدًا للسيناريوهات التي تريد فيها التأكد من تسجيل خروج المستخدمين عند إغلاق المتصفح، مما يعزز الأمان لأجهزة الكمبيوتر المشتركة أو العامة.

طبعا جميع الاكواد السابقة تكون على ملف settings.py.

المصادقة والترخيص

تعتبر إجراءات المصادقة والترخيص المناسبة مهمة لتقييد الوصول إلى أجزاء معينة من تطبيق الويب.

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

@user_passes_test(lambda u: u.is_superuser)
def admin(request):
    return render(request, 'admin.html', {'username': request.user.username})

يتم استخدام الكود أعلاه لتقييد الوصول إلى عرض المسؤول بناءً على ما إذا كان المستخدم مستخدمًا متميزًا (مسؤولًا) أم لا.

إذا كان المستخدم مميز، يُسمح له بالوصول إلى العرض، ويتم عرض القالب admin.html مع عرض اسم المستخدم الخاص به. أما في حالة إذا لم يكن المستخدم مميز، فستتم إعادة توجيهه إلى عرض افتراضي غير مصرح به، ما لم يتم تنفيذ معالجة إضافية.

وهذا يضمن أن المستخدمين المصرح لهم فقط الذين يتمتعون بامتيازات المسؤول يمكنهم الوصول إلى صفحة “admin.html”.

حماية من البرمجة النصية عبر المواقع (XSS)

تعد البرمجة النصية عبر المواقع (XSS) ثغرة أمنية شائعة تسمح للمتسللين بإدخال نصوص برمجية ضارة في صفحات الويب التي يشاهدها المستخدمون الآخرون.

في هذا القسم، سنستكشف كيفية تنفيذ رؤوس سياسة أمان المحتوى (CSP) لمنع تنفيذ البرنامج النصي غير المصرح به وحماية تطبيقنا من هجمات XSS.

تعمل رؤوس CSP عن طريق إنشاء مجموعة من القواعد التي تحدد مصادر المحتوى المسموح بها وتلك المحظورة. يؤدي هذا إلى تقليل مساحة الهجوم على ثغرات XSS بشكل كبير، مما يجعل من الصعب على المهاجمين تنفيذ نصوص برمجية غير مصرح بها على التطبيق الخاص بك.

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

CSP_DEFAULT_SRC = ("'self'",)

الحماية من التزوير عبر المواقع (CSRF)

تحدث هجمات CSRF عندما تخدع مواقع الويب الضارة المستخدمين لاتخاذ إجراءات غير مصرح بها على المواقع الأخرى التي تمت مصادقتهم عليها. يوفر Django حماية مدمجة ضد هجمات CSRF باستخدام رموز CSRF.

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

سأوضح لك كيفية دمج هذه الرموز المميزة في النماذج لمنع الطلبات غير المصرح بها.

<h4>Create Account</h4>
<form action="{% url 'create_user' %}" method="post">
   {% csrf_token %}
   <input 
      type="text" 
      id="userName" 
      name="username"
      class="form-control input-sm chat-input" 
      placeholder="username" 
    />
</form>

منع حقن SQL

يعد حقن SQL ثغرة أمنية خطيرة تحدث عندما يتلاعب المهاجمون بإدخالات المستخدم لتنفيذ استعلامات SQL ضارة في قاعدة البيانات. سأوضح كيف يقوم ORM (تعيين الكائنات العلائقية) الخاص بـ Django بتعقيم مدخلات المستخدم تلقائيًا والحماية من هجمات حقن SQL.

من المهم ملاحظة أنه على الرغم من أن ORM الخاص بـ Django يوفر دفاعًا قويًا ضد غالبية هجمات حقن SQL، إلا أنه يجب على المطورين الالتزام بأفضل ممارسات الأمان، مثل التحقق من صحة الإدخال والتحقق من الترخيص، لضمان الأمان العام لتطبيقات الويب الخاصة بهم.

من المفيد أيضًا تحديث Django للاستفادة من أي تحديثات أمنية أو تحسينات أخرى قد يتم إصدارها في المستقبل.

def search(request):
    query = request.GET.get('q')
    if query is not None:
        results = Search.objects.filter(Q(name__icontains=query) | Q(description__icontains=query))
    else:
        results = []
    return render(request, 'search.html', {'results': results})

يحدد الكود السابق دالة عرض Django التي تتعامل مع دالة البحث عن طريق استخراج استعلام من معلمات GET الخاصة بالطلب، واستخدام هذا الاستعلام لإجراء بحث في نموذج البحث باستخدام تابع تصفية ORM، ثم عرض قالب مع نتائج البحث.

يتم إجراء البحث بناءً على حقلي “الاسم” و”الوصف” الخاصين بالنموذج، وتكون النتائج عبارة عن مطابقات جزئية غير حساسة لحالة الأحرف.

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

تتوافق بنية هذا الكود وأنماط استخدامه مع أفضل الممارسات لكتابة استعلامات آمنة في Django، مما يجعلها أقل عرضة لهجمات حقن SQL. ولكن لا يزال من المهم التأكد من أن بقية قاعدة التعليمات البرمجية الخاصة بك تتبع أفضل ممارسات الأمان وأنك تحافظ على تحديث إصدار Django للاستفادة من أحدث تصحيحات الأمان.

أمان تحميل الملفات

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

def upload_file(request):
    if request.method == 'POST':
        uploaded_file = request.FILES.get('file')
        if uploaded_file:
            if uploaded_file.content_type in ALLOWED_FILE_EXTENSIONS:
                try:
                    with open('uploads/' + uploaded_file.name, 'wb+') as destination:
                        for chunk in uploaded_file.chunks():
                            destination.write(chunk)
                    return render(request, 'success.html')
                except ValidationError as e:
                    error_message = str(e)
                    return render(request, 'fileUpload.html', {'error_message': error_message})
            else:
                error_message = "Invalid file type."
                return render(request, 'fileUpload.html', {'error_message': error_message})
        else:
            error_message = "No file selected."
            return render(request, 'fileUpload.html', {'error_message': error_message})
    else:
        return render(request, 'fileUpload.html')

في الكود السابق قمنا بإنشاء دالة تسمى upload_file. تأخذ هذه الدالة كائن الطلب كوسيطة لها وتتعامل مع تحميلات الملفات.

تتحقق الدالة أولاً مما إذا كان الطلب عبارة عن POST. إذا كان الأمر كذلك، فستحصل الدالة على الملف الذي تم تحميله بواسطة المستخدم باستخدام request.FILES.get('file').

إذا لم يكن الملف فارغًا، فستتحقق الدالة مما إذا كان امتداد الملف موجودًا في قائمة ALLOWED_FILE_EXTENSIONS. تحتوي هذه القائمة على أنواع الملفات المسموح بتحميلها. إذا لم يكن امتداد الملف موجودًا في القائمة، فستعرض الدالة رسالة خطأ.

إذا كان امتداد الملف موجودًا في القائمة، فستحاول الدالة حفظ الملف في دليل يسمى التحميلات. تستخدم الدالة عبارة with open() لفتح الملف في وضع الكتابة الثنائية. يتم بعد ذلك حفظ الملف على شكل أجزاء باستخدام حلقة forchunks في file.chunks()‎.

إذا تم حفظ الملف بنجاح، تقوم الدالة بإعادة توجيه المستخدم إلى صفحة النجاح. وإلا، ستظهر رسالة بوجود خطأ.

تعد قائمة ALLOWED_FILE_EXTENSIONS بمثابة إجراء أمني يمنع المستخدمين من تحميل الملفات الضارة، مثل الملفات التنفيذية أو البرامج النصية. الحد الأقصى لحجم الملف هو إجراء أمني آخر يمنع المستخدمين من تحميل الملفات الكبيرة التي قد تتسبب في هجوم رفض الخدمة. يؤدي تخزين الملف الذي تم تحميله في دليل منفصل إلى عزل الملف عن بقية التطبيق ويجعل من الصعب على المهاجمين الوصول إليه.

يعد إنشاء تطبيق ويب آمن عملية مستمرة تتطلب اليقظة وتنفيذ أفضل الممارسات. في هذه المقالة، قمت بتوضيح إجراءات أمان الويب المختلفة باستخدام أمثلة عملية أثناء إنشاء تطبيق ويب باستخدام Django.

من خلال تنفيذ تجزئة كلمة المرور وإدارة الجلسة الآمنة والمصادقة والترخيص والحماية من ثغرات الويب الشائعة مثل XSS وCSRF، اتخذت خطوات مهمة نحو إنشاء تطبيق ويب قوي وآمن.

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

و من خلال اتخاذ الإجراءات الأمنية الصحيحة، يمكنك بكل ثقة تزويد المستخدمين بتجربة ويب آمنة ومأمونة.


اكتشاف المزيد من بايثون العربي

اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

Scroll to Top

اكتشاف المزيد من بايثون العربي

اشترك الآن للاستمرار في القراءة والحصول على حق الوصول إلى الأرشيف الكامل.

Continue reading