حل خطای CSRF در Django معمولا به تنظیمات فرم‌ها، ارسال Token و نحوه مدیریت Session مربوط می‌شود. وقتی این خطا رخ می‌دهد، Django درخواست کاربر را ناامن تشخیص می‌دهد و اجازه انجام عملیات را نمی‌دهد. این مشکل یکی از رایج‌ترین خطاهای پروژه‌های Django است و بیشتر هنگام کار با فرم‌ها، API ها یا درخواست های Ajax دیده می‌شود.

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"
]

باید تنظیم شود.

استفاده از ensure_csrf_cookie

گاهی لازم است 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 خیلی سریع قابل حل هستند.