تصور کنید در حالی که در یک لبه (Tab) مرورگر خود وارد حساب بانکی شدهاید، در لبهای دیگر در حال گشتوگذار در یک سایت تفریحی یا دانلود یک فایل هستید. ناگهان، بدون اینکه روحی از ماجرا خبر داشته باشد، پیامی از بانک دریافت میکنید: «مبلغ ۱۰ میلیون تومان از حساب شما کسر شد!». شما نه دکمهای را فشار دادهاید و نه کدی را برای کسی ارسال کردهاید. اما حقیقت این است که شما همین حالا قربانی یکی از فریبندهترین حملات دنیای وب یعنی حمله CSRF شدهاید. حال باید دانست که حمله CSRF چیست و چگونه انجام میشود؟
حمله CSRF که مخفف Cross-Site Request Forgery (جعل درخواست میانسایتی) است، به «حمله با دست قربانی» شهرت دارد. در این سناریو، هکر از هویت و اعتبار شما استفاده میکند تا درخواستی را به یک وبسایت (که شما در آن لاگین هستید) بفرستد، بدون اینکه شما متوجه شوید.
در این مقاله، به کالبدشکافی این حمله میپردازیم، مکانیسمهای پنهان آن را بررسی میکنیم و در نهایت یاد میگیریم که چگونه به عنوان توسعهدهنده یا کاربر، جلوی این دستهای نامرئی را بگیریم.
حمله CSRF چیست؟ سوءاستفاده از اعتماد سرور
برای درک CSRF، ابتدا باید یک اصل مهم در وب را بدانیم: سرورها به مرورگر شما اعتماد دارند. وقتی شما در وبسایتی مثل فیسبوک یا پنل کاربری بانکتان وارد میشوید، سرور یک «کوکی نشست» (Session Cookie) برای مرورگر شما میفرستد. از آن لحظه به بعد، مرورگر شما با هر درخواستی که به آن سایت میفرستد، این کوکی را هم ضمیمه میکند تا سرور بفهمد شما همان کاربر معتبر هستید.
مشکل اینجاست که مرورگرها «سادهلوح» هستند. آنها هر درخواستی را که به مقصد آن سایت خاص باشد، همراه با کوکیهای مربوطه ارسال میکنند؛ فرقی نمیکند این درخواست را خودِ شما با کلیک روی یک دکمه ایجاد کرده باشید یا یک اسکریپت مخفی در یک سایت دیگر آن را صادر کرده باشد.
در حمله CSRF، هکر مرورگر شما را فریب میدهد تا یک درخواست ناخواسته (مثل تغییر رمز عبور، خرید محصول یا انتقال وجه) را به سایتی بفرستد که شما قبلاً در آن احراز هویت شدهاید.

کالبدشکافی یک حمله؛ هکرها چگونه عمل میکنند؟
بیایید یک سناریوی واقعی را گامبهگام بررسی کنیم:
گام اول: ورود کاربر به سایت هدف
شما وارد حساب کاربری خود در سایت `bank.com` میشوید. مرورگر شما کوکیهای احراز هویت این سایت را ذخیره میکند.
گام دوم: فریب کاربر
هکر یک ایمیل فریبنده برای شما میفرستد یا شما را به سایتی مخرب (مثلاً سایت دانلود رایگان فیلم) میکشاند. در کد این سایت، یک دستور مخفی وجود دارد. این دستور میتواند یک تگ ساده تصویر (``) یا یک فرم مخفی باشد.
مثلاً هکر این کد را در سایت خود قرار میدهد:
<img src=”http://bank.com/transfer?amount=10000000&to=hacker_account” width=”0″ height=”0″>
گام سوم: ارسال ناخواسته درخواست
به محض اینکه شما آن صفحه آلوده را باز میکنید، مرورگر سعی میکند تصویر را بارگذاری کند. برای این کار، درخواستی به آدرس مشخص شده میفرستد. از آنجایی که شما در `bank.com` لاگین هستید، مرورگر به صورت خودکار کوکیهای شما را هم همراه این درخواست ارسال میکند.
گام چهارم: تایید توسط سرور
سرور بانک درخواست را دریافت میکند، کوکی معتبر شما را میبیند و تصور میکند که خودِ شما دستور انتقال وجه را صادر کردهاید. تراکنش انجام میشود و هکر به پول میرسد!

شرایط لازم برای موفقیت یک حمله CSRF
هکر برای اجرای موفق این نقشه به سه پیششرط اساسی نیاز دارد:
1. یک اقدام ارزشمند: باید عملیاتی وجود داشته باشد که هکر از انجام آن سود ببرد (مثل تغییر ایمیل کاربر، انتقال وجه یا تغییر تنظیمات امنیتی).
2. مدیریت نشست بر پایه کوکی: وبسایت هدف باید برای شناسایی کاربر فقط به کوکیها تکیه کند (که مرورگرها به طور خودکار آنها را ارسال میکنند).
3. پارامترهای قابل پیشبینی: هکر باید بداند درخواست به چه شکلی ارسال میشود. مثلاً اگر فیلد انتقال وجه نام مشخصی مثل `to_account` داشته باشد، هکر میتواند آن را در لینک مخرب خود بازسازی کند.

تفاوت CSRF با XSS؛ شباهتها و تفاوتهای کلیدی
بسیاری از افراد این دو حمله را با هم اشتباه میگیرند، اما تفاوت آنها بنیادین است:
- در حمله XSS (تزریق اسکریپت): هکر کدی را در داخلِ سایت هدف اجرا میکند تا دادههای کاربر (مثل کوکیها) را بدزدد. در اینجا هکر از «اعتمادی که کاربر به سایت دارد» سوءاستفاده میکند. اطلاعات بیشتر: «آسیب پذیری XSS چیست؟»
- در حمله CSRF: هکر کدی را در یک سایتِ بیگانه اجرا میکند تا درخواستی را به سایت هدف بفرستد. در اینجا هکر از «اعتمادی که سایت به مرورگر کاربر دارد» سوءاستفاده میکند.
به زبان ساده: در XSS هکر میخواهد اطلاعات شما را ببیند، اما در CSRF هکر میخواهد از طرف شما کاری را انجام دهد.

راهکارهای دفاعی برای توسعهدهندگان (سمت سرور)
امنیت یک وبسایت وظیفه مستقیم برنامهنویسان آن است. برای مقابله با CSRF، چندین لایه دفاعی وجود دارد:
۱. استفاده از توکنهای ضد CSRF (Anti-CSRF Tokens)
این موثرترین راه دفاعی است. سرور برای هر نشست کاربری، یک کد تصادفی و منحصربهفرد (Token) تولید میکند. این کد باید در تمام فرمهای حساس سایت گنجانده شود. وقتی کاربر فرمی را ارسال میکند، سرور چک میکند که آیا توکن ارسالی با توکنی که قبلاً تولید کرده مطابقت دارد یا خیر. چون هکر در سایت خودش به این توکنِ تصادفی دسترسی ندارد، نمیتواند درخواستی جعلی بسازد که سرور آن را بپذیرد.
۲. کوکیهای SameSite
این یک ویژگی مدرن در مرورگرهاست که انقلابی در امنیت وب ایجاد کرده است. شما میتوانید به مرورگر بگویید که کوکیهای این سایت را فقط زمانی ارسال کند که درخواست از داخلِ خودِ سایت صادر شده باشد. اطلاعات بیشتر: «کوکی چیست؟»
- SameSite=Strict: کوکی فقط در درخواستهای داخلی ارسال میشود.
- SameSite=Lax: کوکی در لینکهای معمولی ارسال میشود اما در فرمهایی که از سایتهای دیگر هدایت میشوند، خیر. (این گزینه تعادل خوبی بین امنیت و تجربه کاربری برقرار میکند).
۳. بررسی هدرهای Origin و Referer
سرور میتواند بررسی کند که درخواست از چه آدرسی (Source) آمده است. اگر آدرس مبدأ با آدرس سایت شما متفاوت بود، سرور باید درخواست را مشکوک تلقی کرده و آن را مسدود کند.
۴. احراز هویت مجدد برای عملیات حساس
برای کارهای بسیار مهم (مثل تغییر رمز عبور یا خروج مبالغ کلان)، همیشه از کاربر بخواهید دوباره رمز عبور خود را وارد کند یا یک کد OTP (یکبار مصرف) را تایید نماید. هکر نمیتواند این تعامل زنده را در حمله CSRF شبیهسازی کند.

راهکارهای محافظتی برای کاربران (سمت کلاینت)
اگرچه مسئولیت اصلی بر عهده سایتهاست، اما شما هم به عنوان کاربر میتوانید ریسک را کاهش دهید:
- خروج (Logout) پس از اتمام کار: وقتی کارتان با پنل بانکی یا ایمیل تمام شد، حتماً دکمه Log out را بزنید. با این کار، کوکیهای نشست باطل میشوند و هکر دیگر نمیتواند از اعتبار شما استفاده کند.
- استفاده از مرورگرهای بهروز: مرورگرهای مدرن مثل کروم و فایرفاکس به طور پیشفرض مکانیزمهای دفاعی قویتری در برابر این حملات دارند.
- باز نکردن لینکهای مشکوک: هرگز در حالی که در حسابهای حساس خود لاگین هستید، روی لینکهای ناشناس در ایمیلها یا چتها کلیک نکنید.
- استفاده از افزونههای امنیتی: برخی افزونهها مثل NoScript اجازه اجرای اسکریپتهای ناخواسته را در سایتهای ناشناس نمیدهند.

چرا حملات CSRF هنوز خطرناک هستند؟
ممکن است بپرسید با وجود این همه راهکار، چرا هنوز خبرهایی از این حملات میشنویم؟
دلیل اصلی، خطای انسانی و سیستمهای قدیمی (Legacy) است. بسیاری از اپلیکیشنهای قدیمی هنوز از توکنهای امنیتی استفاده نمیکنند. همچنین، اشتباه در تنظیمات کوکیهای SameSite یا استثنا قائل شدن برای برخی APIها، حفرههایی را باز میگذارد که هکرها به سرعت آنها را شناسایی میکنند.
علاوه بر این، در دنیای امروز که همه چیز به هم متصل است (اینترنت اشیا)، یک حمله CSRF میتواند فراتر از یک حساب بانکی باشد. تصور کنید هکری با یک درخواست جعلی، تنظیمات مودم وایفای شما را تغییر دهد یا درب هوشمند منزل شما را باز کند!
نتیجهگیری: هوشیاری در دنیای درخواستهای پنهان
حمله CSRF به ما یادآوری میکند که دنیای وب بر پایه «اعتماد» بنا شده است و هکرها دقیقاً همین نقطه قوت را به نقطه ضعف تبدیل میکنند. این حمله نشان میدهد که داشتن یک رمز عبور قوی به تنهایی کافی نیست؛ بلکه وبسایتها باید مراقب باشند که درخواستها واقعاً از طرفِ آگاهانه کاربر صادر شدهاند.
به عنوان یک توسعهدهنده، هرگز به امنیت پیشفرض فریمورکها اکتفا نکنید و توکنهای امنیتی را در تمام بخشها جدی بگیرید. به عنوان یک کاربر، به یاد داشته باشید که باز نگه داشتن ده لبه (Tab) حساس به صورت همزمان، ریسک امنیتی شما را افزایش میدهد.
در نهایت، امنیت سایبری یک نبرد دائمی است. با شناخت تهدیداتی مثل CSRF، شما دیگر یک قربانی احتمالی نیستید، بلکه کاربری هوشیار هستید که میداند چگونه از داراییهای دیجیتال خود محافظت کند.





