شمارنده‌ی محدود


مصطفی که در زمینه امنیت اطلاعات شخص بسیار حرفه‌ای می‌باشد، پیشنهاد داده است که تعداد درخواست‌های قابل ارسال به 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>"}
    JSON

مقدار <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 را به هرصورتی که علاقمندید تغییر دهید. در صورتی که با داکر و داکرفایل آشنایی ندارید، هم کافیست که با استفاده از توضیحات داده شده صرفاً با پیاده‌سازی این API سؤال را حل کنید.

فرد بی‌هویت

نکته‌ی مهمی که در این API وجود دارد این است که درصورتی که هدر CLIENT-KEY وجود نداشت، آخرین وضعیت باید در پاسخ برگردانده شود. درواقع تعداد ریکوئست‌هایی که فردی بی‌هویت به API می‌زند شمرده نمی‌شود؛ ولی state کلی تا آن لحظه برگردانده می‌شود:

{
    "state": {
      "client-key-arvancloud": 5,
      "client-key-quera": 7,    
      "client-key-bood-key-bood-man-naboodam": 35
    }
}
JSON

نحوه ارسال پاسخ🔗

شما می‌توانید تمامی محتوای موجود در پوشه‌ی 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
Plain text

توجه کنید که نام فایل کد شما برای سیستم داوری اهمیتی ندارد و این خود شما هستید که در runner.sh از نام آن برای اجرای پروژه استفاده می‌کنید.

در نهایت این پوشه را zip کرده و ارسال کنید. توجه کنید که پس از extract کردن فایل zip شما، باید پوشه‌ی api را ببینیم که درون آن Dockerfile وجود دارد.

ارسال پاسخ برای این سؤال
در حال حاضر شما دسترسی ندارید.