مصطفی که در زمینه امنیت اطلاعات شخص بسیار حرفهای میباشد، پیشنهاد داده است که تعداد درخواستهای قابل ارسال به api
که در سوال سوال دوم مسابقه نوشته شده است را به شکلی محدود کنیم که بتواند حملات احتمالی به سیستم را کنترل نماید. برای همین منظور شما باید پاسخ سوال سوال دوم مسابقه را به گونهای که در زیر توضیح داده شده است اصلاح نمایید.
برای دانلود پروژهی اولیه روی این لینک کلیک کنید.
محدودیت rate-limit
در این api
هر client-key
مجاز باشد
در هر دقیقه حداکثر ۱۰ request ارسال کند.
یعنی هر کلاینت اگر در ۶۰ ثانیهی اخیر ۱۰ request ارسال کرده باشد باید برای request بعدی خود ۶۰ ثانیه منتظر بماند.
در صورتی که تعداد request های یک client-key
از این محدودیت بیشتر شد؛
پاسخها به درخواستهای آن client-key
باید
تا یک دقیقه دارای مشخصات زیر باشد:
- Status code:
429
- Body:
{"message": "Too many request from <client-key>"}
مقدار <client-key>
در message
باید بر اساس هدر client-key
درخواست جایگذاری شود.
برای rate limit مجاز به استفاده از nginx نیستید و باید با توجه به زبان مورد نظر خود، پیادهسازی را در آن زبان انجام دهید. (به نحوه ارسال پاسخ و فایلهای مجاز در انتهای سوال دقت نمایید.)
نکات تکمیلی
نصب نیازمندیها و اجرا
برای حل این سؤال میتوانید از هر زبان و هر تکنولوژیای که میخواهید استفاده کنید. بهصورتی که در یک پوشه به نام api
کد برنامه را نوشته و در فایلی به نام runner.sh
که توسط sh
اجرا میشود، باید برنامهی خود را اجرا کنید. توجه کنید که حتماً باید Dockerfile
مربوط به پروژهی خود را برای ما ارسال کنید.
در پروژهی اولیه، ۴ داکرفایل برای php
، python
، golang
و node
قرار دادیم که میتوانید از آنها مستقیماً استفاده کنید. در صورتی که از یکی از این زبانها برای حل سؤال استفاده میکنید، کافیست که Dockerfile
مربوط به آن را در پوشهی api
کپی کنید و طبق توضیحات داده شده، سؤال را حل کنید. برای نصب نیازمندیهای پایتون از requirements.txt
، برای پیاچپی از composer.json
، برای گولنگ از go.mod
و برای نودجیاس از package.json
استفاده کنید.
در صورتی که زبان مورد استفادهی شما، چیزی به جز این ۴ مورد است، باید خودتان داکرفایلی در پوشهی api
بهشکلی بنویسید که بتواند نیازمندیهای پروژهی شما را نصب کرده و برنامهی شما را مانند داکرفایلهای موجود اجرا کند.
تغییر Dockerfile
Dockerfile
شما آزادید که Dockerfile
را به هرصورتی که علاقمندید تغییر دهید. در صورتی که با داکر و داکرفایل آشنایی ندارید، هم کافیست که با استفاده از توضیحات داده شده صرفاً با پیادهسازی این API
سؤال را حل کنید.
فرد بیهویت
نکتهی مهمی که در این API
وجود دارد این است که درصورتی که هدر CLIENT-KEY
وجود نداشت، آخرین وضعیت باید در پاسخ برگردانده شود. درواقع تعداد ریکوئستهایی که فردی بیهویت به API
میزند شمرده نمیشود؛ ولی state کلی تا آن لحظه برگردانده میشود:
{
"state": {
"client-key-arvancloud": 5,
"client-key-quera": 7,
"client-key-bood-key-bood-man-naboodam": 35
}
}
نحوه ارسال پاسخ
شما میتوانید تمامی محتوای موجود در پوشهی api
را تغییر دهید و هر فایلی که میخواهید اضافه یا کم کنید.
api
├── api.py # or main.go somefile.js anyfile.php name.any ...
├── Dockerfile
├── requirements.txt # or go.mod package.json composer.json
└── runner.sh
توجه کنید که نام فایل کد شما برای سیستم داوری اهمیتی ندارد و این خود شما هستید که در runner.sh
از نام آن برای اجرای پروژه استفاده میکنید.
در نهایت این پوشه را zip کرده و ارسال کنید. توجه کنید که پس از extract کردن فایل zip شما، باید پوشهی api
را ببینیم که درون آن Dockerfile
وجود دارد.
ارسال پاسخ برای این سؤال