XSS چیه و چطور ازش جلوگیری کنیم
سه نوع اصلی XSS، نحوهی وقوع حمله، تاثیر واقعیش، و چرا escape خودکار React بهتنهایی کافی نیست.

XSS یا Cross-Site Scripting چیست؟
طبق تعریف OWASP، XSS زمانی اتفاق میافتد که یک اسکریپت مخرب داخل یک وبسایت معتبر و مورد اعتماد کاربر تزریق شود. چون کد از دید مرورگر «از همان سایت» میآید، مرورگر به آن اعتماد میکند و اجرایش میکند؛ نتیجه این میشود که مهاجم میتواند در مرورگر قربانی، دقیقاً همانجایی که کاربر به آن اعتماد دارد، کد دلخواهش را اجرا کند.
سه نوع اصلی XSS
Reflected XSS: ورودی مخرب مستقیم توی همان درخواست/پاسخ برمیگردد — مثلاً یک پارامتر URL که بدون escape داخل صفحهی نتیجهی جستجو چاپ میشود. قربانی باید روی یک لینک ساختهشده کلیک کند.
Stored XSS: اسکریپت مخرب توی دیتابیس، فرم نظر، یا هر جای دیگری ذخیره میشود و هر کاربری که آن صفحه را ببیند، کد اجرا میشود. خطرناکتر است چون قربانی نیازی به کلیک روی لینک خاصی ندارد.
DOM-based XSS: کاملاً سمت کلاینت اتفاق میافتد؛ جاوااسکریپت خودِ صفحه، بدون عبور از سرور، دادهی کاربر را مستقیم داخل DOM میگذارد.
چطور اتفاق میافتد
رایجترین بردارهای حمله شامل تگ <script>، attribute های event مثل <img onerror=...>، و URI های آدرسدهیشده که فیلترهای ساده را دور میزنند. نقطهی مشترک همهشان این است: دادهی ورودی کاربر، بدون escape یا اعتبارسنجی، مستقیم توی خروجی HTML چاپ میشود.
تاثیر واقعی
یک XSS موفق میتواند کوکی و سشن کاربر را بدزدد، حساب کاربری را به خطر بیندازد، محتوای صفحه را تغییر بدهد، یا کاربر را به سمت نصب بدافزار هدایت کند. روی سایتهای مالی یا فروشگاهی، همین یعنی سرقت مستقیم اطلاعات پرداخت یا اعتماد کاربر.
چطور جلوش را بگیریم
- Output Encoding: هر دادهای که از کاربر میآید و قرار است توی HTML/JS/URL نمایش داده شود باید متناسب با همان context، escape شود.
- فریمورکهای امن بهصورت پیشفرض: React بهصورت پیشفرض هر مقداری که داخل JSX بگذارید را escape میکند؛ خطر واقعی وقتی شروع میشود که از
dangerouslySetInnerHTMLاستفاده کنید — دقیقاً به همین دلیل توی این پروژه این تابع فقط برای محتوای مارکداونی که خودم بهعنوان ادمین مینویسم استفاده میشود، نه ورودی کاربر مهمان. - Content Security Policy (CSP): حتی اگر یک تزریق رد شود، CSP میتواند جلوی اجرا شدن اسکریپت از منبع غیرمجاز را بگیرد.
- اعتبارسنجی و Sanitize کردن ورودی: مخصوصاً برای HTML ای که قرار است خام رندر شود (مثل کامنتها).
جمعبندی
XSS از قدیمیترین آسیبپذیریهای وب است ولی هنوز هم رایج است، چون هر جایی که ورودی کاربر بدون escape به HTML برسد، در معرض خطر است. بهترین دفاع، اعتماد به escape خودکار فریمورک، اجتناب از رندر مستقیم HTML خام، و اضافه کردن CSP بهعنوان یک لایهی دفاعی مکمل است.



