CSRF مخفف Cross-Site Request Forgery به معنی جعل درخواست بینسایتی است. مهاجم تلاش میکند مرورگر کاربر واردشده را به ارسال درخواست ناخواستهای به سایت معتبر وادار کند. مرورگر ممکن است کوکی نشست را به شکل خودکار همراه درخواست بفرستد.
آیا CSRF فقط در HTML رخ میدهد؟
خیر. فرم HTML یکی از مسیرهای رایج است، ولی درخواستهای Fetch و APIهای مبتنی بر کوکی نیز ممکن است تحت شرایط خاص آسیبپذیر باشند. مشکل به اعتماد سمت سرور به درخواست ناخواسته مربوط است، نه صرفاً وجود تگ فرم.
نمونه فرم آسیبپذیر
<!-- Educational example: no CSRF token -->
<form method="POST" action="/profile/email">
<input name="email" type="email">
<button type="submit">Save</button>
</form>
اگر سرور تنها به کوکی ورود اتکا کند و اصل درخواست را بررسی نکند، ممکن است درخواست ارسالشده از یک صفحه ناخواسته را هم بپذیرد. خودِ نبود توکن در HTML به تنهایی اثبات آسیبپذیری نیست، چون بعضی معماریها روشهای حفاظتی دیگری دارند.
نمونه ایمن در لاراول و جنگو
// Laravel Blade template
<form method="POST" action="/profile/email">
@csrf
<input name="email" type="email">
<button type="submit">Save</button>
</form>
<form method="post">
{% csrf_token %}
<input name="email" type="email">
<button>Save</button>
</form>
راهکارهای دفاعی
- اعتبارسنجی CSRF Token روی سرور و فعال بودن Middleware مناسب
- SameSite Cookie با سیاست مناسب و بررسی Origin در سناریوهای مرتبط
- عدم تغییر وضعیت برنامه در درخواست GET
- بررسی دوباره هویت برای عملیات پرخطر و پرهیز از اتکا به CORS به تنهایی
نکته فنی
کدی که توکن CSRF را داخل پاسخ نمایش میدهد، باید با نشست یا سازوکار معتبر سمت سرور مرتبط باشد. HTTPS بهتنهایی CSRF را برطرف نمیکند.
اصطلاحات مرتبط: توکن ضد CSRF، میدلور، احراز هویت، اسکریپتنویسی بینسایتی، اشتراکگذاری منابع میان مبداها، متدهای HTTP.