راهنمای جامع حمله XSS: انواع، روشها و راههای مقابله
در دنیای امنیت وب، یکی از متداولترین و در عین حال خطرناکترین آسیبپذیریها، حمله XSS است. این نوع آسیبپذیری به مهاجم اجازه میدهد تا کد جاوااسکریپت دلخواه خود را در مرورگر قربانی اجرا کند
خلاصه تخصصی مقاله
در دنیای امنیت وب، یکی از متداولترین و در عین حال خطرناکترین آسیبپذیریها، حمله XSS است. این نوع آسیبپذیری به مهاجم اجازه میدهد تا کد جاوااسکریپت دلخواه خود را در مرورگر قربانی اجرا کند
موضوعات اصلی: مرورگر، اجرا، HTML، XSS، جاوااسکریپت، کاربر
بخش ۱: مقدمه – آشنایی با XSS و اهمیت آن
در دنیای امنیت وب، یکی از متداولترین و در عین حال خطرناکترین آسیبپذیریها، Cross-Site Scripting (XSS) است. این نوع آسیبپذیری به مهاجم اجازه میدهد تا کد جاوااسکریپت دلخواه خود را در مرورگر قربانی اجرا کند — کدی که میتواند به سرقت کوکیها، انجام درخواستهای جعلی، یا حتی تسلط کامل بر حساب کاربری قربانی منجر شود.
XSS در اصل زمانی رخ میدهد که
دادهای که کاربر وارد میکند، بدون پاکسازی یا اعتبارسنجی مناسب، مستقیماً در خروجی HTML یا جاوااسکریپت قرار گیرد.
به بیان سادهتر
اگر کاربر بتواند متنی در سایت وارد کند که بعداً در مرورگر سایر کاربران به عنوان کد اجرا شود، سایت شما آسیبپذیر است.
مثال ساده
فرض کنید سایتی ورودی کاربر را مستقیماً در صفحه چاپ میکند
اگر کاربر این URL را باز کند
مرورگر این کد را به عنوان جاوااسکریپت اجرا کرده و پیام هشدار را نمایش میدهد. این سادهترین نوع Reflected XSS است.
مطالعه بیشترآسیبپذیری XSS و راه های جلوگیری از آن
بخش ۲: مکانیزم کلی حملات XSS
برای درک نحوهی کار XSS، باید بدانیم مرورگر هنگام لود صفحه چه مراحلی را طی میکند
1. تجزیهی HTML (HTML Parsing) مرورگر تگها، attributeها و متنها را میخواند و ساختار DOM را میسازد.
2. تجزیهی جاوااسکریپت (JS Parsing) هر متنی که درونتفسیر میکند.
یا با استفاده از کدهای Unicode
مرورگر بعضی کاراکترهای غیرقابلچاپ مثل \0 را نادیده میگیرد، اما فیلتر ممکن است آن را تشخیص ندهد.
۴. استفاده از Contextهای مختلف (HTML، Attribute، JS، CSS)
درک "context" کلید دور زدن فیلترهاست. هر بخش از HTML ممکن است در یک بستر (context) خاص قرار بگیرد
- داخل HTML معمولی
- داخل attribute
- داخل JavaScript
- داخل CSS
اگر بدانیم دادهی ما دقیقاً در کجای صفحه قرار میگیرد، میتوانیم ساختار خروجی را بشکنیم و کنترل را به دست بگیریم.
ورودی درون رشتهی جاوااسکریپت قرار میگیرد
اگر مهاجم وارد کند
در خروجی داریم
رشتهی اصلی بسته میشود و دستور alert() اجرا میشود.
۵. استفاده از HTML Encoding ناقص
اگر سیستم تنها برخی کاراکترها مثل < و > را encode کند،مهاجم میتواند از روشهای غیرمستقیم برای بازسازی HTML استفاده کند. ورودی زیر گاهی از فیلتر عبور میکند
مرورگر هنگام تفسیر HTML، تگ اول <>
جمعبندی بخش ۵
دور زدن فیلترها فقط به معنای خلاقیت در کدنویسی نیست؛ بلکه نیاز به شناخت دقیق نحوهی پردازش ورودی در مرورگر و سرور دارد. یک فیلتر ممکن است از دید توسعهدهنده کافی باشد، اما مرورگر گاهی رفتار متفاوتی دارد و باعث میشود کد مهاجم اجرا شود.
بخش ۶: راهکارهای دفاعی و Best Practices در برابر XSS
مقابله با XSS به معنای جلوگیری از اجرای کد جاوااسکریپت در مرورگر قربانی است. اما چون مرورگر باید JavaScript را اجرا کند، مسئله این است که چه دادههایی مجاز به اجرا هستند و چه دادههایی نه. در ادامه گامبهگام بهترین روشهای پیشگیری از XSS را بررسی میکنیم.
۱. اعتبارسنجی (Validation) در ورودیها
اولین خط دفاع همیشه بررسی ورودی کاربر است.هر دادهای که از کاربر دریافت میشود چه از فرم، چه از URL و چه از Headerها،باید بررسی شود تا فقط شامل مقادیر مورد انتظار باشد.
روش درست
- برای دادههای متنی، فقط کاراکترهای مجاز را بپذیرید (مثلاً حروف، اعداد، فاصله و علائم خاص مشخص).
- از Regex برای محدود کردن ساختار ورودی استفاده کنید.
- برای فیلدهایی مثل ایمیل یا شماره ، از فیلدهای HTML5 (type="email", type="number") بهره ببرید.
Validation به تنهایی کافی نیست. حتی اگر ورودی معتبر باشد، هنوز ممکن است در خروجی در معرض تزریق قرار گیرد.
2. Sanitization و Encoding در خروجیها
کلید اصلی دفاع در برابر XSS، خنثی کردن کدهای HTML و جاوااسکریپت هنگام خروجی دادن دادههاست. به عبارت دیگر
قبل از اینکه دادهی کاربر در صفحه چاپ شود، باید از حالت “قابل اجرا” خارج شود.
3. استفاده از Content Security Policy (CSP)
CSP یکی از قویترین مکانیزمهای دفاعی مرورگر است.با تعریف CSP میتوانید مشخص کنید چه منابعی (اسکریپت، استایل، تصویر و غیره) مجاز به بارگذاری هستند.
این دستور به مرورگر میگوید
- فقط اسکریپتهایی که از دامنه خود سایت یا CDN مورد اعتماد میآیند اجرا شوند.
- هیچ فایل Flash یا Object خارجی مجاز نیست.
حتی اگر مهاجم موفق به تزریق
برای ارزیابی پایداری، امنیت و نگهداری این زیرساخت، راهنمای پشتیبانی شبکه را نیز مطالعه کنید.