شرکت بورس ع.ش که بعد از کرونا مشتریهای زیادی پیدا کرده، با مشکلات جدیدی روبهرو شده!
زیاد شدن تعداد مشتریهای این شرکت بورس، باعث جلب توجه تعدادی از خرابکاران اینترنتی شده. این خرابکارها تصمیم گرفتند تا با حملههای DDoS به سایت این شرکت، آن را از دسترس خارج کنند و تنها به ازای گرفتن پولی هنگفت! از رئیس شرکت، دست از حمله بر میدارند.
شما باید به مدیر شرکت ع.ش کمک کنید تا با کمترین هزینه و با کمک دانش ملی و بومی! جلوی حملات این خرابکاران را بگیرد.
پروژه اولیه
پروژه اولیه را از این لینک دانلود کنید. ساختار فایلهای این پروژه به صورت زیر است:
boors-va-corona
├── apps
│   ├── guard
│   │   ├──  > admin.py < 
│   │   ├── apps.py
│   │   ├── __init__.py
│   │   ├── management
│   │   │   ├── commands
│   │   │   │   ├──  > init_guard.py < 
│   │   │   │   └── __init__.py
│   │   │   └── __init__.py
│   │   ├──  > middlewares.py < 
│   │   ├── migrations
│   │   ├──  > models.py < 
│   │   ├── urls.py
│   │   ├── utils.py
│   │   └── views.py
│   ├── __init__.py
│   └── market
│       ├── admin.py
│       ├── apps.py
│       ├── __init__.py
│       ├── migrations
│       │   └── __init__.py
│       ├── models.py
│       ├── tests.py
│       ├── urls.py
│       └── views.py
├── codecup
│   ├── asgi.py
│   ├── __init__.py
│   ├── settings
│   │   ├── base.py
│   │   ├── development.py
│   │   ├── __init__.py
│   │   └── production.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── codecupdb.sqlite3
├── deploy
│   └── nginx
│       └── default.conf
├── docker-compose.yml
├── Dockerfile
├── manage.py
├── README.md
└── requirements.txt
فایلهایی که شما باید در این پروژه تکمیل کنید همگی در اپ guard قرار دارند. نام این فایلها به صورت زیر است:
middlewares.py
admin.py
models.py
init_guard.py
فایل models.py
models.pyدر این فایل تمام مدلهای مورد نیاز برای پروژه از قبل تعریف شدهاند. در زیر به توضیح هر کدام از این مدلها میپردازیم:
مدل BlockedIp
این مدل برای ذخیره کد آیپیها مسدود شده می باشد. این مدل یک فیلد ban_time دارد که اگر از زمان ساخت یک نمونه از این مدل، به مقدار ban_time بگذرد، آیپی موردنظر از حالت مسدود خارج میشود. توجه کنید که واحد ban_time  به ثانیه است.
شما تنها کافیست دو متد is_blocked و is_ip_blocked را کامل کنید. متد is_blocked یک مقدار بولین برمیگرداند که آیا هنوز یک شئ BlockedIp معتبر هست یا نه. اگر معتبر بود مقدار True  و اگر زمان ban_time به طور کامل گذشته باشد مقدار False برمیگرداند. متد is_ip_blocked نیز یک آیپی به عنوان ورودی گرفته و یک مقدار بولین برمیگرداند که نشان میدهد آیپی داده شده مسدود شده است یا نه.
همچنین دو مدل دیگر در این فایل قرار دارد که نباید در آنها تغییری ایجاد کنید.
مدل ViewDetail
این مدل برای ذخیره کردن تمام ویوهای موجود در پروژه استفاده میشود. یعنی تمام ویوها به همراه URL شان را در ابتدای اجرا کردن پروژه، تعریف میکنیم و به دیتابیس اضافه میکنیم. با این کار به راحتی میتوانیم بفهمیم که هر آیپی با ریکوئست زدن به کدام ویو و URL مسدود شده است.
مدل SecurityConfig
از این مدل نیز تنها یک نمونه ساخته میشود که در ابتدای اجرا کردن پروژه باید تعریف شود و دیگر تغییری نکند. در این مدل میتوان لیست ویوهایی که میخواهیم از حمله مهاجامان در امان بماند را مشخص کرد.
فایل init_guard.py
init_guard.pyدر این فایل باید یک دستور برای جنگو بنویسید که بتواند مقادیر اولیهی موردنیاز برای مدلهای ViewDetail و SecurityConfig را در صورتی که از قبل ساخته نشده باشند را بسازد و در دیتابیس قرار دهد.
فایل admin.py
admin.pyدر این فایل نیز باید تنظیمات ادمین مربوط به مدلهای گفته شده در بالا را انجام دهید. نیازمندیهای ما به شکل زیر است:
- لیست اشیاء 
BlockedIpرا بتوان بر حسب فیلدviewفیلتر کرد. - در لیست اشیاء 
BlockedIp، بتوان بر حسب آیپی، نام ویو و URL ویو جست و جو کرد. - برای قسمت ادمین 
SecurityConfig، اجازه ساختن و حذف کردن شئ جدید را به ادمینهای سایت ندهیم. - برای قسمت ادمین 
ViewDetail، اجازه ساختن، حذف کردن و تغییر دادن شئ را به ادمینهای سایت ندهیم. 
فایل middlewares.py
middlewares.pyدر این قسمت باید مهمترین عنصر این ماژول امنیتی جدید را پیاده کنید. یک middleware که مقدار ریکوئست بر ثانیه را برای هر ریکوئست محاسبه میکند و اگر این مقدار از حداکثر مقدار ممکن، یعنی ۴ ریکوئست بر ثانیه، بیشتر باشد، آیپی کاربر را مسدود میکند. در این میدلور باید بررسی شود که اگر آیپی کسی که ریکوئست زده است، قبلا مسدود شده بود (banned_before)، یک ریسپانس با کد ۴۰۳ برگرداند؛ همچنین در این میدلور برای ذخیره کردن ریکوئستهای هر کاربر، از کش جنگو با زمان ماندگاری (timeout) ۶۰ثانیه استفاده میشود نه دیتابیس، تا سرعت پاسخگویی به ریکوئستها خیلی تحت تاثیر قرار نگیرد.
هم چنین در متد validate_request_per_second باید دادههای مربوط به آیپی ریکوئست زننده که در کش ذخیره شده، بررسی و تعداد ریکوئستها بر ثانیهی آن محاسبه شود. اگر این مقدار بیشتر از ۴ ریکوئست بر ثانیه بود، آن وقت آیپی موردنظر را در لیست سیاه قرار داده و ریسپانسی با کد ۴۲۹ برگردانده شود.
حالا با اطلاعاتی که آقای رئیس به شما داده، کمکهایتان را برای ما آپلود کنید!
تست نمونه
در فایلهای اولیهای که دانلود کردید یکسری داده اولیه به عنوان نمونه قرار داده شده است. میتوانید قبل از فرستادن سوال در سایت، این تستها را ببینید تا با نحوه داوری ما آشنا شوید و از پاسخ خود اطمینان حاصل نمایید.
تستها را میتوانید با دستور زیر اجرا کنید:
python manage.py test
نکات
- شما تنها مجوز ایجاد تغییرات در فایلهای زیر را دارید و تمامی تغییرات دیگر شما در فایلهای پروژه نادیده گرفته خواهند شد.
- فایل 
apps/guard/admin.py - فایل 
apps/guard/middlewares.py - فایل 
apps/guard/models.py - فایل 
apps/guard/management/commands/init_guard.py 
 - فایل 
 - فراموش نکنید که میتوانید با مطالعهی 
testsample.pyبا روش تست کردن مدلها، فرمها و ادمینها آشنا شوید. 
نحوه ارسال
یک فایل ZIP حاوی همهی فایلهای پروژه، آپلود کنید. نام فایل ZIP اهمیتی ندارد.
ارسال پاسخ برای این سؤال