حملات XSS چیست؟ + انواع آن و راه پیشگیری

نویسنده:

دسته:

تاریخ انتشار:


هکرها از روش‌های مختلفی برای دزدیدن اطلاعات کاربران استفاده می‌کنند. یکی از این روش‌ها استفاده از حمله XSS است. در این روش اسکریپت‌های مخرب به وب‌سایت‌های معتبر تزریق می‌گردد و این گونه مهاجمان می‌توانند کدها را در مرورگر کاربران اجرا کنند و اطلاعات آنان را بدزدند. در این مقاله می‌خواهیم انواع حملات XSS را بررسی کنیم و روش‌های مقابله با آن‌ها را توضیح دهیم. با ادامه این مطلب ما را همراهی کنید.

منظور از حملات XSS چیست؟

در حملات اسکریپت نویسی بین سایتی یا Cross-Site Scripting (XSS) attacks کدها یا اسکریپت‌های مخرب از طریق وب‌سایت‌ها یا برنامه‌های تحت وب بی‌خطر و قابل اعتماد به دستگاه کاربران انتقال پیدا می‌کنند. در واقع مهاجمان از صفحات وب و برنامه‌های تحت وب برای انتقال این کدهای مخرب استفاده می‌کنند. این گونه تعامل کاربران با آن سایت و... را تحت تأثیر قرار می‌دهند. 

نکته‌ای که وجود دارد این است که سایت و... میزبان کد مخرب دچار مشکل نمی‌شود، بلکه در این میان صرفاً کاربران هستند که قربانی هستند. اسکریپت‌های مخرب در مرورگر وب قربانی اجرا می‌شوند و به نظر می‌رسند که بخشی از وب‌سایت قانونی هستند. آسیب‌پذیری‌های XSS گسترده هستند و اغلب زمانی رخ می‌دهند که یک برنامه تحت وب ورودی کاربر را بدون اعتبارسنجی یا رمزگذاری مناسب پردازش می‌کند.

منظور از حملات XSS چیست؟

تاریخچه XSS

داستان حملات XSS به اواخر سال ۱۹۹۹ با گروه کوچکی از مهندسان امنیتی مایکروسافت آغاز شد. مرکز پاسخگویی امنیتی مایکروسافت و تیم امنیتی اینترنت اکسپلورر مایکروسافت در این زمان داده‌هایی را در مورد چندین آسیب‌پذیری وب‌سایت جمع‌آوری کرده بودند. 

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

XSS چگونه کار می‌کند؟

همان طور که پیش‌تر اشاره کردیم در حملات XSS یک وب‌سایت آسیب‌پذیر دست‌کاری می‌شود و این گونه اسکریپت مخرب به کاربران منتقل می‌گردد. در واقع، هکر اسکریپت‌های مخرب را به کد یک برنامه یا وب‌سایت معتبر تزریق (Code injection) می‌کند. وقتی کاربر وب‌سایت مدنظر را لود می‌کند، کد مخرب در مرورگر او اجرا می‌شود. مراحل انجام یک حمله XSS معمولاً شامل موارد زیر است:

  • تزریق اسکریپت مخرب: یک مهاجم یا هکر، یک نقطه ضعف را در یک برنامه تحت وب شناسایی می‌کند که به او اجازه می‌دهد کد مخرب (معمولاً اسکریپت‌های سمت کلاینت) را در صفحات وب وارد کند. این کار اغلب از طریق فیلدهای ورودی انجام می‌شود که در آن‌ها داده‌های کاربر قبل از نمایش یا ذخیره، به درستی اعتبارسنجی یا پاک‌سازی نمی‌شوند.
  • بازگرداندن کد مخرب از طریق وب‌سایت: وب‌سایت دستکاری‌شده و آسیب‌پذیر، این کد مخرب را همانند محتوایی قانونی به کاربران دیگر بازمی‌گرداند.
  • اجرا در مرورگر کاربر: هنگامی که مرورگر کاربر صفحه آلوده را بارگذاری می‌کند، اسکریپت مخرب اجرا می‌شود؛ زیرا به نظر می‌رسد از یک سایت معتبر سرچشمه گرفته است. این اسکریپت با امتیازات وب‌سایت معتبر اجرا می‌شود و به همین دلیل اجازه دسترسی و دست‌کاری اطلاعات را پیدا می‌کند.

مهاجمان از تکنیک‌هایی مانند ایجاد لینک‌های مخرب برای تزریق اسکریپت‌های ناخواسته به صفحات وب پویا استفاده می‌کنند. اسکریپت‌های مخرب اغلب با جاوا اسکریپت نوشته می‌شوند.

هکرها چگونه از XSS برای ایجاد آسیب استفاده می‌کنند؟

مهاجمان می‌توانند از انواع آسیب پذیری XSS برای ایجاد اشکال مختلفی از آسیب از جمله موارد زیر استفاده کنند:

  • سرقت اطلاعات حساس: کد XSS مخرب می‌تواند به هر اطلاعاتی که از طریق مرورگر کاربر قابل دسترس است، از جمله کوکی‌ها، اطلاعات ورود و سایر داده‌های حساس، دسترسی پیدا کرده و آنها را دست‌کاری کند. این اطلاعات سرقت شده را می‌توان برای دسترسی غیرمجاز به حساب‌ها استفاده کرد.
  • تغییر ظاهر وب‌سایت: اسکریپت‌های مخرب می‌توانند محتوا یا ظاهر یک وب‌سایت قانونی را تغییر دهند.
  • گسترش بدافزار: از آنجایی که XSS راهی برای ارسال کد یا فایل مخرب است، به طور بالقوه منجر به آلودگی دستگاه و سیستم می‌شود. 
  • حملات فیشینگ: هکرها می‌توانند فرم‌های ورود جعلی یا پاپ‌هایی که به نظر قانونی می‌رسند، ایجاد کنند تا کاربران فریب بخورند و اطلاعات خود را وارد کنند.
  • ایجاد ضرر مالی: حملات XSS موفق می‌توانند از طریق تراکنش‌های غیرمجاز یا نقض داده‌ها، منجر به ضررهای مالی قابل‌توجهی برای افراد و سازمان‌ها شوند.
  • کاهش عملکرد وب‌سایت: هکرها می‌توانند از XSS برای کاهش عملکرد وب‌سایت رقیب استفاده کند.
  • دسترسی به صفحات مدیریت و ادمین: مهاجمان می‌توانند از iframeها یا XMLHttpRequest برای دسترسی و دست‌کاری بالقوه صفحات مدیریت یا پس‌زمینه استفاده کنند.

تأثیرات منفی حملات XSS

حمله XSS می‌تواند تأثیرات منفی زیادی هم برای کاربران و هم سازمان‌ها داشته باشد، از جمله:

  • افشای داده‌های حساس کاربر
  • دست‌کاری و جعل هویت حساب کاربری
  • تغییر ظاهر وب‌سایت
  • انتشار بدافزار
  • دور زدن کنترل‌های دسترسی (Access Controls)
  • زیان‌های مالی
  • آسیب به اعتبار وب‌سایت و برنامه
  • زمینه‌سازی برای سایر حملات مثل جعل درخواست بین‌سایتی (CSRF)
  • سرقت داده‌ها

XSS چه زبان‌های برنامه‌نویسی را هدف قرار می‌دهد؟

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

  • جاوا اسکریپت: این زبان هدف اصلی حملات XSS است؛ زیرا به طور گسترده در برنامه‌های تحت وب استفاده می‌شود. جاوا اسکریپت مخرب می‌تواند به صفحات وب تزریق شده و در مرورگر کاربر اجرا شود.
  • HTML: اگرچه HTML خود یک زبان برنامه‌نویسی نیست، اما برای ساختار صفحه وب اساسی است و حملات XSS اغلب شامل تزریق تگ‌ها یا ویژگی‌های مخرب HTML می‌شوند که حاوی اسکریپت‌ها هستند. برای مثال، تگ‌هایی مانند
  • سایر زبان‌های اسکریپت‌نویسی: آسیب‌پذیری‌های XSS می‌توانند بر سایر زبان‌های اسکریپت‌نویسی و افزونه‌های برنامه‌هایی که محتوای وب را پردازش می‌کنند، مانند VBScript ،ActiveX ،Flash ،XML ،CGI ،Perl ،PHP ،ASP ،TCL و Coldfusion نیز تأثیر بگذارند. البته این موارد زیاد رایج نیستند. HTML و جاوا اسکریپت اغلب پایه و اساس بسیاری از برنامه‌های چند پلتفرمی هستند و همین امر آنها را بیشتر معرض خطر قرار می‌دهد.

انواع حملات XSS

حملات XSS عموماً به سه نوع اصلی طبقه‌بندی می‌شوند. این موارد در نحوه تزریق اسکریپت مخرب و تحویل آن به مرورگر قربانی متفاوت هستند. در ادامه هر سه مورد را بررسی خواهیم کرد.

XSS ذخیره شده (XSS پایدار)

Stored XSS که با نام Persistent XSS نیز شناخته می‌شود، زمانی رخ می‌دهد که یک اسکریپت مخرب به طور دائم در سرور هدف ذخیره می‌شود. این اتفاق می‌تواند در قسمت‌هایی مانند پایگاه‌های داده، فیلدهای نظرات، انجمن‌ها یا گزارش‌های بازدیدکنندگان رخ دهد. وقتی کاربری اطلاعات ذخیره شده را درخواست می‌کند، برنامه، اسکریپت مخرب را از حافظه خود بازیابی کرده و به مرورگر کاربر تحویل می‌دهد. یعنی همان جایی که بعداً اجرا خواهد شد. اجازه دهید با یک مثال این نوع از حمله را بهتر روشن کنیم.

یک مهاجم کامنتی را که حاوی کد جاوا اسکریپت مخرب است در یک فاروم ارسال می‌کند. این کد در پایگاه داده انجمن ذخیره می‌شود. وقتی کاربر دیگری آن نظر را مشاهده می‌کند، اسکریپت مخرب از پایگاه داده بازیابی شده و در مرورگر او اجرا می‌شود و به طور بالقوه کوکی جلسه (Session Cookie) او را می‌دزدد و آنها را به سرور مهاجم ارسال کند.

XSS بازتابی (XSS غیر پایدار)

Reflected XSS شامل کد مخربی می‌شود که از یک وب اپلیکیشن به مرورگر کاربر انتقال می‌یابد. در واقع این کد به عنوان بخشی از یک پیام خطا، نتیجه جستجو یا هر پاسخ دیگری که شامل داده‌های ارسال شده توسط کاربر می‌شود، است. این کد معمولاً به انتهای URL یک وب‌سایت اضافه می‌گردد. مخصوصاً وب‌سایت‌هایی که مورد اعتبار و معتبر هستند. وقتی کاربر لینک را در مرورگر باز می‌کند، کد تزریق شده در URL توسط آن مرورگر اجرا می‌شود. این اسکریپت مخرب به طور دائم در سرور ذخیره نمی‌شود.

فرض کنید یک مهاجم URL ای ایجاد می‌کند که شامل جاوا اسکریپت مخربی به عنوان پارامتر است. مثلاً:

http://example.com/search?query=

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

حملات XSS مبتنی بر DOM (Document Object Model-based XSS)

XSS مبتنی بر DOM زمانی رخ می‌دهد که اسکریپت سمت کلاینت به دلیل آسیب‌پذیری سمت کلاینت در Document Object Model (DOM)، داده‌های مخرب را اجرا می‌کند. برخلاف XSS ذخیره‌شده یا بازتابی، بار مخرب توسط سرور پردازش نمی‌شود؛ در عوض، در مرورگر کاربر در نتیجه دست‌کاری محیط DOM توسط اسکریپت سمت کلاینت به طور کامل اجرا می‌شود.

به عنوان مثال، یک وب‌سایت از جاوا اسکریپت برای خواندن یک پارامتر URL و نوشتن پویای آن در صفحه HTML استفاده می‌کند؛ اما رمزگذاری مناسبی ندارد. برای مثال، اگر URL به صورت http://example.com/page.html#name= باشد، یک اسکریپت سمت کلاینت ممکن است مقدار #name را گرفته و آن را در یک عنصر صفحه قرار دهد. سپس اسکریپت مخرب در مرورگر قربانی اجرا می‌شود، زیرا مرورگر، محتوای درج شده پویا را به عنوان بخشی از ساختار صفحه قانونی تفسیر می‌کند.

Document Object Model-based XSS

چگونه آسیب‌پذیری‌های XSS را در یک وب‌سایت یا وب اپلیکیشن پیدا کنیم؟

روش‌های مختلفی برای تشخیص آسیب‌پذیری‌های XSS وجود دارد. در ادامه به پرکاربردترین این روش‌ها اشاره می‌کنیم.

تست دستی و تحلیل کد

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

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

اسکنرهای آسیب‌پذیری وب

اسکنرهای آسیب‌پذیری وب ابزارهای خودکاری برای تشخیص XSS هستند و از تحلیل استاتیک و دینامیک جاوا اسکریپت برای شناسایی آسیب‌پذیری‌ها استفاده می‌کنند. ابزارهایی مانند اسکنر آسیب‌پذیری وب Burp Suite می‌توانند به سرعت و با اطمینان آسیب‌پذیری‌های XSS بازتابی را پیدا کنند. از دیگر ابزارها می‌توان به OWASP Zap و Hackbar اشاره کرد که در تست نفوذ برای یافتن آسیب‌پذیری‌های XSS استفاده می‌شوند.

تست پویا و تزریق پیلود (Payload)

در این روش، وب‌سایت یا اپلیکیشن وب پیش از هر رخدادی تست می‌شود. در زمان تست معمولاً از داده‌های ورودی ویژه ساخته شده با وکتورهای ورودی، برای تشخیص آسیب‌پذیری‌های XSS استفاده می‌شود. ​این داده‌های ورودی اغلب بی‌ضرر هستند؛ اما برای تحریک XSS و تست آسیب‌پذیر بودن سایت طراحی شده‌اند. اسکنرهای Blackbox پیلودهای مخرب را بخش‌های حساس درخواست‌های HTTP، تزریق و مقادیر منعکس شده در خروجی وب را رصد می‌کنند.

روش‌های پیشرفته‌تری هم برای تست کردن وجود دارد. از جمله شبیه‌سازی رفتار مرورگر با مرورگرهای هدلس برای تفسیر کد جاوا اسکریپت و بازیابی محتوای AJAX و شناسایی نقاط تزریق پنهان. این امر امکان تشخیص پویا را با بررسی رفتار ران تایم اجرای وب اپلیکیشن‌ها فراهم می‌کند.

سیستم‌های تشخیص نفوذ (IDS)

سیستم‌های تشخیص نفوذ می‌توانند با ضبط و هش کردن محتوای اجرایی سمت کلاینت در صفحات وب، برای تشخیص حملات احتمالی XSS به کار گرفته شوند. اگر در هش کردن مجدد بعدی تفاوت‌هایی دیده شود، می‌تواند نشانه‌ای از حمله احتمالی XSS باشد. این روزها از تکنیک‌های یادگیری ماشین نیز برای تشخیص حملات XSS استفاده می‌شود که نتایج بهتری نسبت به روش‌های سنتی ارائه می‌دهند.

چگونه از آسیب‌پذیری‌های XSS جلوگیری کنیم؟

برای پیشگیری از آسیب‌پذیری‌های XSS باید رویکردی چندگانه را در نظر داشته باشید. زیرا همان طور که پیش‌تر توضیح دادیم، حملات XSS از راه‌های مختلفی می‌توانند نفوذ کنند. به این منظور روش های پیشگیری از آسیب‌پذیری‌های XSS عبارت‌اند از:

چگونه از آسیب‌پذیری‌های XSS جلوگیری کنیم؟

اعتبارسنجی و پاک‌سازی ورودی

تمام ورودی‌های ارائه شده توسط کاربر باید قبل از پردازش یا ذخیره، به طور دقیق در سمت سرور اعتبارسنجی و پاک‌سازی شوند. این امر شامل حذف یا خنثی‌سازی هرگونه کاراکتر یا اسکریپت مخرب بالقوه می‌شود. 

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

در این زمینه از فیلتر کردن ورودی‌های HTML نیز می‌توانید استفاده کنید. مسدود کردن مستقیم ورودی‌های HTML آن هم در جایی که انتظار نمی‌رود، می‌تواند به پیشگیری از XSS کمک کند. به عنوان مثال، در فیلدهای متنی که فقط باید حاوی متن ساده باشند، تگ‌های HTML را به طور کامل غیرفعال کنید.

کدگذاری خروجی

راه دیگر کدگذاری خروجی است. تمام خروجی‌هایی که شامل داده‌های ارائه شده توسط کاربر هستند را قبل از رندر شدن در مرورگر وب کدگذاری کنید. نوع کدگذاری باید متناسب با بستری باشد که داده‌ها در آن نمایش داده می‌شوند (به عنوان مثال، کدگذاری موجودیت HTML برای محتوای HTML، کدگذاری جاوا اسکریپت برای بستر‌های جاوا اسکریپت، کدگذاری URL برای پارامترهای URL، کدگذاری CSS برای ویژگی‌های CSS). کدگذاری تضمین می‌کند که مرورگر، ورودی کاربر را به عنوان داده تفسیر می‌کند، نه به عنوان کد اجرایی.

سیاست امنیت محتوا (CSP)

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

برای وب اپ‌های پیچیده‌تر، تولید پویای CSPها در سمت کلاینت می‌تواند با غلبه بر محدودیت‌های CSPهای استاتیک، دفاع قوی‌تری در برابر XSS ارائه دهد.

سیاست امنیت محتوا (CSP)

استفاده از روش‌های امن توسعه دادن

راه دیگر پیشگیری از XSS این است که از فریمورها و کتابخانه‌های دارای مکانیزم‌های پیشگیری از XSS داخلی مانند رمزگذاری خودکار خروجی در وب اپ‌ها استفاده کنید. 

علاوه بر این، از تولید کد داینامیک خودداری کنید. هنگام کار با ورودی‌های کنترل‌شده توسط کاربر، استفاده از توابعی که رشته‌ها را به عنوان کد ارزیابی می‌کنند (مانند eval()، innerHTML) را به حداقل برسانید، زیرا این توابع، بردارهای رایج برای XSS مبتنی بر DOM هستند. در صورتی که مجبور هستید از آن‌ها استفاده کنید، بسیار احتیاط کنید و از پاک‌سازی کامل آنها اطمینان حاصل کنید.

همچنین از ممیزی‌های امنیتی منظم بهره ببرید. ممیزی‌های امنیتی منظم می‌توانند مخاطرات، تهدیدات، آسیب‌پذیری‌ها، راه‌های نفوذ و... را ارزیابی کنند. 

کوکی‌ها HTTP-Only

در این راستا از فلگ HttpOnly استفاده کنید. فلگ HttpOnly را روی کوکی‌هایی که حاوی اطلاعات حساس جلسه هستند، تنظیم کنید. این کار مانع از دسترسی اسکریپت‌های سمت کلاینت به این کوکی‌ها می‌شود، حتی اگر آسیب‌پذیری XSS وجود داشته باشد. در نتیجه هایجک شدن جلسه‌ها کاهش پیدا می‌کند.

استفاده از فایروال وب اپلیکیشن (WAFs)

استفاده از فایروال را در هر شرایطی توصیه می‌کنیم. یک WAF می‌تواند ترافیک HTTP بین یک وب اپ و اینترنت را فیلتر کند و بر آن نظارت داشته باشد. این گونه یک لایه دفاعی اضافی ایجاد می‌گردد. همچنین WAFها می‌توانند بارهای مخرب XSS را قبل از رسیدن به برنامه شناسایی و مسدود کنند.

فیلترینگ سمت کلاینت (محافظت‌های مبتنی بر مرورگر)

​مرورگرهای مدرن اغلب شامل فیلترهای XSS داخلی (مثلاً در اینترنت اکسپلورر و گوگل کروم) هستند که می‌توانند در برابر حملات XSS بازتابی لایه‌ای محافظ ایجاد کنند. ​با این حال، این فیلترها محدودیت‌هایی دارند و نباید به عنوان تنها راه دفاع به آنها استفاده شوند. 

ابزارها و افزونه‌های امنیتی خودکار

حتماً از اسکنرهای آسیب‌پذیری و افزونه‌های شناسایی XSS برای وب‌سایت خود استفاده کنید. کاربران نیز می‌توانند از افزونه‌های هشدار به کاربران در مورد حملات احتمالی XSS استفاده کنند. این افزونه‌ها به مرورگر اضافه می‌شوند و به شما هشدار می‌دهند که چه لینکی مشکوک است و نباید وارد آن شوید. 

به‌روزرسانی نرم‌افزار و کتابخانه‌ها

به طور منظم تمام اجزای وب اپلیکیشن خود، از جمله نرم‌افزار سرور، فریمورک‌ها، کتابخانه‌ها و سیستم‌های مدیریت محتوا (CMS) را به‌روزرسانی کنید. ​این کار تضمین می‌کند که آسیب‌پذیری‌های شناخته‌شده پچ شده‌اند.

مثال‌هایی از کد پیشگیری از XSS برای زبان‌های مختلف

پیش‌تر اشاره کردیم که پیشگیری از XSS تا حد زیادی به اعتبارسنجی ورودی و کدگذاری صحیح خروجی بستگی دارد. در ادامه نمونه کدهایی را می‌آوریم که برای پیشگیری از حملات XSS در زبان‌های برنامه‌نویسی مختلف نوشته شده‌اند.

  • HTML Escaping در زبان‌های مختلف

PHP:

در PHP، معمولاً از htmlspecialchars() و  htmlentities()برای escape کردن کاراکترهای خاص در ورودی کاربر، قبل از نمایش آن در HTML استفاده می‌شوند:

// User input (e.g., from a form submission)

$userInput = "Hello World";

// 1. Using htmlspecialchars() for basic HTML escaping

// Converts special characters to HTML entities:

// < becomes <

// > becomes >

// & becomes &

// " becomes "

// ' becomes '

$safeOutput1 = htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');

echo "Safe Output (htmlspecialchars): " . $safeOutput1;

// Expected output: <script>alert('XSS Attack!');</script><b>Hello</b> World

echo "\n";

// 2. Using htmlentities() for more comprehensive HTML escaping

// Converts all applicable characters to HTML entities, including accented letters, etc.

$safeOutput2 = htmlentities($userInput, ENT_QUOTES, 'UTF-8');

echo "Safe Output (htmlentities): " . $safeOutput2;

// Expected output: <script>alert('XSS Attack!');</script><b>Hello</b> World

// If you need to allow some specific HTML tags, you should use a dedicated sanitization library

// rather than relying solely on these functions, or implement a strict whitelisting approach.

// Example with a hypothetical sanitization function (not built-in PHP, requires a library like HTML Purifier)

// function sanitize_html_for_display($html) {

//    // Use a library like HTML Purifier

//    require_once '/path/to/htmlpurifier/library/HTMLPurifier.auto.php';

//    $config = HTMLPurifier_Config::createDefault();

//    $config->set('HTML.Allowed', 'b,i,a,p'); // Whitelist allowed tags and attributes

//    $purifier = new HTMLPurifier($config);

//    return $purifier->purify($html);

// }

// $safeRichText = sanitize_html_for_display($userInput);

// echo "Safe Rich Text: " . $safeRichText;

?>

Python:

ماژول html پایتون، تابع escape() را برای گریز از کدهای HTML ارائه می‌دهد:

import html

# User input

user_input = "Hello World"

# Using html.escape() for HTML escaping

# This converts <, >, &, and " to HTML entities.

# Note: It does not escape single quotes by default, but you can set the `quote` parameter.

safe_output = html.escape(user_input)

print(f"Safe Output (default): {safe_output}")

# Expected output: <script>alert('XSS Attack!');</script><b>Hello</b> World

# For escaping single quotes too, use quote=True

safe_output_with_quotes = html.escape(user_input, quote=True)

print(f"Safe Output (with quotes escaped): {safe_output_with_quotes}")

# Expected output: <script>alert('XSS Attack!');</script><b>Hello</b> World

# For situations where you need to allow some HTML, a library like Bleach or html5lib is recommended for sanitization.

# import bleach

# allowed_tags =

# allowed_attributes = {'a':}

# sanitized_rich_text = bleach.clean(user_input, tags=allowed_tags, attributes=allowed_attributes)

# print(f"Sanitized Rich Text (Bleach): {sanitized_rich_text}")

Java:

جاوا کتابخانه‌های قدرتمندی مانند Apache Commons Text یا Spring's HtmlUtils را برای فرار از HTML ارائه می‌دهد:

import org.apache.commons.text.StringEscapeUtils; // Requires Apache Commons Text library

public class XSSPrevention {

    public static void main(String args) {

        // User input

        String userInput = "Hello World";

        // Using Apache Commons Text for HTML escaping

        String safeOutput = StringEscapeUtils.escapeHtml4(userInput);

        System.out.println("Safe Output (Apache Commons Text): " + safeOutput);

        // Expected output: <script>alert('XSS Attack!');</script><b>Hello</b> World

        // For JavaScript contexts, you would use JavaScript escaping

        String jsCode = "'); alert('XSS!'); var a = ('";

        String safeJsOutput = StringEscapeUtils.escapeEcmaScript(jsCode);

        System.out.println("Safe JavaScript Output: " + safeJsOutput);

        // Expected output: \x27); alert(\x27XSS!\x27); var a = (\x27

        // For allowing rich text with whitelisted HTML, you would use a dedicated sanitization library like OWASP ESAPI or Jsoup.

        // import org.owasp.esapi.ESAPI;

        // String safeRichText = ESAPI.encoder().encodeForHTML(userInput); // Basic HTML encoding

        // Or for more complex sanitization:

        // import org.jsoup.Jsoup;

        // import org.jsoup.safety.Whitelist;

        // String safeRichText = Jsoup.clean(userInput, Whitelist.basic()); // Whitelist basic HTML tags

        // System.out.println("Safe Rich Text (Jsoup): " + safeRichText);

    }

}

  • Contextual Escaping

JavaScript/Node.js:

در جاوا اسکریپت، escape کردن مستقیم HTML بسیار مهم است، به خصوص هنگام به‌روزرسانی پویای DOM. به طور کلی بهتر است هنگام وارد کردن داده‌های غیرقابل اعتماد از innerHTML اجتناب کنید:

// User input

const userInput = "User Name";

// 1. Preventing XSS when inserting into text content

// Use textContent or innerText instead of innerHTML if you just want to display text.

const div1 = document.createElement('div');

div1.textContent = userInput; // Correct way to display user input as plain text

document.body.appendChild(div1);

// Expected result: Displays the exact string "User Name" as text, not executing the script.

// 2. Escaping for HTML attributes (e.g., in `alt` text or value)

function escapeHtmlAttribute(str) {

  const div = document.createElement('div');

  div.appendChild(document.createTextNode(str));

  return div.innerHTML.replace(/"/g, '"').replace(/'/g, ''');

}

const maliciousAttribute = '" onclick="alert(\'XSS\')';

const img = document.createElement('img');

// Correct way to set an attribute with untrusted data:

img.alt = escapeHtmlAttribute(maliciousAttribute);

// Or for an input value:

const input = document.createElement('input');

input.value = escapeHtmlAttribute(maliciousAttribute);

document.body.appendChild(img);

document.body.appendChild(input);

// Expected result: The `onclick` event will not trigger; the malicious string will just be part of the alt/value attribute's text.

// 3. Avoiding XSS when creating elements

// Always use createElement and set properties directly when constructing DOM elements from user input.

const unsafeImageSrc = "x' onerror='alert(\"XSS\")'";

const safeImg = document.createElement('img');

safeImg.src = unsafeImageSrc; // The browser will attempt to load 'x' and ignore the onerror due to strict parsing.

document.body.appendChild(safeImg);

// Expected result: An broken image icon, no alert.

// If you absolutely must use innerHTML for a complex structure that might include user input,

// you MUST sanitize it first using a robust library like DOMPurify.

// import DOMPurify from 'dompurify';

// const sanitizedHtml = DOMPurify.sanitize(userInput);

// div.innerHTML = sanitizedHtml;

سخن نهایی

در این مقاله به بررسی حمله XSS و انواع آن پرداختیم. همچنین روش‌های مقابله با این حملات را نیز توضیح دادیم. توصیه می‌کنیم از روش‌ها و ابزارهای مختلف برای بستن هر گونه نفوذ استفاده کنید و برای مقابله با این حملات، صرفاً به یک روش اکتفا نکنید. 

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *


مقالات مرتبط

SIEM چیست

SIEM چیست؟ | کاربرد + مزایا و بهترین نرم افزارها

SIEM یکی از ابزارهای اساسی برای برقراری امنیت در محیط‌های فناوری اطلاعات است. این ابزارها به جمع‌آوری، دسته‌بندی و تجزیه...

فایروال UTM چیست؟ بررسی تفاوت UTM و firewallهای دیگر

فایروال UTM چیست؟ مقایسه با firewallهای دیگر

دستگاه UTM یا سیستم مدیریت یکپارچه تهدیدات (Unified Threat Management) یک راهکار امنیتی همه‌کاره است که قابلیت‌های مختلف حفاظتی را...

ماژول TPM چیست

همه چیز درباره ماژول tpm + کاربرد آن در امنیت

ماژول پلتفرم قابل اعتماد (TPM) یک فناوری امنیتی حیاتی مبتنی بر سخت‌افزار است که یکپارچگی، محافظت و قابلیت اعتماد سیستم‌های...