راهنمای رفع خطای csrf در جنگو
در پروژههای جنگو راهاندازی شده بر روی هاستهای پایتون پارس وب سرور ممکن است با خطای csrf token مواجه شوید که در ادامه این مطلب آموزشی، کمی بیشتر با این خطا آشنا شده و روش رفع آن را بررسی میکنیم.
با این آموزش از سری آموزش های تخصصی پارس وب سرور همراه باشید.
خطای csrf token missing or incorrect را ممکن است در صفحات فرم تماس با ما و یا صفحات ورود و فرمهای پروژه جنگو مشاهده کنید.
کلمه csrf مخفف کلمات عبارت Cross Site Request Forgery است.
این اصطلاح در حقیقت به حفظ امنیت فرم و اطلاعات ارسالی کاربر به وبسایت اشاره دارد و توسط این امکان، خطر جعل درخواست میانوبگاهی توسط هکرها از بین میرود.
درخواستهایی با متدهای POST, PUT, DELETE,GET که در فرمها وجود دارند و ارسال میشوند، توسط این روش محافظت میشوند.
در صورت عدم فعال بودن تگ csrf در جنگو، یک فرد مهاجم میتواند با استفاده از اطلاعات وارد شده کاربر، اسکریپتی را از روی سیستم شخص اجرا کند و به عنوان کاربر اصلی دست به اقداماتی بزند و یا اینکه درخواستهایی که به سمت وبسایت مقصد ارسال میشود را دستکاری کند.
به عنوان مثال در تصویر پایین، به دلیل پایین بودن امنیت وبسایت بانک، شخص مهاجم میتواند با در دست گرفتن سیستم کاربر درخواستهایی را برای بانک ارسال کند.
خطای csrf توکن در جنگو
در صورتی که دباگ (Debug) جنگو فعال باشد و مقدار آن در فایل setting.py پروژه برابر با True باشد،
در صفحهای که فرم در آن وجود دارد و از csrf توکن استفاده نشده باشد، تصویری مشابه تصویر زیر نمایش داده میشود.
دقیقا در تصویر نمایش داده شده، دلیل این خطا و راهکارهایی برای رفع این خطا ارائه شده است.
Forbidden (403)
CSRF verification failed. Request aborted. Help
Reason given for failure:
CSRF token missing or incorrect.
متن خطا اشاره میکند که csrf توکن یا وجود ندارد و یا مقدار آن درست نیست و نامعتبر است.
این خطا زمانی اتفاق میافتد که یا csrf توکن برای متد پست در فرم وجود نداشته باشد و یا اینکه اطلاعات توکن اشتباه باشد.
هر توکن دارای طول عمر و تاریخ انقضای مشخصی است و بعد از آن غیرفعال میشود و نیاز به ایجاد مجدد توکن وجود دارد.
البته اگر فرم برای مدت زیادی در مرورگر کاربر باز باشد، ممکن است که این خطا نمایش داده شود و با رفرش صفحه و ارسال مجدد اطلاعات خطا رفع خواهد شد.
csrf token جنگو به صورت پیش فرض در قسمت MIDDLEWARE فایل setting.py پروژه قرار دارد.
django.middleware.csrf.CsrfViewMiddleware
رفع خطای csrf در فرم جنگو
برای اضافه کردن csrf token به فرم باید تگ زیر را در تگ فرم <form> مورد نظر قرار دهیم.
{% csrf_token %}
تگ باید در داخل تگ فرم (form) به صورت زیر، به عنوان نمونه، استفاده شده باشد.
<form method="post">
{% csrf_token %}
<form action="/your-name/" method="post">
<label for="your_name">Your name: </label>
<input id="your_name" type="text" name="your_name" value="{{ current_name }}">
<button type="submit">Submit</button>
</form>
وقتی این کد در داخل تگ form قرار گرفت یک فیلد input مخفی با نام csrfmiddlewaretoken ایجاد میشود.
<input type="hidden" name="csrfmiddlewaretoken" value="Xa3VUNr1GiA3MoOJZ57lWRCoHFU7sbA7bd2eU9WURRimHVCNbILK7EoqdlO6nlDs">
همزمان یک کوکی در مرورگر با نام دامنه و به نام csrftoken ذخیره میشود. این دو مقدار با همدیگر تطابق دارند و بعد از مقایسه و مطابق بودن (match) فرم ارسال میشود.
برخی از تنظیمات مربوط به csrf به شرح زیر است:
CSRF_COOKIE_AGE
CSRF_COOKIE_DOMAIN
CSRF_COOKIE_HTTPONLY
CSRF_COOKIE_NAME
CSRF_COOKIE_PATH
CSRF_COOKIE_SAMESITE
CSRF_COOKIE_SECURE
CSRF_FAILURE_VIEW
CSRF_HEADER_NAME
CSRF_TRUSTED_ORIGINS
CSRF_USE_SESSIONS
خطای Error: CSRF Failed: Referer checking failed
اگر بکاند و فرانتاند جنگو دارای دو آدرس متفاوت باشند به این صورت که بکاند روی سابدامنه اجرا شده باشد و فرانتاند روی دامنه و یا سابدامنه دیگر، این خطا نمایش داده میشود.
Error: CSRF Failed: Referer checking failed - https://front.yourdomain.com does not match any trusted origins.
برای جنگو ورژن 4.0 و بالاتر باید scheme و نام هاست به صورت زیر در فایل settings.py اضافه شود.
CSRF_TRUSTED_ORIGINS = ['https://sub.yourdomain.com']
برای ورژن 3.2 و پایین تر نام دامنه و یا سابدامنه بدون scheme باید در فایل settings.py وارد شود.
CSRF_TRUSTED_ORIGINS = ['sub.yourdomain.com']
* به جای sub.yourdomain.com
باید نام دامنه و یا سابدامنه را وارد کنید.
* منظور از scheme وضعیت http یا https بودن دامنه است.
نام دامنه و یا سابدامنه باید در قسمت ALLOWED_HOSTS هم باید اضافه شود.
برای اطلاعات بیشتر میتوانید مستندات جنگو در مورد خطای Referer checking failed را مشاهده بفرمایید.
برای اطلاعات بیشتر در این مورد میتوانید csrf در مستندات جنگو را مشاهده کنید
ساخت صفحه خطای سفارشی برای csrf در جنگو
برای اینکه یک صفحه شخصیسازی شده برای این خطا در پروژه جنگوی خود داشته باشیم، ابتدا این کد را به انتهای کدهای فایل settings.py پروژه اضافه می کنیم:
CSRF_FAILURE_VIEW = "myapp_name.views.csrf_failure"
* به جای myapp_name نام main app خود را وارد می کنید.
و در فایل views
اپ اصلی کلاس csrf_failure
را ایجاد می کنیم.
from django.shortcuts import render
...
def csrf_failure(request, reason=""):
return render(
request,
"403_csrf.html",
{"reason": reason},
status=403,
)
یک فایل با نام 403_csrf.html
در فولدر تمپلت اپ میسازیم و کدهای زیر را به آن اضافه می کنیم.
{% extends "base.html" %}
{% block title %}403 Forbidden{% endblock %}
{% block content %}
403 Forbidden
<p> {{ reason }}</p>
<p><a href="{% url 'login' %}"> Login</a> </p>
{% endblock %}
در این پست آموزشی پارس وب سرور هم به سایر پر تکرار ترین خطاهایی جنگو اشاره کردیم که برای رفع خطاهای جنگو می تواند مفید باشد.
راهنمای رفع خطاهای رایج در پروژههای جنگو
در صورتی که با استفاده از آموزش بالا مشکل رفع نشد و یا اینکه سوال و یا ابهامیدر این مورد وجود دارد میتوانید در پنل کاربری خود، درخواست پشتیبانی ارسال بفرمایید. (ارسال تیکت)