# مشخصات درسنامه: اعتبارسنجی همهجانبه ورودیها با Zod و مقابله با حملات XSS
- **شناسه در سیلابس:** `L11.5`
- **فصل:** فصل ۱۱: امنیت و استفاده مسئولانه (Ch 11)
- **نوع محتوا:** 📘 درسنامه متنی
- **زمان تقریبی مطالعه:** ۱۸ دقیقه
- **پیشنیازهای مستقیم:** `L11.4` (احراز هویت و کنترل دسترسی)
---
## ۱. اهداف یادگیری (Learning Objectives - Bloom's Taxonomy)
دانشجو پس از مطالعهٔ این درسنامه باید بتواند:
- [ ] **درک کند (Understand):** قانون طلایی امنیت «هرگز به ورودیهای کاربر اعتماد نکن» (Never Trust User Input) را تحلیل کرده و چرایی ناکافی بودن اعتبارسنجی سمت کاربر را درک کند.
- [ ] **تحلیل/ارزیابی کند (Evaluate):** نحوه عملکرد حملات تزریق اسکریپت (Cross-Site Scripting - XSS) و تفاوت فرار خودکار کاراکترها در React را با خطرات ویژگی مرگبار `dangerouslySetInnerHTML` ارزیابی کند.
- [ ] **بهکار ببندد (Apply):** کتابخانه استاندارد **Zod** را برای اعتبارسنجی ساختارمند فرمهای پورتفولیو (فرم تماس، فرم رزرو مشاوره و فرم تنظیمات سئو) در لایه سرور پیادهسازی نماید.
- [ ] **ایجاد کند (Create):** یک اسکیمای جامع Zod بسازد که خطاهای ورودی را به زبان فارسی روان استخراج کرده و به کلاینت بازگرداند تا هم تجربه کاربری عالی و هم امنیت تضمین شود.
---
## ۲. محدوده و مرزهای محتوا (Scope & Boundaries)
### آنچه باید پوشش داده شود (In-Scope):
1. **قانون بنیادین امنیت وب: «تمام کاربران مشکوک هستند مگر خلافش ثابت شود!»:**
* چرا حتی یک فرم ساده تماس میتواند با ورودیهای چند مگابایتی یا کدهای جاوااسکریپت مخرب، سیستم را فلج کند؟
2. **کالبدشکافی اعتبارسنجی دوگانه (Dual-layer Validation):**
* اعتبارسنجی فرانتاند: صرفاً برای تجربه کاربری نرم (UX) و جلوگیری از کلیکهای بیهوده.
* اعتبارسنجی بکاند (سرور اکشن): سد نفوذناپذیر واقعی؛ چون هر کسی میتواند بدون باز کردن سایت، با دستور cURL دیتا بفرستد.
3. **معرفی کتابخانه مقتدر Zod در TypeScript:**
* تعریف اسکیما (Schema) برای فرم تماس:
```typescript
import { z } from "zod";
export const ContactSchema = z.object({
name: z.string().min(2, "نام باید حداقل ۲ حرف باشد").max(50),
email: z.string().email("فرمت ایمیل نامعتبر است"),
phone: z.string().regex(/^09\d{9}$/, "شماره موبایل باید با ۰۹ شروع شده و ۱۱ رقم باشد"),
message: z.string().min(10, "پیام باید حداقل ۱۰ کاراکتر باشد").max(1000),
});
```
* استفاده از `safeParse()` در Server Action برای مدیریت تمیز خطاها بدون کرش کردن سرور.
4. **کالبدشکافی حملات XSS (Cross-Site Scripting):**
* حمله چیست؟ نفوذگر در فیلد پیام مینویسد: ``.
* اگر این پیام در پنل ادمین بدون ضدعفونی رندر شود، توکن ادمین در یک میلیثانیه سرقت میشود!
5. **سپر دفاعی React در برابر XSS:**
* چگونه React به صورت خودکار کاراکترهای خطرناک مانند `<` و `>` را به کاراکترهای بیخطر متنی (Entity Escaping) تبدیل میکند.
* چرا ویژگی `dangerouslySetInnerHTML` نام «خطرناک» را یدک میکشد و چه زمانی باید از `DOMPurify` استفاده کرد.
6. **دستورات چندسکویی برای نصب Zod:**
* نصب در منوهای کشویی ویندوز، مک و لینوکس: `npm install zod`.
7. **کالاوتهای آموزشی و هشدار کوئرا:**
* کالاوت بنفش (``): استخراج خودکار تایپهای تایپاسکریپت از اسکیما با `z.infer` (همگامسازی ابدی کد و اعتبارسنجی).
* کالاوت سبز (``): اعتبارسنجی یکپارچه با نمایش پیامهای خطای فارسی درست زیر فیلدها.
* کالاوت قرمز (``): هرگز متنی را که کاربر فرستاده مستقیماً داخل تابع `eval()` یا ویژگی `dangerouslySetInnerHTML` قرار ندهید.
### آنچه نباید وارد آن شویم (Out-of-Scope):
- مباحث پیچیده Content Security Policy (CSP) در لایه وبسرورهای Nginx.
- اعتبارسنجی فرمت فایلهای باینری و تصاویر (در درس بعدی، ۱۱.۶، به صورت عمیق بررسی میشود).
---
## ۳. مفاهیم کلیدی و کلمات تخصصی (Key Concepts & Terms)
| اصطلاح انگلیسی | معادل فارسی مصوب | توضیح یکخطی ساده |
| :--- | :--- | :--- |
| Input Validation | اعتبارسنجی ورودیها | سنجش انطباق دادههای ارسالی کاربر با فرمت، طول و قوانین امنیتی از پیش تعیینشده |
| XSS (Cross-Site Scripting) | اسکریپتنویسی بینسایتی | حمله سایبری ناشی از تزریق کدهای جاوااسکریپت خرابکار به صفحات و اجرای آن در مرورگر سایر کاربران |
| Zod | کتابخانه اسکیمای زد | ابزار محبوب ساخت و اعتبارسنجی تایپسیف اسکیمای دادهها در محیط تایپاسکریپت |
| Sanitization | ضدعفونی دادهها | پاکسازی تگها و کاراکترهای بالقوه خطرناک از متن ورودی پیش از ذخیره در دیتابیس |
| Character Escaping | فرار کاراکترها | تبدیل خودکار نمادهای معنادار HTML (مانند < و >) به کدهای نمایشی متنی برای خنثیسازی اسکریپتها |
| Stored XSS | اسکریپتنویسی ماندگار | خطرناکترین نوع XSS که در آن کد مخرب در دیتابیس ذخیره شده و برای تمام بازدیدکنندگان بعدی اجرا میشود |
---
## ۴. جایگاههای تصاویر و نمودارها (Visual & Diagram Placeholders)
> **راهنمای ایجنت نویسنده:** تمام تصاویر باید در پوشهٔ `images/` ذخیره شده و در جدول تکخانهای وسطچین درج شوند:
1. **تصویر کاور درس:** `images/cover.png`
* **موضوع:** فیلتر تصفیه نئونی درخشان که ورودیهای فرم را اسکن کرده و نمادهای اسکریپت و بدافزار قرمز را به کلمات سبز و ایمن تبدیل میکند.
2. **سازوکار حمله Stored XSS در پنل ادمین:** `images/stored-xss-attack-flow.png`
* **موضوع:** اینفوگرافیک حمله: نفوذگر کد جاوااسکریپت تزریق میکند $\rightarrow$ در دیتابیس ذخیره میشود $\rightarrow$ ادمین پیام را باز میکند $\rightarrow$ اسکریپت در مرورگر ادمین اجرا شده و کوکی را سرقت میکند.
3. **معماری اعتبارسنجی لایه سرور با Zod:** `images/zod-validation-flow.png`
* **موضوع:** فلوچارت: دریافت دیتا $\rightarrow$ ارزیابی با اسکیما $\rightarrow$ در صورت خطا: بازگشت پیام فارسی $\rightarrow$ در صورت تایید: اجرای اکشن و ذخیره امن.
4. **نمایش پیامهای خطای اعتبارسنجی فارسی در فرم:** `images/persian-zod-error-feedback-ui.png`
* **موضوع:** اسکرینشات از فرم تماس با حاشیههای قرمز زیبا و هشدارهای دقیق فارسی زیر هر اینپوت.
---
## ۵. بخشبندی و ساختار محتوایی پیشنهادی درسنامه (`README.md`)
1. **تیتر اصلی:** `# اعتبارسنجی همهجانبه ورودیها با Zod و مقابله با حملات XSS`
2. **مقدمه:** اگر به آب لولهکشی شهر بدون تصفیهخانه اعتماد ندارید، چرا باید به ورودیهای کیبورد غریبهها در اینترنت اعتماد کنید؟
3. **جدول کاور درس**
4. **استعاره گیت بازرسی فرودگاه:**
* بازرسی اشعه ایکس چمدانها قبل از ورود به هواپیما؛ حذف سلاحها و مواد اشتعالزا (کدهای مخرب).
5. **کالبدشکافی یک حمله واقعی XSS در پروژه پورتفولیو:**
* نوشتن تگ `