# مشخصات درس‌نامه: جلوگیری از حملات 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): 1. **کابوس قبض‌های نجومی و ورشکستگی با یک لوپ ساده:** * سناریوی وحشتناک: یک ربات اسکریپتی فرم تماس پورتفولیو را پیدا کرده و در هر ثانیه ۱۰۰ پیامک ارسال می‌کند! نتیجه: اعتبار میلیونی کاوه‌نگار در چند دقیقه تبخیر می‌شود. 2. **محدودسازی نرخ درخواست (Rate Limiting) چیست؟** * سهمیه‌بندی تعداد درخواست‌های مجاز برای هر شناسه کاربر یا آدرس IP در بازه زمانی معین (مثلاً: حداکثر ۵ درخواست در هر دقیقه). 3. **چالش معماری بدون سرور (Serverless Challenge):** * در پلتفرم‌های مدرن، هر درخواست ممکن است روی یک فانکشن مجزا و مستقل اجرا شود؛ متغیرهای حافظه‌ای در میان این سرورها مشترک نیستند! * راهکار استاندارد: استفاده از پایگاه داده رم سرورلس Upstash Redis با تاخیر چند میلی‌ثانیه‌ای. 4. **پیاده‌سازی الگوریتم پنجره لغزان (Sliding Window):** * نصب `@upstash/ratelimit` و `@upstash/redis`. * اعمال محدودیت در Middleware یا مستقیماً در روت `/api/chat` و Server Action پیامک: ```typescript import { Ratelimit } from "@upstash/ratelimit"; import { Redis } from "@upstash/redis"; const ratelimit = new Ratelimit({ redis: Redis.fromEnv(), limiter: Ratelimit.slidingWindow(5, "60 s"), }); ``` 5. **ارائه بازخورد حرفه‌ای با کد ۴۲۹ (Too Many Requests):** * ارسال پاسخ ۴۲۹ همراه با هدر `Retry-After` و نمایش پیام فارسی آرامش‌بخش در UI: «تعداد درخواست‌های شما بیش از حد مجاز است. لطفاً ۶۰ ثانیه دیگر تلاش کنید.» 6. **دستورات چندسکویی برای نصب و تنظیمات Upstash:** * نصب پکیج‌ها و تنظیم توکن‌های REST در منوهای کشویی سه سیستم‌عامل. 7. **کال‌اوت‌های آموزشی و هشدار کوئرا:** * کال‌اوت بنفش (`
`): تفاوت الگوریتم پنجره ثابت (Fixed Window) و پنجره لغزان (Sliding Window) در جلوگیری از حملات در لبه‌های دقیقه. * کال‌اوت سبز (`
`): سهمیه رایگان روزانه ۱۰,۰۰۰ درخواست در Upstash که برای پروژه‌های شخصی و پورتفولیوها کاملاً رایگان است. * کال‌اوت قرمز (`
`): اولویت‌بندی ریت لیمیت؛ اندپوینت‌های متصل به پول و شارژ (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/` ذخیره شده و در جدول تک‌خانه‌ای وسط‌چین درج شوند: 1. **تصویر کاور درس:** `images/cover.png` * **موضوع:** گیت ورود نئونی با چراغ راهنمایی هوشمند که به افراد عادی چراغ سبز می‌دهد و ربات‌های تندرو را با علامت ۴۲۹ متوقف می‌کند. 2. **سناریوی تخلیه منابع توسط ربات‌ها بدون Rate Limit:** `images/resource-exhaustion-flow.png` * **موضوع:** اینفوگرافیک هشداردهنده: ربات خودکار $\rightarrow$ ارسال ۱۰۰۰ پیامک در دقیقه $\rightarrow$ خطای اتمام اعتبار و بدهی حساب کاربری. 3. **نحوه عملکرد Upstash Redis در معماری Serverless:** `images/upstash-serverless-architecture.png` * **موضوع:** دیاگرام معماری: چندین نمونه مختلف سرورهای Next.js همگی به یک پایگاه مشترک Upstash متصل هستند و سهمیه هر IP را می‌شمارند. 4. **نمایش پیام خطای ۴۲۹ در ویجت چت و فرم پورتفولیو:** `images/rate-limit-429-ui-feedback.png` * **موضوع:** اسکرین‌شات از ویجت چت با یک بنر ملایم اخطار: «شما ۵ پیام ارسال کرده‌اید؛ لطفاً ۴۵ ثانیه دیگر پیام بعدی را بفرستید.» --- ## ۵. بخش‌بندی و ساختار محتوایی پیشنهادی درس‌نامه (`README.md`) 1. **تیتر اصلی:** `# جلوگیری از حملات DoS و مهار هزینه‌ها با Rate Limiting و Upstash Redis` 2. **مقدمه:** چگونه یک ربات بازیگوش می‌تواند در عرض چند دقیقه تمام بودجه شارژ پیامک و هوش مصنوعی شما را بسوزاند و چطور جلوی آن بایستیم؟ 3. **جدول کاور درس** 4. **استعاره دستگاه نوبت‌دهی بانک و کارت‌خوان عابربانک:** * شما نمی‌توانید ۱۰۰ بار پشت سر هم کارت بکشید؛ سیستم بعد از ۳ تلاش، کارت را مسدود می‌کند یا فاصله زمانی می‌اندازد. 5. **چرا Rate Limiting در Next.js مدرن به Redis نیاز دارد؟** * معماری Stateless توابع سرورلس و لزوم داشتن یک حافظه مشترک ابری. 6. **راه‌اندازی رایگان Upstash Redis در ۲ دقیقه:** * ثبت نام، ساخت دیتابیس با ریجن نزدیک، و کپی کردن آدرس REST و توکن. 7. **نصب و کدنویسی ماژول `lib/ratelimit.ts`:** * تنظیم سهمیه ۵ درخواست در دقیقه برای فرم پیامک و ۲۰ پیام برای چت هوش مصنوعی. 8. **پیاده‌سازی در روت‌های حساس پورتفولیو:** * بررسی آی‌پی کاربر، صدور پاسخ ۴۲۹، و ارسال هدر زمان انتظار. 9. **جعبه پرامپت طلایی: مجهز کردن اندپوینت‌های هزینه به Rate Limit با ایجنت:** * پرامپت دقیق: > «من کلیدهای `UPSTASH_REDIS_REST_URL` و `UPSTASH_REDIS_REST_TOKEN` را در `.env.local` دارم. لطفاً با استفاده از `@upstash/ratelimit`، برای روت `/api/chat` و Server Action فرم تماس، یک محافظت ریت لیمیت پنجره لغزان اضافه کن. اگر کاربر بیش از سقف مجاز پیام فرستاد، یک خطای ۴۲۹ با پیام فارسی و ثانیه‌های باقی‌مانده بازگردان و در فرانت‌اند یک بنر هشدار نمایش بده.» 10. **دستورات چندسکویی برای نصب پکیج‌های Upstash:** * منوی کشویی سه‌گانه برای ویندوز، مک و لینوکس: - Windows (PowerShell): ```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): ```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 ``` - Linux (Bash): ```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 ``` 11. **باکس نکته Quera (`
`):** اهمیت کشف درست آدرس IP کاربر از طریق هدرهای `x-forwarded-for` و جلوگیری از مسدودسازی اشتباه سرورهای خودی. 12. **باکس هشدار Quera (`
`):** هرگز اندپوینت‌های چت هوش مصنوعی را بدون ریت لیمیت به اینترنت باز نگذارید؛ این کار دعوت رسمی از اسکرپرها برای مصرف اعتبار شماست! 13. **باکس رضایت‌بخش Quera (`
`):** تست پشت‌سرهم کلیک روی دکمه چت و مشاهده پاسخ مودبانه ۴۲۹ و متوقف شدن مصرف توکن‌ها. 14. **جمع‌بندی درس‌نامه:** تثبیت دیوارهای دفاعی فنی؛ ورود به ایستگاه پایانی فصل: هزینه، مالکیت فکری، حقوقی و اخلاق مهندسی در درس بعدی. --- ## ۶. معیارهای پذیرش (Acceptance Criteria for Reviewer) - [ ] خطرات حملات DoS و تخلیه منابع مالی (Resource Exhaustion) تبیین شود. - [ ] چرایی نیاز به Redis در معماری Serverless تشریح گردد. - [ ] نحوه پیاده‌سازی کاربردی Upstash Redis با الگوریتم پنجره لغزان آموزش داده شود. - [ ] پاسخ‌دهی استاندارد HTTP 429 به همراه فرانت‌اند دوستانه در متن درس گنجانده شود.