Files

130 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# مشخصات درس‌نامه: جلوگیری از حملات 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. **کال‌اوت‌های آموزشی و هشدار کوئرا:**
* کال‌اوت بنفش (`<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/` ذخیره شده و در جدول تک‌خانه‌ای وسط‌چین درج شوند:
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 (`<details class="violet">`):** اهمیت کشف درست آدرس IP کاربر از طریق هدرهای `x-forwarded-for` و جلوگیری از مسدودسازی اشتباه سرورهای خودی.
12. **باکس هشدار Quera (`<details class="red">`):** هرگز اندپوینت‌های چت هوش مصنوعی را بدون ریت لیمیت به اینترنت باز نگذارید؛ این کار دعوت رسمی از اسکرپرها برای مصرف اعتبار شماست!
13. **باکس رضایت‌بخش Quera (`<details class="green">`):** تست پشت‌سرهم کلیک روی دکمه چت و مشاهده پاسخ مودبانه ۴۲۹ و متوقف شدن مصرف توکن‌ها.
14. **جمع‌بندی درس‌نامه:** تثبیت دیوارهای دفاعی فنی؛ ورود به ایستگاه پایانی فصل: هزینه، مالکیت فکری، حقوقی و اخلاق مهندسی در درس بعدی.
---
## ۶. معیارهای پذیرش (Acceptance Criteria for Reviewer)
- [ ] خطرات حملات DoS و تخلیه منابع مالی (Resource Exhaustion) تبیین شود.
- [ ] چرایی نیاز به Redis در معماری Serverless تشریح گردد.
- [ ] نحوه پیاده‌سازی کاربردی Upstash Redis با الگوریتم پنجره لغزان آموزش داده شود.
- [ ] پاسخ‌دهی استاندارد HTTP 429 به همراه فرانت‌اند دوستانه در متن درس گنجانده شود.