13 KiB
13 KiB
مشخصات درسنامه: جلوگیری از حملات DoS و مهار هزینهها با Rate Limiting و Upstash Redis
- شناسه در سیلابس:
L11.8 - فصل: فصل ۱۱: امنیت و استفاده مسئولانه (Ch 11)
- نوع محتوا: 📘 درسنامه متنی
- زمان تقریبی مطالعه: ۱۸ دقیقه
- پیشنیازهای مستقیم:
L11.7(مدیریت Dependencyها و امنیت زنجیره تأمین)
۱. اهداف یادگیری (Learning Objectives - Bloom's Taxonomy)
دانشجو پس از مطالعهٔ این درسنامه باید بتواند:
- درک کند (Understand): خطر مرگبار حملات منع سرویس (Denial of Service - DoS) و سوءاستفاده رباتها از اندپوینتهای هزینهبر (نظیر پیامک کاوهنگار و توکنهای هوش مصنوعی) را شرح دهد.
- تحلیل/ارزیابی کند (Evaluate): چرا محدودسازی نرخ درخواست مبتنی بر حافظه داخلی سرور (In-Memory) در معماری بدون سرور (Serverless) شکست میخورد و ضرورت استفاده از دیتابیس توزیعشده موقت نظیر Redis را تحلیل کند.
- بهکار ببندد (Apply): سرویس سرورلس Upstash Redis را راهاندازی کرده و با پکیج
@upstash/ratelimit، اندپوینتهای چت هوش مصنوعی و فرم تماس را به سقف درخواست در بازه زمانی مجهز نماید. - ایجاد کند (Create): یک پاسخ استاندارد HTTP با کد وضعیت
429 Too Many Requestsبه همراه پیام هشدار فارسی و ثانیهشمار تلاش مجدد برای کاربران خاطی طراحی کند.
۲. محدوده و مرزهای محتوا (Scope & Boundaries)
آنچه باید پوشش داده شود (In-Scope):
- کابوس قبضهای نجومی و ورشکستگی با یک لوپ ساده:
- سناریوی وحشتناک: یک ربات اسکریپتی فرم تماس پورتفولیو را پیدا کرده و در هر ثانیه ۱۰۰ پیامک ارسال میکند! نتیجه: اعتبار میلیونی کاوهنگار در چند دقیقه تبخیر میشود.
- محدودسازی نرخ درخواست (Rate Limiting) چیست؟
- سهمیهبندی تعداد درخواستهای مجاز برای هر شناسه کاربر یا آدرس IP در بازه زمانی معین (مثلاً: حداکثر ۵ درخواست در هر دقیقه).
- چالش معماری بدون سرور (Serverless Challenge):
- در پلتفرمهای مدرن، هر درخواست ممکن است روی یک فانکشن مجزا و مستقل اجرا شود؛ متغیرهای حافظهای در میان این سرورها مشترک نیستند!
- راهکار استاندارد: استفاده از پایگاه داده رم سرورلس Upstash Redis با تاخیر چند میلیثانیهای.
- پیادهسازی الگوریتم پنجره لغزان (Sliding Window):
- نصب
@upstash/ratelimitو@upstash/redis. - اعمال محدودیت در Middleware یا مستقیماً در روت
/api/chatو Server Action پیامک:import { Ratelimit } from "@upstash/ratelimit"; import { Redis } from "@upstash/redis"; const ratelimit = new Ratelimit({ redis: Redis.fromEnv(), limiter: Ratelimit.slidingWindow(5, "60 s"), });
- نصب
- ارائه بازخورد حرفهای با کد ۴۲۹ (Too Many Requests):
- ارسال پاسخ ۴۲۹ همراه با هدر
Retry-Afterو نمایش پیام فارسی آرامشبخش در UI: «تعداد درخواستهای شما بیش از حد مجاز است. لطفاً ۶۰ ثانیه دیگر تلاش کنید.»
- ارسال پاسخ ۴۲۹ همراه با هدر
- دستورات چندسکویی برای نصب و تنظیمات Upstash:
- نصب پکیجها و تنظیم توکنهای REST در منوهای کشویی سه سیستمعامل.
- کالاوتهای آموزشی و هشدار کوئرا:
- کالاوت بنفش (
<details class="violet">): تفاوت الگوریتم پنجره ثابت (Fixed Window) و پنجره لغزان (Sliding Window) در جلوگیری از حملات در لبههای دقیقه. - کالاوت سبز (
<details class="green">): سهمیه رایگان روزانه ۱۰,۰۰۰ درخواست در Upstash که برای پروژههای شخصی و پورتفولیوها کاملاً رایگان است. - کالاوت قرمز (
<details class="red">): اولویتبندی ریت لیمیت؛ اندپوینتهای متصل به پول و شارژ (SMS, AI, Payment) باید سختگیرانهترین سهمیهها را داشته باشند.
- کالاوت بنفش (
آنچه نباید وارد آن شویم (Out-of-Scope):
- پیکربندی فایروالهای سختافزاری لایه ۳ و ۴ شبکه (WAF سختافزاری).
- حملات توزیعشده بینالمللی با میلیونها باتنت (DDOS توزیعشده جهانی).
۳. مفاهیم کلیدی و کلمات تخصصی (Key Concepts & Terms)
| اصطلاح انگلیسی | معادل فارسی مصوب | توضیح یکخطی ساده |
|---|---|---|
| Rate Limiting | محدودسازی نرخ درخواست | استراتژی امنیتی کنترل تعداد دفعاتی که یک کاربر میتواند یک عملیات را در بازه زمانی مشخص تکرار کند |
| Denial of Service (DoS) | حمله منع سرویس | هجوم عمدی درخواستهای انبوه به سرور برای از کار انداختن سرویس یا مصرف تمام منابع و بودجه |
| Upstash Redis | ردیس سرورلس آپاستش | نسخه بهینهشده دیتابیس حافظهای پرسرعت Redis برای محیطهای بدون سرور با ارتباط امن HTTP REST |
| Sliding Window | الگوریتم پنجره لغزان | دقیقترین الگوریتم ریت لیمیتینگ که ترافیک ورودی را در بازه زمانی شناور و پیوسته میسنجد |
| HTTP 429 Too Many Requests | کد خطای درخواست بیش از حد | کد وضعیت استاندارد وب برای اعلام اینکه سهمیه مجاز ارسال درخواست کاربر موقتاً به پایان رسیده است |
| Resource Exhaustion | تخلیه و فرسایش منابع | حادثه اتمام اعتبارهای مالی، سقف مصرف پردازنده، یا محدودیت دیتابیس بر اثر هجوم درخواستها |
۴. جایگاههای تصاویر و نمودارها (Visual & Diagram Placeholders)
راهنمای ایجنت نویسنده: تمام تصاویر باید در پوشهٔ
images/ذخیره شده و در جدول تکخانهای وسطچین درج شوند:
- تصویر کاور درس:
images/cover.png- موضوع: گیت ورود نئونی با چراغ راهنمایی هوشمند که به افراد عادی چراغ سبز میدهد و رباتهای تندرو را با علامت ۴۲۹ متوقف میکند.
- سناریوی تخلیه منابع توسط رباتها بدون Rate Limit:
images/resource-exhaustion-flow.png- موضوع: اینفوگرافیک هشداردهنده: ربات خودکار
\rightarrowارسال ۱۰۰۰ پیامک در دقیقه\rightarrowخطای اتمام اعتبار و بدهی حساب کاربری.
- موضوع: اینفوگرافیک هشداردهنده: ربات خودکار
- نحوه عملکرد Upstash Redis در معماری Serverless:
images/upstash-serverless-architecture.png- موضوع: دیاگرام معماری: چندین نمونه مختلف سرورهای Next.js همگی به یک پایگاه مشترک Upstash متصل هستند و سهمیه هر IP را میشمارند.
- نمایش پیام خطای ۴۲۹ در ویجت چت و فرم پورتفولیو:
images/rate-limit-429-ui-feedback.png- موضوع: اسکرینشات از ویجت چت با یک بنر ملایم اخطار: «شما ۵ پیام ارسال کردهاید؛ لطفاً ۴۵ ثانیه دیگر پیام بعدی را بفرستید.»
۵. بخشبندی و ساختار محتوایی پیشنهادی درسنامه (README.md)
- تیتر اصلی:
# جلوگیری از حملات DoS و مهار هزینهها با Rate Limiting و Upstash Redis - مقدمه: چگونه یک ربات بازیگوش میتواند در عرض چند دقیقه تمام بودجه شارژ پیامک و هوش مصنوعی شما را بسوزاند و چطور جلوی آن بایستیم؟
- جدول کاور درس
- استعاره دستگاه نوبتدهی بانک و کارتخوان عابربانک:
- شما نمیتوانید ۱۰۰ بار پشت سر هم کارت بکشید؛ سیستم بعد از ۳ تلاش، کارت را مسدود میکند یا فاصله زمانی میاندازد.
- چرا Rate Limiting در Next.js مدرن به Redis نیاز دارد؟
- معماری Stateless توابع سرورلس و لزوم داشتن یک حافظه مشترک ابری.
- راهاندازی رایگان Upstash Redis در ۲ دقیقه:
- ثبت نام، ساخت دیتابیس با ریجن نزدیک، و کپی کردن آدرس REST و توکن.
- نصب و کدنویسی ماژول
lib/ratelimit.ts:- تنظیم سهمیه ۵ درخواست در دقیقه برای فرم پیامک و ۲۰ پیام برای چت هوش مصنوعی.
- پیادهسازی در روتهای حساس پورتفولیو:
- بررسی آیپی کاربر، صدور پاسخ ۴۲۹، و ارسال هدر زمان انتظار.
- جعبه پرامپت طلایی: مجهز کردن اندپوینتهای هزینه به Rate Limit با ایجنت:
- پرامپت دقیق:
«من کلیدهای
UPSTASH_REDIS_REST_URLوUPSTASH_REDIS_REST_TOKENرا در.env.localدارم. لطفاً با استفاده از@upstash/ratelimit، برای روت/api/chatو Server Action فرم تماس، یک محافظت ریت لیمیت پنجره لغزان اضافه کن. اگر کاربر بیش از سقف مجاز پیام فرستاد، یک خطای ۴۲۹ با پیام فارسی و ثانیههای باقیمانده بازگردان و در فرانتاند یک بنر هشدار نمایش بده.»
- پرامپت دقیق:
- دستورات چندسکویی برای نصب پکیجهای Upstash:
- منوی کشویی سهگانه برای ویندوز، مک و لینوکس:
- Windows (PowerShell):
npm install @upstash/ratelimit @upstash/redis Add-Content .env.local "`nUPSTASH_REDIS_REST_URL=https://your-db.upstash.io`nUPSTASH_REDIS_REST_TOKEN=your_token_here" - macOS (Terminal):
npm install @upstash/ratelimit @upstash/redis echo -e "\nUPSTASH_REDIS_REST_URL=https://your-db.upstash.io\nUPSTASH_REDIS_REST_TOKEN=your_token_here" >> .env.local - Linux (Bash):
npm install @upstash/ratelimit @upstash/redis echo -e "\nUPSTASH_REDIS_REST_URL=https://your-db.upstash.io\nUPSTASH_REDIS_REST_TOKEN=your_token_here" >> .env.local
- Windows (PowerShell):
- منوی کشویی سهگانه برای ویندوز، مک و لینوکس:
- باکس نکته Quera (
<details class="violet">): اهمیت کشف درست آدرس IP کاربر از طریق هدرهایx-forwarded-forو جلوگیری از مسدودسازی اشتباه سرورهای خودی. - باکس هشدار Quera (
<details class="red">): هرگز اندپوینتهای چت هوش مصنوعی را بدون ریت لیمیت به اینترنت باز نگذارید؛ این کار دعوت رسمی از اسکرپرها برای مصرف اعتبار شماست! - باکس رضایتبخش Quera (
<details class="green">): تست پشتسرهم کلیک روی دکمه چت و مشاهده پاسخ مودبانه ۴۲۹ و متوقف شدن مصرف توکنها. - جمعبندی درسنامه: تثبیت دیوارهای دفاعی فنی؛ ورود به ایستگاه پایانی فصل: هزینه، مالکیت فکری، حقوقی و اخلاق مهندسی در درس بعدی.
۶. معیارهای پذیرش (Acceptance Criteria for Reviewer)
- خطرات حملات DoS و تخلیه منابع مالی (Resource Exhaustion) تبیین شود.
- چرایی نیاز به Redis در معماری Serverless تشریح گردد.
- نحوه پیادهسازی کاربردی Upstash Redis با الگوریتم پنجره لغزان آموزش داده شود.
- پاسخدهی استاندارد HTTP 429 به همراه فرانتاند دوستانه در متن درس گنجانده شود.