با گسترش روز افزون اپلیکیشنهای تحت وب و استفاده کاربران از خدمات آنلاین، امنیت وبسایتها به یکی از مهمترین دغدغههای توسعهدهندگان تبدیل شده است. یکی از شایعترین و خطرناکترین تهدیدهایی که امنیت وب را به چالش میکشد، حمله Cross-Site Scripting یا به اختصار XSS است. این نوع حمله میتواند منجر به سرقت اطلاعات کاربران، تخریب رابط کاربری و حتی از دست رفتن اعتبار کسب و کار شود. در این مقاله به صورت جامع با مکانیزم، انواع، روشهای شناسایی و پیشگیری از حملات XSS آشنا خواهید شد.

آنچه در این مقاله میخوانید
- حمله اسکریپت متقابل (XSS) چیست؟
- حمله XSS چگونه کار میکند؟
- اثبات مفهوم حمله XSS
- انواع حملات XSS
- XSS برای چه کارهایی استفاده میشود؟
- تأثیر آسیبپذیریهای XSS
- چگونه آسیبپذیریهای XSS را پیدا و تست کنیم؟
- سیاست امنیت محتوایی (Content Security Policy – CSP)
- تزریق نشانهگذاری رهاشده (Dangling Markup Injection)
- چگونه از حملات XSS جلوگیری کنیم؟
- نتیجهگیری
- سؤالات متداول
حمله اسکریپت متقابل (XSS) چیست؟
حمله اسکریپت متقابل یا Cross-Site Scripting (که به نام XSS نیز شناخته میشود) یک آسیبپذیری امنیتی وب است که به مهاجم اجازه میدهد تعاملاتی که کاربران با یک برنامه آسیبپذیر دارند را به خطر بیندازد. این نوع حمله به مهاجم امکان دور زدن سیاست مبدأ یکسان را میدهد – سیاستی که برای جداسازی وبسایتهای مختلف از یکدیگر طراحی شده است.
آسیبپذیریهای اسکریپت متقابل معمولاً به مهاجم اجازه میدهند تا خود را به جای کاربر قربانی جا بزند و هر عملی که کاربر قادر به انجام آن است را اجرا کند و به تمام دادههای کاربر دسترسی پیدا کند. اگر کاربر قربانی دسترسیهای ویژهای در برنامه داشته باشد، مهاجم ممکن است بتواند کنترل کاملی بر تمام عملکردها و دادههای برنامه به دست آورد.
حمله XSS چگونه کار میکند؟
حمله اسکریپت متقابل از طریق دستکاری یک وبسایت آسیبپذیر عمل میکند تا کدهای جاوااسکریپت مخرب را برای کاربران بازگرداند. زمانی که این کد مخرب در مرورگر قربانی اجرا میشود، مهاجم میتواند تعامل آنها با برنامه را به طور کامل به خطر بیندازد.
به عبارت سادهتر، مهاجم کد مخربی را به داخل وبسایت تزریق میکند و هنگامی که کاربران معمولی آن صفحه را بازدید میکنند، این کد در مرورگر آنها اجرا شده و اطلاعات حساس آنها را سرقت میکند یا اعمال غیر مجازی را از طرف آنها انجام میدهد.
اثبات مفهوم حمله XSS
برای اثبات وجود آسیبپذیری XSS معمولاً از تزریق کدی مثل alert() در مرورگر استفاده میشود، چون ساده و بیخطر است. اما از نسخه ۹۲ به بعد مرورگر Chrome اجازه اجرای alert() در iframe های بیندامنه را نمیدهد. به همین دلیل پیشنهاد میشود از تابعی مثل print() به عنوان جایگزین استفاده شود.
انواع حملات XSS

حملات XSS به سه دسته اصلی تقسیم میشوند:
- انعکاسی (Reflected): کد مخرب از طریق لینک یا فرم به سرور ارسال شده و بلافاصله در پاسخ نمایش داده میشود.
- ذخیرهشده (Stored): کد مخرب در دیتابیس سایت ذخیره شده و بعداً برای سایر کاربران اجرا میشود، مثل بخش نظرات.
- مبتنی بر DOM: آسیبپذیری در کد جاوا اسکریپت سمت کاربر است و دادهها مستقیماً در مرورگر دستکاری میشوند، بدون دخالت سرور.
XSS انعکاسی (Reflected cross-site scripting)
XSS انعکاسی سادهترین نوع از حملات XSS است. این حمله زمانی رخ میدهد که دادهای از کاربر (مثلاً از طریق URL) به برنامه ارسال شود و همان داده، بدون فیلتر مناسب، در پاسخ HTML نمایش داده شود. مهاجم میتواند با ساختن یک لینک آلوده، کدی مخرب را به کاربر قربانی تزریق کند. با کلیک روی لینک، این کد در مرورگر کاربر اجرا میشود و میتواند اطلاعات او را سرقت کرده یا اقدامات مخرب دیگری انجام دهد.
در زیر نمونهای از لینکی را مشاهده میکنید که میتواند دستخوش تغییر توسط مهاجم شود:
https://insecure-website.com/status?message=All+is+well.
<p>Status: All is well.</p>
برنامه هیچگونه پردازش اضافی روی دادهها انجام نمیدهد، بنابراین مهاجم به راحتی میتواند حملهای مانند زیر طراحی کند:
https://insecure-website.com/status?message=<script>/*+Bad+stuff+here...+*/</script>
<p>Status: <script>/* Bad stuff here... */</script></p>
اگر کاربر از آدرسی که مهاجم ساخته بازدید کند، اسکریپت مهاجم در مرورگر کاربر اجرا میشود، آن هم در قالب نشست (session) کاربر با برنامه. در این حالت، اسکریپت میتواند هر عملی را انجام دهد و به هر دادهای که کاربر به آن دسترسی دارد، دست پیدا کند.
XSS ذخیره شده (Stored cross-site scripting)
Stored XSS که با نامهای XSS پایدار یا XSS از نوع دوم نیز شناخته میشود، زمانی رخ میدهد که یک برنامه، دادهای را از یک منبع غیر قابل اعتماد دریافت میکند و آن داده را بعداً در پاسخهای HTTP خود، به شکلی ناامن قرار میدهد.
این دادهها ممکن است از طریق درخواستهای HTTP به برنامه ارسال شده باشند؛ برای مثال، نظرات کاربران در یک پست وبلاگ، نامهای کاربری در یک اتاق گفتوگو، یا اطلاعات تماس در یک سفارش مشتری. در مواردی دیگر، دادهها ممکن است از منابع غیر قابل اعتماد دیگری وارد شوند؛ مثلاً یک اپلیکیشن وبمیل که پیامهای دریافتی از طریق SMTP را نمایش میدهد، یک اپلیکیشن بازاریابی که پستهای شبکههای اجتماعی را نشان میدهد، یا یک ابزار مانیتورینگ شبکه که دادههای بستههای شبکه را نمایش میدهد.
به عنوان مثالی ساده از XSS ذخیره شده، یک اپلیکیشن تابلو اعلانات (message board) را در نظر بگیرید که به کاربران اجازه میدهد پیام ارسال کنند و این پیامها برای دیگر کاربران نمایش داده میشود:
<p>Hello, this is my message!</p>
برنامه هیچ پردازش یا فیلتری روی داده انجام نمیدهد، بنابراین مهاجم به راحتی میتواند پیامی ارسال کند که سایر کاربران را مورد حمله قرار دهد:
<p><script>/* Bad stuff here... */</script></p>
در نتیجه، هر کاربری که این پیام را ببیند، اسکریپت مخرب در مرورگر او اجرا خواهد شد.
XSS مبتنی بر DOM (DOM-based cross-site scripting)
XSS مبتنی بر DOM (یا بهاختصار DOM XSS) زمانی رخ میدهد که یک برنامهی وب دارای کد JavaScript در سمت کاربر (client-side) باشد که دادهای را از یک منبع غیرقابل اعتماد دریافت کرده و آن را به شکلی نا امن در DOM (ساختار HTML صفحه) وارد کند.
در مثال زیر، یک برنامه از جاوا اسکریپت استفاده میکند تا مقدار یک فیلد ورودی را بخواند و آن را در یک عنصر HTML قرار دهد:
var search = document.getElementById('search').value;
var results = document.getElementById('results');
results.innerHTML = 'You searched for: ' + search;
اگر مهاجم بتواند مقدار فیلد ورودی را کنترل کند، به راحتی میتواند مقدار مخربی وارد کند که باعث اجرای اسکریپت دلخواهش شود:
You searched for: <img src=1 onerror='/* Bad stuff here... */'>
در حالت معمول، مقدار این فیلد ورودی میتواند از بخشی از درخواست HTTP، مانند پارامترهای query string در URL، گرفته شود. در این صورت، مهاجم میتواند URL مخربی بسازد که مانند reflected XSS باعث اجرای اسکریپت در مرورگر قربانی شود.
XSS برای چه کارهایی استفاده میشود؟
مهاجمی که یک آسیبپذیری XSS (Cross-site Scripting) را مورد سوءاستفاده قرار میدهد، معمولاً میتواند کارهای زیر را انجام دهد:
- جعل هویت کاربر قربانی و وانمود کردن به جای او.
- انجام هر کاری که کاربر قربانی مجاز به انجام آن است (مثلاً ارسال فرم، خرید محصول، یا تغییر تنظیمات حساب).
- دسترسی به هر دادهای که کاربر قربانی میتواند به آن دسترسی داشته باشد (مانند اطلاعات شخصی یا سوابق حساب).
- دزدیدن اطلاعات ورود کاربر مثل نام کاربری و رمز عبور.
- تغییر ظاهری سایت به صورت مجازی (Defacement) و ایجاد جلوههای گمراهکننده برای سایر کاربران.
- تزریق قابلیتهای مخرب (مثل تروجان) به درون سایت، به گونهای که سایر کاربران هنگام بازدید از سایت، قربانی شوند.
به طور خلاصه، XSS میتواند به مهاجم اجازه دهد کنترل کامل یک نشست کاربری را در دست گیرد یا سایت را به بستری برای حمله به دیگران تبدیل کند.
تأثیر آسیبپذیریهای XSS
تأثیر واقعی یک حمله Cross-Site Scripting معمولاً به ماهیت برنامه، نوع دادهها و سطح دسترسی کاربر قربانی بستگی دارد. برای نمونه:
- در یک سایت اطلاعرسانی ساده (brochureware) که تمام کاربران ناشناس هستند و همه اطلاعات به صورت عمومی در دسترس است، تأثیر XSS معمولاً حداقلی خواهد بود.
- در یک برنامهای که دادههای حساس مانند تراکنشهای بانکی، ایمیلها یا سوابق پزشکی را نگهداری میکند، تأثیر حمله XSS معمولاً شدید خواهد بود.
- اگر کاربر قربانی دارای سطح دسترسی بالا در برنامه باشد (مثلاً مدیر سیستم یا اپراتور ارشد)، تأثیر حمله XSS میتواند بحرانی باشد. در این حالت، مهاجم ممکن است کنترل کامل برنامه آسیبپذیر را بهدست گرفته و به همه کاربران و دادههای آنها دسترسی پیدا کند.
به طور کلی، هرچه داده حساستر و دسترسی کاربر قربانی بیشتر باشد، خطر XSS نیز بیشتر و جدیتر خواهد بود.
چگونه آسیبپذیریهای XSS را پیدا و تست کنیم؟
اکثر آسیبپذیریهای XSS را میتوان به سرعت و با دقت بالا با استفاده از اسکنر آسیبپذیری وب Burp Suite شناسایی کرد.
✅ روش تست دستی برای XSS از نوع Reflected و Stored:
- وارد کردن یک ورودی ساده و یکتا (مثلاً یک رشته کوتاه شامل حروف و اعداد مثل
xss123) در تمام نقاط ورودی برنامه (مثل فیلدهای فرم، پارامترهای URL، کوکیها و …). - بررسی پاسخهای HTTP برای پیدا کردن مکانهایی که این ورودی نمایش داده شده است.
- تست هر مکان به صورت جداگانه برای اینکه ببینیم آیا میتوان با یک ورودی دستکاریشده، اجرای JavaScript دلخواه را ایجاد کرد یا خیر.
- با این بررسی، میتوان نوع زمینه (context) آسیبپذیری را فهمید و Payload مناسب را انتخاب کرد.
✅ روش تست دستی برای XSS مبتنی بر DOM (DOM-based XSS):
- وارد کردن یک ورودی یکتا در پارامترهای URL (مانند
?q=test123). - استفاده از ابزار توسعهدهنده مرورگر (Developer Tools) برای جستوجوی این مقدار در ساختار DOM صفحه.
- بررسی اینکه آیا میتوان آن نقطه را با یک Payload خاص مورد سوء استفاده قرار داد یا نه.
⚠️ سایر انواع XSS مبتنی بر DOM که از منابعی غیر از URL استفاده میکنند (مثلاً
document.cookie) یا در توابع غیر HTMLی مانندsetTimeoutاستفاده میشوند، به مراتب سختتر قابل کشف هستند.
در این موارد، بررسی دستی کدهای JavaScript تنها راه ممکن است، که ممکن است بسیار زمانبر و پیچیده باشد.
✅ راهکار حرفهای:
Burp Suite با استفاده از ترکیب تحلیل استاتیک (کدخوانی) و داینامیک (تست اجرا در مرورگر)، میتواند به صورت خودکار و قابل اعتماد آسیبپذیریهای XSS، به ویژه از نوع DOM-based را شناسایی کند. این ابزار یکی از بهترین انتخابها برای امنیت وباپلیکیشنهاست.
سیاست امنیت محتوایی (Content Security Policy – CSP)
CSP یک مکانیزم امنیتی در مرورگرهاست که با هدف کاهش خطر حملات XSS و برخی آسیبپذیریهای دیگر طراحی شده است. این سیاست به توسعهدهندگان اجازه میدهد تعیین کنند چه منابعی (اسکریپتها، استایلها، تصاویر و …) قابل بارگذاری هستند.
اگر یک برنامه وب از CSP استفاده کند ولی همچنان رفتارهایی مشابه XSS داشته باشد، CSP ممکن است مانع از سوء استفاده مهاجم شود یا آن را دشوارتر کند. با این حال، در بسیاری از موارد، مهاجمان میتوانند راههایی برای دور زدن CSP پیدا کنند و همچنان آسیبپذیری را بهرهبرداری کنند.
تزریق نشانهگذاری رهاشده (Dangling Markup Injection)
Dangling Markup Injection یک تکنیک خاص است که معمولاً در شرایطی استفاده میشود که اجرای کامل XSS امکانپذیر نیست؛ مثلاً وقتی که فیلترهای ورودی یا دفاعهایی مانند CSP مانع اجرای اسکریپت میشوند.
در این روش، مهاجم از طریق وارد کردن بخشهای ناقص از کد HTML (مانند یک تگ باز اما بدون بسته شدن) تلاش میکند تا دادههایی را از دامنهای دیگر به سرقت ببرد.
این روش ممکن است برای سرقت اطلاعات حساس قابل مشاهده توسط کاربران دیگر مورد استفاده قرار گیرد؛ برای مثال:
- توکنهای CSRF
- آدرسهای ایمیل
- اطلاعات شناسایی کاربر
اگر چه این تکنیک نسبت به XSS کامل قدرت کمتری دارد، اما در برخی شرایط میتواند به مهاجم اجازه دهد بدون نیاز به اجرای جاوا اسکریپت، اقدام به حمله و سوء استفاده از اطلاعات کند.
چگونه از حملات XSS جلوگیری کنیم؟
جلوگیری از حملات Cross-Site Scripting (XSS) در برخی موارد ساده است، اما در برنامههای پیچیده که دادههای کنترلشده توسط کاربر را در بخشهای مختلف مدیریت میکنند، میتواند چالشبرانگیز باشد.
بهطور کلی، جلوگیری مؤثر از XSS نیازمند ترکیبی از چندین اقدام امنیتی است:
۱- فیلتر ورودی در هنگام ورود (Filter input on arrival)
در همان لحظهای که داده از کاربر دریافت میشود:
- فقط دادههای مجاز و مورد انتظار را بپذیرید.
- از فیلترهای سختگیرانه استفاده کنید (مثلاً فقط اعداد، یا فقط حروف خاص مجاز).
- اما دقت کنید: فیلتر ورودی بهتنهایی برای جلوگیری از XSS کافی نیست.
۲- کدگذاری خروجی هنگام نمایش (Encode data on output)
در هر جایی که دادههای کنترلشده توسط کاربر در پاسخهای HTML نشان داده میشود:
- خروجی را کدگذاری (escape) کنید تا مرورگر آن را به عنوان محتوای فعال (مثل جاوااسکریپت) تفسیر نکند.
- نوع کدگذاری باید متناسب با محل استفاده باشد:
- در HTML → از HTML encoding استفاده کنید.
- در URL → از URL encoding.
- در جاوااسکریپت → از JavaScript encoding.
- در CSS → از CSS encoding.
۳- استفاده از هدرهای مناسب در پاسخ HTTP
برای صفحاتی که قرار نیست HTML یا جاوااسکریپت داشته باشند:
- از هدر
Content-Typeصحیح (مثلاًapplication/json) استفاده کنید. - هدر
X-Content-Type-Options: nosniffرا اضافه کنید تا مرورگر اجازهی تشخیص نوع فایل ندهد.
۴- استفاده از سیاست امنیتی محتوا (Content Security Policy – CSP)
بهعنوان آخرین خط دفاعی:
- از CSP استفاده کنید تا در صورت وجود آسیبپذیری XSS، امکان اجرای کدهای مخرب کاهش یابد.
- مثلاً فقط اجازه اجرای اسکریپتها از دامنههای خاص را بدهید، یا استفاده از
unsafe-inlineرا ممنوع کنید.
نتیجهگیری
حملات XSS از جمله تهدیدات جدی در امنیت وب هستند که میتوانند منجر به سرقت اطلاعات، جعل هویت و اجرای عملیات مخرب شوند. شدت این حملات به نوع برنامه و سطح دسترسی کاربر قربانی بستگی دارد و در سه نوع Reflected، Stored و DOM-based ظاهر میشوند.
برای جلوگیری از XSS، باید ورودیها را فیلتر، خروجیها را براساس موقعیت کدگذاری کرد، از هدرهای امنیتی و سیاستهای CSP استفاده نمود. ترکیب این روشها همراه با ابزارهایی مانند Burp Suite میتواند به شناسایی و کاهش این آسیبپذیریها کمک کند.

سؤالات متداول
بله، XSS یکی از رایجترین آسیبپذیریهای امنیت وب است و در بسیاری از برنامهها دیده میشود.
آمار دقیقی از حملات واقعی XSS وجود ندارد، اما به نظر میرسد کمتر از برخی آسیبپذیریهای دیگر مورد بهرهبرداری قرار میگیرند.
در XSS، مهاجم باعث میشود سایت کد جاوا اسکریپت مخرب اجرا کند.
در CSRF، مهاجم کاربر را وادار میکند اقدامی ناخواسته در سایت انجام دهد (مثلاً ارسال فرم).
XSS یک آسیبپذیری سمت کلاینت است که کاربران دیگر را هدف قرار میدهد.
SQL Injection یک آسیبپذیری سمت سرور است که پایگاه داده را هدف میگیرد.
ورودیها را با لیست سفید (whitelist) فیلتر کنید.
خروجیها را با htmlentities() و ENT_QUOTES برای HTML، یا کدگذاری یونیکد برای JavaScript امن کنید.
منبع: Postswigger
