آنچه در این مقاله میخوانید [پنهانسازی]
حل خطای CSRF در Django معمولا به تنظیمات فرمها، ارسال Token و نحوه مدیریت Session مربوط میشود. وقتی این خطا رخ میدهد، Django درخواست کاربر را ناامن تشخیص میدهد و اجازه انجام عملیات را نمیدهد. این مشکل یکی از رایجترین خطاهای پروژههای Django است و بیشتر هنگام کار با فرمها، API ها یا درخواست های Ajax دیده میشود.
سرفصل های مقاله
- CSRF در Django چیست؟
- CSRF Token چگونه کار میکند؟
- رایجترین خطای CSRF در Django
- چرا خطای CSRF در Django رخ میدهد؟
- فراموش کردن csrf_token داخل فرم
- استفاده از POST بدون Token
- مشکل در Ajax Request ها
- غیرفعال بودن Cookie ها
- مشکل در Domain یا Subdomain
- تنظیم نبودن CSRF_TRUSTED_ORIGINS
- مشکل در Session
- خطای CSRF در API های Django
- روش حل خطای CSRF در Django
- اضافه کردن csrf_token به فرم
- ارسال Token در Ajax
- بررسی Cookie ها
- تنظیم CSRF_TRUSTED_ORIGINS
- استفاده از ensure_csrf_cookie
- غیرفعال کردن CSRF در بعضی View ها
- اشتباهات رایج برنامه نویسان Django
- حذف کامل CSRF Protection
- استفاده اشتباه از csrf_exempt
- فراموش کردن Token در فرمها
- اشتباه در تنظیمات Frontend و Backend
- روش جلوگیری از خطای CSRF در Django
- همیشه از csrf_token استفاده کنید
- تنظیمات امنیتی را بررسی کنید
- API ها را اصولی طراحی کنید
- از HTTPS استفاده کنید
- جمع بندی
CSRF در Django چیست؟
CSRF مخفف Cross Site Request Forgery است.
این حمله زمانی اتفاق میافتد که کاربر وارد سایت شده اما یک سایت مخرب بدون اجازه او درخواست جعلی به سرور ارسال کند.
مثلا:
- تغییر رمز عبور
- ثبت سفارش
- حذف اطلاعات
بدون اطلاع کاربر انجام شود.
Django برای جلوگیری از این مشکل از CSRF Token استفاده میکند.
CSRF Token چگونه کار میکند؟
Django داخل فرم ها یک Token امنیتی قرار میدهد.
مثلا:
<form method="POST">
{% csrf_token %}
</form>
وقتی فرم ارسال میشود، Django بررسی میکند:
- آیا Token معتبر است؟
- آیا درخواست از سایت اصلی آمده؟
اگر Token وجود نداشته باشد، درخواست رد میشود.
رایجترین خطای CSRF در Django
معمولا این خطا به این شکل نمایش داده میشود:
403 Forbidden
CSRF verification failed
یعنی Django درخواست را ناامن تشخیص داده است.
چرا خطای CSRF در Django رخ میدهد؟
دلایل مختلفی وجود دارد اما چند مورد از بقیه رایجتر هستند.
فراموش کردن csrf_token داخل فرم
این رایج ترین دلیل خطاست.
مثلا:
<form method="POST">
<input type="text">
</form>
اینجا csrf_token وجود ندارد.
روش درست:
<form method="POST">
{% csrf_token %}
<input type="text">
</form>
استفاده از POST بدون Token
هر درخواست POST در Django باید CSRF Token داشته باشد.
مثلا در Ajax:
fetch('/api/data', {
method: 'POST'
})
اگر Token ارسال نشود، خطای CSRF رخ می دهد.
مشکل در Ajax Request ها
در درخواست های Ajax باید Token دستی ارسال شود.
مثلا:
fetch('/api/data', {
method: 'POST',
headers: {
'X-CSRFToken': csrfToken
}
})
اگر Header ارسال نشود، Django درخواست را Rejectمی کند.
غیرفعال بودن Cookie ها
CSRF Token معمولا داخل Cookie ذخیره میشود.
اگر:
- Cookie غیرفعال باشد
- مرورگر Cookie را Block کند
خطای CSRF اتفاق میافتد.
مشکل در Domain یا Subdomain
گاهی پروژه روی:
- دامنه اصلی
- Subdomain
- Port متفاوت
اجرا می شود.
در این حالت ممکن است Token معتبر تشخیص داده نشود.
تنظیم نبودن CSRF_TRUSTED_ORIGINS
در Django جدید اگر Domain درست تعریف نشده باشد، خطای CSRF رخ میدهد.
مثلا:
CSRF_TRUSTED_ORIGINS = [
"https://example.com"
]
اگر Domain داخل این لیست نباشد، درخواست رد میشود.
مشکل در Session
بعضی وقت ها Session خراب یا منقضی میشود.
در نتیجه:
- Token معتبر نیست
- Django درخواست را Reject میکند
خطای CSRF در API های Django
وقتی از:
- React
- Vue
- Next.js
استفاده میشود، این مشکل بیشتر دیده میشود.
چون Frontend و Backend جدا هستند.
در این حالت باید:
- Token ارسال شود
- Cookie مدیریت شود
- CORS تنظیم شود
روش حل خطای CSRF در Django
اضافه کردن csrf_token به فرم
برای فرمهای HTML:
{% csrf_token %}
باید داخل form قرار بگیرد.
ارسال Token در Ajax
مثلا:
headers: {
'X-CSRFToken': csrfToken
}
این Header ضروری است.
بررسی Cookie ها
داخل مرورگر بررسی کنید:
- Cookie فعال باشد
- Token ذخیره شده باشد
تنظیم CSRF_TRUSTED_ORIGINS
اگر پروژه روی Domain جدا اجرا میشود:
CSRF_TRUSTED_ORIGINS = [
"https://frontend.example.com"
]
باید تنظیم شود.
گاهی لازم است Token حتما ساخته شود:
from django.views.decorators.csrf import ensure_csrf_cookie
این Decorator کمک می کند Cookie ساخته شود.
غیرفعال کردن CSRF در بعضی View ها
گاهی در API خاص نیاز است CSRF غیرفعال شود.
مثلا:
from django.views.decorators.csrf import csrf_exempt
و:
@csrf_exempt
def my_view(request):
اما این کار خطر امنیتی دارد و نباید بدون دلیل استفاده شود.
اشتباهات رایج برنامه نویسان Django
حذف کامل CSRF Protection
بعضی افراد برای حل سریع مشکل CSRF را غیرفعال میکنند.
این کار پروژه را در برابر حملات آسیب پذیر میکند.
استفاده اشتباه از csrf_exempt
نباید همه API ها بدون CSRF باشند.
فقط در شرایط خاص باید استفاده شود.
فراموش کردن Token در فرمها
این یکی از رایجترین اشتباهات پروژه های Django است.
اشتباه در تنظیمات Frontend و Backend
وقتی Frontend جدا باشد:
- Cookie
- CORS
- CSRF
باید دقیق تنظیم شوند.
روش جلوگیری از خطای CSRF در Django
همیشه از csrf_token استفاده کنید
هر فرم POST باید Token داشته باشد.
تنظیمات امنیتی را بررسی کنید
بخصوص:
- CSRF_TRUSTED_ORIGINS
- SESSION_COOKIE_SECURE
- CSRF_COOKIE_SECURE
API ها را اصولی طراحی کنید
اگر Frontend جداست:
- Authentication
- Cookie
- Token
باید درست مدیریت شوند.
از HTTPS استفاده کنید
بعضی مشکلات CSRF در HTTP بیشتر دیده میشوند.
HTTPS امنیت پروژه را بهتر میکند.
جمع بندی
حل خطای CSRF در Django بیشتر به مدیریت درست Token ها، فرمها و درخواستهای POST مربوط میشود. این خطا معمولا زمانی رخ میدهد که Django درخواست را ناامن تشخیص دهد. اگر csrf_token، Cookie ها و تنظیمات امنیتی پروژه درست مدیریت شوند، بیشتر مشکلات CSRF خیلی سریع قابل حل هستند.





