CSRF چیست؟
حملهای که مرورگر قربانی را (بدون اطلاع او) وادار میکند یک درخواست معتبر (با Cookie او) به سایتی که در آن Login است ارسال کند.
چرا مهم است؟
اگر یک برنامه فقط با Cookie احراز هویت میکند و از توکن ضد-CSRF استفاده نکند، یک سایت مخرب میتواند بدون اطلاع کاربر عملیاتی (مثل تغییر رمز یا انتقال وجه) را به نام او انجام دهد.
تعریف
CSRF (Cross-Site Request Forgery) وقتی رخ میدهد که کاربر همزمان در سایت هدف Login است و از یک سایت مخرب دیگر بازدید میکند؛ آن سایت مخرب یک فرم/درخواست مخفی به سایت هدف میفرستد و مرورگر بهصورت خودکار Cookie معتبر کاربر را هم پیوست میکند.
مثال حمله (سادهشده)
<!-- روی سایت مخرب -->
<form action="https://bank.example.com/transfer" method="POST">
<input type="hidden" name="amount" value="10000">
<input type="hidden" name="to" value="attacker-account">
</form>
<script>document.forms[0].submit()</script>
اگر کاربر همان لحظه در bank.example.com Login باشد، مرورگر Cookie را خودکار میفرستد و سرور (بدون محافظت CSRF) درخواست را معتبر تشخیص میدهد.
راههای مقابله
- Anti-Forgery Token: توکن یکبارمصرف در فرم که سایت مخرب نمیتواند حدس بزند (ASP.NET Core بهصورت پیشفرض با
[ValidateAntiForgeryToken]این را پشتیبانی میکند). SameSite=Strict/Laxروی Cookie: جلوگیری از ارسال خودکار Cookie در درخواستهای Cross-Site.- APIهایی که فقط با Bearer Token (نه Cookie) کار میکنند، ذاتاً در برابر CSRF کلاسیک ایمنترند چون مرورگر توکن را خودکار پیوست نمیکند.
اشتباه رایج
❌ اعتماد فقط به بررسی هدر Referer برای جلوگیری از CSRF — این هدر گاهی توسط مرورگر یا پروکسی حذف میشود؛ باید همراه Anti-Forgery Token و SameSite Cookie استفاده شود، نه بهتنهایی.
منبع و مطالعه بیشتر
خلاصه
CSRF از اعتماد خودکار مرورگر به Cookie سوءاستفاده میکند تا درخواست ناخواسته به نام کاربر Loginشده بفرستد. راه مقابله ترکیب Anti-Forgery Token و SameSite Cookie است، نه فقط بررسی Referer. مرجع کامل: راهنمای جلوگیری از CSRF در ASP.NET Core، Microsoft Learn.
