⏳ افزایش قیمت‌ | آخرین فرصت خرید دوره‌های برنامه‌نویسی با قیمت سال قبل با => ۶۵٪ تخفیف

مشاهده دوره‌ها
XSS و CSRF چیست؟ چگونه از وب اپلیکیشن خود در برابر این حملات محافظت کنیم؟
ﺯﻣﺎﻥ ﻣﻄﺎﻟﻌﻪ: 9 دقیقه

XSS و CSRF چیست؟ چگونه از وب اپلیکیشن خود در برابر این حملات محافظت کنیم؟

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

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

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

XSS چیست؟

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

انواع XSS

برای درک بهتر سازوکار این حمله، سه نوع اصلی آن بررسی می‌شود:

1. Stored XSS

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

2. Reflected XSS

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

3. DOM‑Based XSS

در این سناریو، آسیب‌پذیری در لایه‌ی جاوااسکریپت سمت کاربر رخ می‌دهد. اسکریپت مخرب بدون دخالت سرور و از طریق دستکاری DOM اجرا می‌شود.

سناریوهای رایج حمله

  • سرقت کوکی نشست کاربر
  • اجرای عملیات ناخواسته در مرورگر
  • تغییر محتوای صفحه یا تزریق عناصر جعلی
  • هدایت کاربر به صفحات مخرب

روش‌های جلوگیری از XSS

  • اعتبارسنجی و Escape کردن ورودی‌ها پیش از نمایش در خروجی
  • Sanitization برای حذف یا خنثی‌سازی عناصر خطرناک
  • استفاده از Content Security Policy برای محدود کردن منابع قابل‌اجرا
  • جلوگیری از تفسیر HTML در ورودی‌های کاربر
  • استفاده از کوکی‌های HttpOnly برای جلوگیری از دسترسی اسکریپت‌ها به کوکی نشست

CSRF چیست؟

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

سازوکار حمله

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

سناریوهای رایج

  • تغییر رمز عبور کاربر بدون اطلاع او
  • ارسال درخواست انتقال وجه در سرویس‌های مالی
  • ثبت یا حذف داده‌ها در پنل کاربری
  • ارسال فرم‌های حساس مانند درخواست پشتیبانی یا تغییر تنظیمات حساب

روش‌های جلوگیری از CSRF

  • استفاده از CSRF Token در فرم‌ها و درخواست‌های حساس
  • فعال‌سازی SameSite Cookie برای جلوگیری از ارسال کوکی در درخواست‌های Cross‑Site
  • استفاده از Double Submit Cookie در معماری‌هایی که نیاز به کنترل بیشتر دارند
  • محدود کردن عملیات حساس با احراز هویت مجدد یا تأیید چندمرحله‌ای
  • استفاده از هدرهای امنیتی برای جلوگیری از ارسال درخواست‌های غیرمجاز

تفاوت XSS و CSRF

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

مقایسه مفهومی

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

مقایسه ساختاری

موضوع XSS CSRF
هدف اصلی اجرای اسکریپت در مرورگر کاربر ارسال درخواست ناخواسته با اعتبار کاربر
نقطه ضعف کنترل‌نشدن ورودی‌ها و خروجی‌ها مدیریت نادرست نشست و کوکی‌ها
نیاز به تعامل کاربر معمولا کم معمولا زیاد
پیامدها سرقت داده، تغییر محتوا، اجرای کد انجام عملیات حساس بدون رضایت کاربر
روش‌های دفاعی Escape ،Sanitization ،CSP، محدودیت کوکی CSRF Token ،SameSite ،Double Submit Cookie

XSS و CSRF هر دو می‌توانند پیامدهای جدی برای امنیت وب‌اپلیکیشن ایجاد کنند، اما از دو مسیر متفاوت عمل می‌کنند. XSS به مهاجم اجازه می‌دهد کد دلخواه خود را اجرا کند، در حالی که CSRF از اعتماد سرور به کاربر سوءاستفاده می‌کند. بنابراین، راهکارهای دفاعی نیز باید متناسب با ماهیت هر حمله انتخاب شوند.

بهترین روش‌های امنیتی برای محافظت از وب‌اپلیکیشن

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

اصول Secure Coding

  • جداسازی کامل داده و کد در تمام لایه‌ها
  • استفاده از توابع امن برای پردازش ورودی‌ها
  • پرهیز از ساختن HTML یا اسکریپت به‌صورت دستی در بخش‌هایی که امکان تزریق وجود دارد
  • استفاده از کتابخانه‌ها و فریمورک‌هایی که کنترل خروجی را به‌صورت پیش‌فرض انجام می‌دهند

هدرهای امنیتی

  • فعال‌سازی Content Security Policy برای محدود کردن منابع قابل‌اجرا
  • استفاده از X‑Frame‑Options برای جلوگیری از حملات Clickjacking
  • تنظیم X‑Content‑Type‑Options برای جلوگیری از تفسیر اشتباه MIME
  • استفاده از Strict‑Transport‑Security برای الزام ارتباطات HTTPS

مدیریت صحیح نشست و کوکی

  • استفاده از کوکی‌های HttpOnly و Secure
  • فعال‌سازی SameSite برای جلوگیری از ارسال ناخواسته کوکی در درخواست‌های Cross‑Site
  • تعیین زمان انقضای مناسب برای نشست‌ها
  • بازسازی Session ID پس از ورود کاربر

اعتبارسنجی و Sanitization

  • اعتبارسنجی ورودی‌ها در سمت سرور و سمت کاربر
  • حذف یا خنثی‌سازی عناصر خطرناک در ورودی‌ها
  • جلوگیری از تفسیر HTML در بخش‌هایی که نیاز به متن ساده دارند

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

  • اجرای دوره‌ای اسکن‌های خودکار برای شناسایی آسیب‌پذیری‌ها
  • استفاده از ابزارهای تست نفوذ برای بررسی سناریوهای واقعی
  • پایش لاگ‌ها برای شناسایی رفتارهای غیرعادی

کنترل دسترسی و احراز هویت

  • محدود کردن عملیات حساس به کاربران احراز هویت‌شده
  • استفاده از احراز هویت چندمرحله‌ای برای بخش‌های حیاتی
  • تعریف نقش‌ها و سطح دسترسی دقیق برای کاربران

پیاده‌سازی لایه‌های امنیتی XSS و CSRF در فریمورک لاراول

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

محافظت در برابر XSS در لاراول

Escape خودکار خروجی‌ها

لاراول در قالب Blade، تمام خروجی‌ها را به‌صورت خودکار Escape می‌کند. این رفتار باعث می‌شود ورودی‌های کاربر بدون تفسیر HTML نمایش داده شوند.

{{ $username }}

در صورتی که توسعه‌دهنده بخواهد HTML را عمدا رندر کند، باید از {!! !!} استفاده کند، اما این کار تنها زمانی توصیه می‌شود که داده کاملا امن باشد.

{!! $safeHtml !!}

Sanitization ورودی‌ها

لاراول به‌صورت پیش‌فرض Sanitization انجام نمی‌دهد، اما می‌توان از Request Object یا Form Request برای پاک‌سازی ورودی‌ها استفاده کرد.

public function rules()
{
    return [
        'title' => 'string|max:255',
        'content' => 'string'
    ];
}

برای Sanitization پیشرفته می‌توان از پکیج‌هایی مانند HTMLPurifier استفاده کرد.

جلوگیری از XSS در داده‌های JSON

لاراول هنگام بازگرداندن JSON، کاراکترهای خطرناک را Escape می‌کند تا از اجرای اسکریپت جلوگیری شود.

return response()->json(['message' => $input]);

استفاده از Content Security Policy

لاراول به‌صورت پیش‌فرض CSP ندارد، اما می‌توان آن را از طریق Middleware یا پکیج‌هایی مانند spatie/laravel-csp فعال کرد.

نمونه‌ی یک Middleware ساده:

 
public function handle($request, Closure $next)
{
    $response = $next($request);
    $response->headers->set('Content-Security-Policy', "default-src 'self'");
    return $response;
}

محافظت در برابر CSRF در لاراول

CSRF Token خودکار

لاراول برای تمام فرم‌های POST ،PUT ،PATCH و DELETE یک CSRF Token تولید و اعتبارسنجی می‌کند. کافی است در قالب Blade از دستور زیر استفاده شود:

<form method="POST" action="/profile">
    @csrf
</form>

در سمت سرور، Middleware پیش‌فرض VerifyCsrfToken مسئول بررسی Token است.

استفاده از Token در درخواست‌های AJAX

در درخواست‌های AJAX باید Token را در هدر ارسال کرد:

axios.post('/profile', data, {
    headers: {
        'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content
    }
});

SameSite Cookie

لاراول امکان تنظیم SameSite را در فایل config/session.php فراهم می‌کند:

'same_site' => 'lax',

این مقدار باعث می‌شود کوکی‌ها در درخواست‌های Cross‑Site ارسال نشوند و احتمال CSRF کاهش یابد.

Double Submit Cookie

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

جمع‌بندی

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

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

چه امتیازی برای این مقاله میدهید؟

خیلی بد
بد
متوسط
خوب
عالی
4.67 از 3 رای

/@arastoo
ارسطو عباسی
کارشناس تست نرم‌افزار و مستندات

...

دیدگاه و پرسش
برای ارسال دیدگاه لازم است وارد شده یا ثبت‌نام کنید ورود یا ثبت‌نام

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

ارسطو عباسی

کارشناس تست نرم‌افزار و مستندات