
تطبيق Django بسيط وسريع جداً وقابل لإعادة الاستخدام يمنع الأشخاص من هجمات القوة الغاشمة على تسجيل الدخول.
.. image:: https://jazzband.co/static/img/badge.svg :target: https://jazzband.co/ :alt: Jazzband
.. image:: https://img.shields.io/pypi/pyversions/django-defender.svg :alt: Supported Python versions :target: https://pypi.org/project/django-defender/
.. image:: https://img.shields.io/pypi/djversions/django-defender.svg :target: https://pypi.org/project/django-defender/ :alt: Supported Django versions
.. image:: https://github.com/jazzband/django-defender/workflows/Test/badge.svg :target: https://github.com/jazzband/django-defender/actions :alt: GitHub Actions
.. image:: https://codecov.io/gh/jazzband/django-defender/branch/master/graph/badge.svg :target: https://codecov.io/gh/jazzband/django-defender :alt: Coverage
.. image:: https://readthedocs.org/projects/django-defender/badge/?version=latest :alt: Documentation Status :target: https://django-defender.readthedocs.io/en/latest/?badge=latest
تطبيق Django قابل لإعادة الاستخدام بسيط يمنع محاولات تسجيل الدخول القسرية (Brute Force). الهدف هو جعله بأسرع ما يمكن، حتى لا نبطئ محاولات تسجيل الدخول.
سنستخدم ذاكرة تخزين مؤقت (Cache) بحيث لا نضطر لمراجعة قاعدة البيانات عند كل محاولة دخول. الإصدار الأول سيعتمد على Redis، لكن الهدف هو جعل ذلك قابلاً للتكوين بحيث يمكن للمستخدمين استخدام أي خلفية تناسب احتياجاتهم.
إذا كنت تستخدم defender على موقعك، فيرجى تقديم طلب Pull Request لإضافته إلى القائمة.
التوثيق متاح على Read the Docs:
https://django-defender.readthedocs.io
تسجيل جميع محاولات تسجيل الدخول في قاعدة البيانات
دعم للبروكسيات العكسية (Reverse Proxies) مع رؤوس مختلفة لعناوين IP
تحديد معدل المحاولات بناءً على
استخدام Redis في القائمة السوداء
إعدادات
خادم Redis
مدة الحظر
عدد المحاولات الخاطئة قبل الحظر
تغطية 95% للكود
توثيق كامل
إمكانية تخزين محاولات تسجيل الدخول في قاعدة البيانات
أمر إداري لتنظيف جدول محاولات تسجيل الدخول
صفحات إدارة
يمكن تكييفه بسهولة مع طريقة المصادقة المخصصة.
يتم إرسال إشارات (Signals) عند حظر اسم المستخدم أو عنوان IP
صفحات الإدارة
.. image:: https://cloud.githubusercontent.com/assets/261601/5950540/8895b570-a729-11e4-9dc3-6b00e46c8043.png :target: https://cloud.githubusercontent.com/assets/261601/5950540/8895b570-a729-11e4-9dc3-6b00e46c8043.png :alt: alt tag
.. image:: https://cloud.githubusercontent.com/assets/261601/5950541/88a35194-a729-11e4-981b-3a55b44ef9d5.png :target: https://cloud.githubusercontent.com/assets/261601/5950541/88a35194-a729-11e4-981b-3a55b44ef9d5.png :alt: alt tag
قم بتنزيل الكود، ثم قم بتشغيل الإعداد بإحدى الطرق التالية حسب الطريقة.
لتثبيت الإصدار الجاهز للإنتاج من PyPI:
.. code-block:: bash
pip install django-defender
لتثبيت الإصدار التطويري من الكود المصدري بعد التنزيل:
.. code-block:: bash
python setup.py install
لتثبيت الإصدار التطويري من الفرع الرئيسي من مستودع GitHub:
.. code-block:: bash
pip install -e git+http://github.com/kencochran django-defender.git#egg=django_defender-dev
أولاً، يجب إضافة هذا المشروع إلى قائمة INSTALLED_APPS في ملف
settings.py
.. code-block:: python
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', # ... 'defender', # ... ]
بعد ذلك، قم بتثبيت وسيطة FailedLoginMiddleware
.. code-block:: python
MIDDLEWARE_CLASSES = [ 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'defender.middleware.FailedLoginMiddleware', ]
إذا كنت ترغب في إدارة المستخدمين المحظورين عبر واجهة Django الإدارية، فأضف
التالي إلى ملف urls.py
.. code-block:: python
urlpatterns = [ path('admin/defender/', include('defender.urls')), # defender admin path('admin/', admin.site.urls), # normal admin # your own patterns follow... ]
الهجرات (Migrations)
ستحتاج إلى إنشاء جداول في قاعدة البيانات الخاصة بك ضرورية للتشغيل.
.. code-block:: bash
python manage.py migrate defender
الأوامر الإدارية
cleanup_django_defender
إذا كان لديك موقع ويب بحركة مرور عالية، فإن جدول AccessAttempts سيمتلئ بسرعة. إذا لم تكن بحاجة إلى الاحتفاظ بالبيانات لأغراض التدقيق، يوجد أمر إداري لمساعدتك في الحفاظ على نظافته.
سيتم النظر إلى إعداد DEFENDER_ACCESS_ATTEMPT_EXPIRATION لتحديد
أي السجلات سيتم حذفها. الافتراضي إذا لم يتم التحديد، هو 24 ساعة.
.. code-block:: bash
$ python manage.py cleanup_django_defender
يمكنك ضبط هذا كوظيفة cron يومية أو أسبوعية للحفاظ على حجم الجدول صغيرًا.
.. code-block:: bash
24 0 * * * /usr/bin/python manage.py cleanup_django_defender >> /var/log/django_defender_cleanup.log
الأداء
الهدف من defender هو جعله بأسرع ما يمكن حتى لا يبطئ عملية تسجيل الدخول. من أجل التأكد من تحقيق أهدافنا، نحتاج إلى طريقة لاختبار التطبيق للتأكد من أننا على المسار الصحيح. أفضل طريقة للقيام بذلك هي مقارنة سرعة تسجيل الدخول العادي في Django مع defender و django-axes.
تسجيل الدخول العادي في Django سيكون خط الأساس، ونتوقع أن يكون الأسرع من بين الطرق الثلاث، لأنه لا توجد فحوصات إضافية.
تسجيل الدخول باستخدام defender سيكون على الأرجح أبطأ من Django، ونأمل أن يكون أسرع من django-axes. الهدف هو جعل الفرق صغيرًا قدر الإمكان بين تسجيل الدخول العادي واستخدام defender.
سرعة تسجيل الدخول باستخدام django-axes ستكون على الأرجح الأبطأ بين الثلاثة لأنه يقوم بمزيد من الفحوصات ويقوم بالعديد من استعلامات قاعدة البيانات.
أفضل طريقة لتحديد سرعة تسجيل الدخول هي إجراء اختبار تحميل على تطبيق مع كل إعداد، ومقارنة أوقات تسجيل الدخول لكل نوع.
اختبار التحميل
من أجل التأكد من تغطية جميع أنواع تسجيل الدخول المختلفة، في اختبار التحميل نحتاج إلى أكثر من اختبار واحد.
#. جميعها ناجحة: سنقوم باختبار تحميل لا يحتوي إلا على محاولات تسجيل دخول ناجحة.
#. مختلط: بعض الناجح وبعض الفاشل: سنقوم باختبار تحميل مع بعض محاولات الدخول الناجحة وبعضها الفاشلة لرؤية كيف تؤثر الفاشلة على الأداء.
#. جميعها فاشلة: سنقوم باختبار تحميل مع جميع محاولات تسجيل الدخول الفاشلة ورؤية الفرق في الأداء.
سنحتاج إلى تطبيق عينة يمكننا استخدامه لاختبار التحميل، مع الاختلاف الوحيد هو التكوين حيث نقوم إما بتحميل defender، أو axes، أو لا شيء منهما.
يمكننا استخدام خدمة اختبار تحميل مستضافة، أو شيء مثل jmeter. بأي طريقة، نحتاج إلى أن نكون متسقين لجميع الاختبارات. إذا استخدمنا jmeter، يجب أن يكون لدينا تكوين jmeter ليقوم الآخرون بتشغيل الاختبارات بأنفسهم.
نتائج اختبارات التحميل
سنقوم بنشر النتائج هنا. سنشرح كل اختبار، ونعرض النتائج مع بعض الرسوم البيانية.
django-axes رائع لكنه يضع كل شيء في قاعدة البيانات، وهذا يسبب عنق زجاجة عندما يكون لديك الكثير من البيانات. إنه يبطئ طلبات المصادقة بمقدار 200-300 مللي ثانية. قد لا يكون هذا كثيرًا لبعض المواقع، لكنه كثير جدًا بالنسبة للآخرين.