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

تُعَد حماية بيانات المستخدم جزءًا أساسيًا من تصميم أيّ موقع ويب، لذا يقدّم هذا المقال شرحًا عمليًا لكيفية تعامل أدوات الحماية المبنية مسبقًا في جانغو Django مع الهجمات التي تعرّفنا على بعضٍ منها سابقًا في مقال تعرف على أمان مواقع الويب.

  • المتطلبات الأساسية: قراءة مقال تعرف على أمان مواقع الويب الخاص بالبرمجة من طرف الخادم، والاطلاع على سلسلة مقالات تعلم جانغو حتى مقال العمل مع الاستمارات Forms على الأقل.
  • الهدف: فهم الأشياء الرئيسية التي يجب تطبيقها، أو عدم تطبيقها لتأمين تطبيق ويب جانغو.

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

ملاحظة: الدرس الوحيد الأكثر أهمية الذي يمكنك تعلّمه حول أمان مواقع الويب هو عدم الوثوق أبدًا في البيانات الواردة من المتصفح، ويتضمن ذلك بيانات طلب GET في معاملات عنوان URL وبيانات POST وترويسات HTTP وملفات تعريف الارتباط والملفات التي يرفعها المستخدم وغير ذلك، لذا تحقق دائمًا من جميع البيانات الواردة وطهّرها، وافترض الأسوأ دائمًا.

يتعامل جانغو مع العديد من الهجمات الأكثر شيوعًا، ويمكنك الاطلاع على الأمان في توثيق جانغو لمعرفة ميزات أمان جانغو وكيفية تأمين موقع ويب يدعمه.

تتألف هذه السلسلة الفرعية من السلسلة الأشمل تعلم تطوير الويب من المقالات التالية:

الهجمات الشائعة وحماية موقعك منها

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

هجمات السكربتات العابرة للمواقع XSS

يُستخدَم مصطلح هجمات السكربتات العابرة للمواقع Cross Site Scripting -أو اختصارًا XSS- لوصف فئة من الهجمات التي تسمح للمهاجمين بحقن سكربتات من طرف العميل عبر موقع الويب في متصفحات المستخدمين الآخرين، ويمكن تحقيقه من خلال تخزين سكربتات ضارة في قاعدة البيانات حيث يمكن استرجاعها وإظهارها للمستخدمين الآخرين، أو من خلال جعل المستخدمين ينقرون على رابط يؤدي إلى أن ينفِّذ متصفحُ المستخدم شيفرة جافا سكريبت الخاصة بالمهاجم.

يحميك نظام قوالب جانغو من أغلب هجمات XSS من خلال محارف هروب معينة Escaping specific characters، والتي تُعَد خطيرة في لغة HTML. يمكننا إثبات ذلك من خلال محاولة إدخال شيفرة جافا سكريبت في موقع المكتبة المحلية LocalLibrary باستخدام استمارة إنشاء مؤلف Create-author التي أنشأناها في مقال العمل مع الاستمارات Forms باتباع الخطوات التالية:

  1. شغّل موقع الويب باستخدام خادم التطوير python3 manage.py runserver.
  2. افتح الموقع في متصفحك المحلي وسجّل الدخول إلى حساب مستخدمك المميز.
  3. انتقل إلى صفحة إنشاء المؤلف، والتي يجب أن تكون على عنوان URL الذي هو: http://127.0.0.1:8000/catalog/author/create/‎.
  4. أدخِل الأسماء وتفاصيل التاريخ لمستخدم جديد، ثم ألحِق نصًا بحقل اسم العائلة Last Name هو: ‎<script>alert('Test alert');</script>‎.

01_author_create_form_alert_xss.png

ملاحظة: يُعَد النص الذي أدخلناه سكربتًا غير ضار، إذ سيعرض مربع تنبيه في متصفحك إذا جرى تنفيذه. إذا عُرِض التنبيه عند إرسال السجل، فسيكون الموقع عُرضة لهجمات XSS.

  1. اضغط على زر إرسال Submit لحفظ السجل.
  2. سيظهر ما يلي عند حفظ المؤلف، إذ يجب عدم تنفيذ التابع alert()‎ بسبب الحماية من هجمات XSS، لذا يُعرَض السكربت بوصفه نصًا عاديًا.

02_author_detail_alert_xss.png

إذا عرضتَ الشيفرة المصدرية لصفحة HTML، فيمكنك أن ترى أن المحارف الخطيرة لوسوم السكربت مُحوَّلة إلى ما يكافؤها من رموز الهروب غير الضارة، إذ تحوّل < إلى ‎&gt;‎ مثلًا.

<h1>
  Author: Boon&lt;script&gt;alert(&#39;Test alert&#39;);&lt;/script&gt;, David
  (Boonie)
</h1>

يحميك استخدام قوالب جانغو من أغلب هجمات XSS، ولكن يمكن أن توقِف تشغيل هذه الحماية، مع عدم تطبيقها تلقائيًا على جميع الوسوم التي لا تُملَأ من إدخال المستخدم عادةً، فمثلًا لا يوفّر المستخدم نص التعليمات help_text في حقل الاستمارة، لذلك لا يهرّب جانغو هذه القيم.

يمكن أيضًا أن تنشأ هجمات XSS من مصدر بيانات آخر غير موثوق به مثل ملفات تعريف الارتباط Cookies أو خدمات الويب أو الملفات المرفوعة عند عدم تعقيم sanitize البيانات تعقيمًا كافيًا قبل تضمينها في الصفحة، لذا يمكن أن تحتاج إلى إضافة رمز تعقيمك الخاص إذا أردتَ عرض بيانات من هذه المصادر.

الحماية من هجمات تزوير الطلبات عبر المواقع CSRF

تسمح هجمات Cross-Site Request Forgery -أو اختصارًا CSRF- للمستخدم الضار بتنفيذ الإجراءات باستخدام اعتماديات مستخدم آخر دون معرفة هذا المستخدم أو موافقته. لنأخذ مثلًا الحالة التي يكون لدينا فيها مخترق يريد إنشاء مؤلفين إضافيين لمكتبتنا المحلية.

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

يمكن للمخترق إنشاء ملف HTML مثل الملف الآتي الذي يحتوي على استمارة إنشاء المؤلف، مثل الاستمارة التي استخدمناها في القسم السابق، والتي تُرسَل بمجرد تحميل الملف، ثم يرسل المخترق الملف إلى جميع أمناء المكتبات ويقترح عليهم فتح الملف الذي سيحتوي على بعض المعلومات غير الضارة في مثالنا. إذا فتح أمينُ المكتبة الذي سجّل دخوله الملفَ، فستُرسَل الاستمارة مع اعتمادياتها وسيُنشأ مؤلف جديد.

<html lang="en">
  <body onload="document.EvilForm.submit()">
    <form
      action="http://127.0.0.1:8000/catalog/author/create/"
      method="post"
      name="EvilForm">
      <table>
        <tr>
          <th><label for="id_first_name">First name:</label></th>
          <td>
            <input
              id="id_first_name"
              maxlength="100"
              name="first_name"
              type="text"
              value="Mad"
              required />
          </td>
        </tr>
        <tr>
          <th><label for="id_last_name">Last name:</label></th>
          <td>
            <input
              id="id_last_name"
              maxlength="100"
              name="last_name"
              type="text"
              value="Man"
              required />
          </td>
        </tr>
        <tr>
          <th><label for="id_date_of_birth">Date of birth:</label></th>
          <td>
            <input id="id_date_of_birth" name="date_of_birth" type="text" />
          </td>
        </tr>
        <tr>
          <th><label for="id_date_of_death">Died:</label></th>
          <td>
            <input
              id="id_date_of_death"
              name="date_of_death"
              type="text"
              value="12/10/2016" />
          </td>
        </tr>
      </table>
      <input type="submit" value="Submit" />
    </form>
  </body>
</html>

شغِّل خادم الويب الخاص بالتطوير، وسجّل الدخول باستخدام حساب مستخدمك المميز، ثم انسخ النص السابق والصقه في ملفٍ ما وافتحه في المتصفح. يجب أن تحصل على خطأ CSRF، لأن جانغو لديه حماية ضد هذا النوع من الهجمات.

تُفعَّل الحماية من خلال تضمين وسم القالب {% csrf_token %} في تعريف استمارتك، ثم يُعرَض هذا المفتاح في شيفرة HTML كما يلي مع قيمة خاصة بالمستخدم في المتصفح الحالي:

<input
  type="hidden"
  name="csrfmiddlewaretoken"
  value="0QRWHnYVg776y2l66mcvZqp8alrv4lb8S8lZ4ZJUWGZFA5VHrVfL2mpH29YZ39PW" />

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

تُشغَّل حماية جانغو من هجمات CSRF افتراضيًا، ويجب عليك دائمًا استخدام وسم القالب {% csrf_token %} في استماراتك واستخدام طلبات POST التي يمكن أن تغير أو تضيف بيانات إلى قاعدة البيانات.

الحماية من الهجمات الأخرى

يوفّر جانغو أشكالًا أخرى من الحماية، إليك بعضًا منها.

الحماية من هجمات حقن استعلامات SQL

تمكّن الثغرات الأمنية الخاصة بحقن استعلامات SQL المستخدمين الضارين من تنفيذ شيفرة SQL عشوائية على قاعدة بيانات، مما يسمح بالوصول إلى البيانات أو تعديلها أو حذفها بغض النظر عن أذونات المستخدم. ستصل في كل حالة تقريبًا إلى قاعدة البيانات باستخدام مجموعات استعلام أو نماذج جانغو، لذلك سيهرِّب مشغّل قاعدة البيانات الأساسية شيفرة SQL الناتجة بصورة صحيحة. إذا كنت بحاجة إلى كتابة استعلامات بسيطة أو استعلامات SQL مُخصَّصة، فيجب عليك التفكير في منع حقن استعلامات SQL.

الحماية من هجمات الاختطاف بالنقر Clickjacking

يختطف المستخدم الضار في هذه الهجمات النقرات الخاصة بموقع المستوى الأعلى المرئي ويوجّهها إلى صفحة مخفية تحته، فمثلًا يمكن استخدام هذه التقنية لعرض موقع مصرف قانوني مع التقاط اعتماديات تسجيل الدخول ضمن عنصر <iframe> غير مرئي يتحكم فيه المهاجم. يتضمن جانغو حمايةً من هجمات الاختطاف بالنقر في صيغة X-Frame-Options middleware التي يمكنها منع عرض الموقع ضمن إطار في متصفح داعم لذلك.

فرض بروتوكول SSL/HTTPS

يمكن تفعيل بروتوكول SSL/HTTPS على خادم الويب لتشفير كل حركة المرور بين الموقع والمتصفح، بما في ذلك اعتماديات الاستيثاق التي يمكن إرسالها ضمن نص عادي. يوصَى جدًا بتفعيل HTTPS، إذ سيوفّر جانغو بتفعيله عددًا من وسائل الحماية الأخرى التي يمكنك استخدامها وهي:

  • يمكن استخدام SECURE_PROXY_SSL_HEADER للتحقق مما إذا كان المحتوى آمنًا، حتى وإن كان قادمًا من وكيل غير HTTP.
  • يُستخدَم SECURE_SSL_REDIRECT لإعادة توجيه جميع طلبات HTTP إلى HTTPS.
  • استخدم أمن نقل HTTP الصارم HTTP Strict Transport Security -أو اختصارًا HSTS، وهو ترويسة HTTP التي تخبر المتصفح بأن جميع الاتصالات المستقبلية إلى موقع معين يجب أن تستخدم HTTPS دائمًا. يضمن هذا الإعداد -إلى جانب إعادة توجيه طلبات HTTP إلى HTTPS- استخدام بروتوكول HTTPS دائمًا بعد نجاح الاتصال. يمكن ضبط HSTS مع SECURE_HSTS_SECONDS و SECURE_HSTS_INCLUDE_SUBDOMAINS أو على خادم الويب.
  • استخدم ملفات تعريف الارتباط "الآمنة" من خلال ضبط SESSION_COOKIE_SECURE و CSRF_COOKIE_SECURE على القيمة True، مما يضمن إرسال ملفات تعريف الارتباط عبر بروتوكول HTTPS فقط.

التحقق من صحة ترويسة المضيف

استخدم ALLOWED_HOSTS لقبول الطلبات من المضيفين الموثوق بهم فقط.

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

الخلاصة

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

ترجمة -وبتصرُّف- للمقال Django web application security.

اقرأ أيضًا


تفاعل الأعضاء

أفضل التعليقات

لا توجد أية تعليقات بعد



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

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

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.


×
×
  • أضف...