130 lines
13 KiB
Markdown
130 lines
13 KiB
Markdown
# مشخصات درسنامه: جلوگیری از حملات 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 به همراه فرانتاند دوستانه در متن درس گنجانده شود.
|